[原创] lpc54114双核通信--互斥

star_66666   2018-4-19 16:35 楼主
本帖主要实现非中断情况下的互斥通信。
在前一帖子代码的基础上稍加更改,在M4核和M0+核的代码基础上增加如下代码即可,
在M4核中更改的代码有

/* Init Mailbox */
    MAILBOX_Init(MAILBOX);

    /* Boot source for Core 1 from flash */
    SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)CORE1_BOOT_ADDRESS + 0x4));
    SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)CORE1_BOOT_ADDRESS);

    int32_t temp = SYSCON->CPCTRL;
    temp |= 0xc0c48000;
    SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0RSTEN_MASK);
    SYSCON->CPCTRL = (temp);
    delay();
    MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, (uint32_t)&g_msg);
while (1)
    {
        /* Stop secondary core execution. */
        if (!GPIO_ReadPinInput(BOARD_SW1_GPIO, BOARD_SW1_GPIO_PORT, BOARD_SW1_GPIO_PIN))
        {
            MCMGR_StopCore(kMCMGR_Core1);   
                                          PRINTF("Stopped Secondary core.\n");
            delay();
        }
        /* Start core from reset vector */
        if (!GPIO_ReadPinInput(BOARD_SW2_GPIO, BOARD_SW2_GPIO_PORT, BOARD_SW2_GPIO_PIN))
        {
                                          PRINTF("Started Secondary core.\n");
            MCMGR_StartCore(kMCMGR_Core1, CORE1_BOOT_ADDRESS, 5, kMCMGR_Start_Synchronous);
            delay();
        }
                                PRINTF("M4 receive:%d\r\n",M0_TO_M4_R);
                                delay();
                                M4_TO_M0_T++;
        /* Get Mailbox mutex */
        while (MAILBOX_GetMutex(MAILBOX) == 0)
            ;


        /* The core0 has mutex, can change shared variable _XiaoMaGe */
        g_msg++;


        PRINTF("M4 : mailbox mutex,the data is: %d\n", g_msg);


        /* Set mutex to allow access other core to shared variable */
        MAILBOX_SetMutex(MAILBOX);
    }
在M0+内核更改的代码
/* Init Mailbox */
    MAILBOX_Init(MAILBOX);
    while (1)
    {
        delay();
                          M0_TO_M4_T++;
                          PRINTF("M0receive:%d\r\n",M4_TO_M0_R);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 15u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 19u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 21u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 22u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 25u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 26u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 29u);
                          GPIO_TogglePinsOutput(GPIO, 0u, 1u << 30u);
       /* Get Mailbox mutex */
        while (MAILBOX_GetMutex(MAILBOX) == 0)
            ;
        g_msg = (uint32_t *)MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
        /* The core1 has mutex, can change shared variable _XiaoMaGe */
        if (g_msg != NULL)
        {
            (*g_msg)++;
            PRINTF("M0 : mailbox mutex,the data is :%d\n", *g_msg);
        }

        /* Set mutex to allow access other core to shared variable */
        MAILBOX_SetMutex(MAILBOX);
    }
编译下载,串口助手观察通信见下图


发现通信正常,是按照设计的要求进行的

回复评论 (4)

无线LORA资料可进综科智控下载
点赞  2018-4-20 14:16
哦哦,是吗?
点赞  2018-4-20 14:28
一直听说这个LPC54系列是双内核的,只是听说,没有见过到底啥样子。现在总算见识到了
点赞  2018-4-20 16:26
是的哦,,
点赞  2018-4-20 16:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复