查看: 3565|回复: 0

[原创] 【LPC54114双核任务二】双核分工合作完成数值运算

[复制链接]
  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2017-7-2 23:13:50 | 显示全部楼层 |阅读模式
    每次是都快到点了才交任务,实在不好意思。
    今天我的实验就是让双核互相配合来完成一个计算任务。在任务一里,我们知道两个核心分工协作,M4侧重于运算,M0侧重于IO控制。今天我们就根据这个来完成一个简单的运算任务。
    M0来进行输出输出的控制(M0内核通过UART输出一个提示,提示用户输出一个数值,然后把数据值给M4内核)
    M4内核取得M0内核传过来的数值做一个简单的乘法(乘23)来模拟数据运算。(本来我是打算写一个表达式解析器,就是M0传过来的是一个表达式,比如:23*45+32-190/3 ,用M4内核来解析出表达式并计算出结果。可是没时间来,就用简单的乘法模拟),M4计算完成后通知M0,M0收到计算结果,并输出来。
    基本上就这样子,我们基于SDK里的multicore_examples的hello world来修改,废话不多说直接用代码来解释:
    M4工程的代码:
    1. #include "fsl_gpio.h"
    2. #include "board.h"
    3. #include "mcmgr.h"

    4. #include "fsl_common.h"
    5. #include "pin_mux.h"
    6. #include "fsl_mailbox.h"
    7. #include "stdlib.h"
    8. /*******************************************************************************
    9. * Definitions
    10. ******************************************************************************/
    11. /* Address of RAM, where the image for core1 should be copied */
    12. #define CORE1_BOOT_ADDRESS (void *)0x20010000

    13. #if defined(__CC_ARM)
    14. extern uint32_t Image$CORE1_REGION$Base;
    15. extern uint32_t Image$CORE1_REGION$Length;
    16. #define CORE1_IMAGE_START &Image$CORE1_REGION$Base
    17. #elif defined(__ICCARM__)
    18. extern unsigned char core1_image_start[];
    19. #define CORE1_IMAGE_START core1_image_start
    20. #endif

    21. /*******************************************************************************
    22. * Prototypes
    23. ******************************************************************************/

    24. #ifdef CORE1_IMAGE_COPY_TO_RAM
    25. uint32_t get_core1_image_size(void);
    26. #endif

    27. /*******************************************************************************
    28. * Code
    29. ******************************************************************************/

    30. #ifdef CORE1_IMAGE_COPY_TO_RAM
    31. uint32_t get_core1_image_size()
    32. {
    33.     uint32_t core1_image_size;
    34. #if defined(__CC_ARM)
    35.     core1_image_size = (uint32_t)&Image$CORE1_REGION$Length;
    36. #elif defined(__ICCARM__)
    37. #pragma section = "__sec_core"
    38.     core1_image_size = (uint32_t)__section_end("__sec_core") - (uint32_t)&core1_image_start;
    39. #endif
    40.     return core1_image_size;
    41. }
    42. #endif
    43. /*!
    44. * @brief Main function
    45. */
    46. int main(void)
    47. {
    48.     /* Define the init structure for the switches*/
    49.     gpio_pin_config_t sw_config = {kGPIO_DigitalInput, 0};

    50.     /* Init board hardware.*/
    51.     /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    52.     CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);

    53.     BOARD_InitPins_Core0();
    54.     BOARD_BootClockFROHF48M();


    55. #ifdef CORE1_IMAGE_COPY_TO_RAM
    56.     /* Calculate size of the image  - not required on LPCExpresso. LPCExpresso copies image to RAM during startup
    57.      * automatically */
    58.     uint32_t core1_image_size;
    59.     core1_image_size = get_core1_image_size();

    60.     /* Copy Secondary core application from FLASH to RAM. Primary core code is executed from FLASH, Secondary from RAM
    61.      * for maximal effectivity.*/
    62.     memcpy(CORE1_BOOT_ADDRESS, (void *)CORE1_IMAGE_START, core1_image_size);
    63. #endif

    64.     /* Initialize MCMGR before calling its API */
    65.     MCMGR_Init();

    66.     /* Boot Secondary core application */
    67.     MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 1, kMCMGR_Start_Synchronous);

    68.                
    69.                 MAILBOX_Init(MAILBOX);

    70.     NVIC_EnableIRQ(MAILBOX_IRQn);

    71.     while (1)
    72.     {
    73.                         __WFI;
    74.     }
    75. }


    76. void MAILBOX_IRQHandler(void)
    77. {
    78.     /* 收到m0传过的用户输值  */
    79.     char* buf = (char*)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);

    80.     /* Clear my mailbox */
    81.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xFFFFFFFF);
    82.                 //计算结果
    83.                 int32_t psharedLEDStates = atoi(buf) * 23;
    84.                 //通知M0
    85.                 MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, psharedLEDStates);
    86. }
    复制代码

    M0工程的代码:
    1. #include "fsl_debug_console.h"
    2. #include "board.h"
    3. #include "mcmgr.h"

    4. #include "fsl_common.h"
    5. #include "pin_mux.h"
    6. #include "fsl_gpio.h"
    7. #include "fsl_mailbox.h"
    8. /*******************************************************************************
    9. * Definitions
    10. ******************************************************************************/
    11. #define LED_INIT() GPIO_PinInit(GPIO, BOARD_LED_RED_GPIO_PORT, BOARD_LED_RED_GPIO_PIN, &led_config);
    12. #define LED_TOGGLE() GPIO_TogglePinsOutput(GPIO, BOARD_LED_RED_GPIO_PORT, 1u << BOARD_LED_RED_GPIO_PIN);

    13. /*******************************************************************************
    14. * Prototypes
    15. ******************************************************************************/

    16. /*******************************************************************************
    17. * Code
    18. ******************************************************************************/

    19. /*!
    20. * @brief Function to create delay for Led blink.
    21. */
    22. void delay(void)
    23. {
    24.     volatile uint32_t i = 0;
    25.     for (i = 0; i < 1000000; ++i)
    26.     {
    27.         __asm("NOP"); /* delay */
    28.     }
    29. }

    30. volatile char buf[32];

    31. /*!
    32. * @brief Main function
    33. */
    34. int main(void)
    35. {
    36.     uint32_t startupData, i;

    37.     /* Define the init structure for the output LED pin*/
    38.     gpio_pin_config_t led_config = {
    39.         kGPIO_DigitalOutput, 0,
    40.     };

    41.     /* Initialize MCMGR before calling its API */
    42.     MCMGR_Init();

    43.     /* Get the startup data */
    44.     MCMGR_GetStartupData(kMCMGR_Core1, &startupData);

    45.     /* Make a noticable delay after the reset */
    46.     /* Use startup parameter from the master core... */
    47.     for (i = 0; i < startupData; i++)
    48.         delay();

    49.     /* Init board hardware.*/
    50.     /* enable clock for GPIO */
    51.     CLOCK_EnableClock(kCLOCK_Gpio0);
    52.     CLOCK_EnableClock(kCLOCK_Gpio1);
    53.     BOARD_InitPins_Core1();
    54.     BOARD_BootClockFROHF48M();
    55.     BOARD_InitDebugConsole();

    56.     MAILBOX_Init(MAILBOX);

    57.     NVIC_EnableIRQ(MAILBOX_IRQn);

    58.     /* Configure LED */
    59.     LED_INIT();

    60.     /* Signal the other core we are ready */
    61.     MCMGR_SignalReady(kMCMGR_Core1);

    62.     while (1)
    63.     {
    64.         delay();

    65.         LED_TOGGLE();
    66.         PRINTF("M0 say:Please input the number:\n");
    67.         uint32_t i = 0;
    68.         while(1)
    69.         {
    70.                                                 //获取用户输入 .表示输入结果符
    71.             char ch = DbgConsole_Getchar();
    72.             if(ch == '.')
    73.             {
    74.                 buf[i] = 0x0;
    75.                 break;
    76.             }
    77.             buf[i] = ch;
    78.             i++;
    79.         }
    80.                                 //通知M4 用户输出结束,可以进行运算了
    81.         MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, (uint32_t)&buf);

    82.     }
    83. }

    84. void MAILBOX_IRQHandler(void)
    85. {
    86.     /* 取M4计算好的值 */
    87.     int32_t result = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);

    88.     /* Clear my mailbox */
    89.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xFFFFFFFF);
    90.     //输出M4的计算结果
    91.     PRINTF("M4 calculation(%s * 23) results are:%d\n\n", buf, result);
    92. }

    复制代码
    实验结果 : QQ截图20170702231305.png
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-31 06:55 , Processed in 0.099900 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表