查看: 9532|回复: 11

[原创] 【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#

[复制链接]
  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9321
    最后登录
    2022-5-12
    发表于 2017-6-28 21:51:50 | 显示全部楼层 |阅读模式
    本帖最后由 小马哥-1650185 于 2017-7-2 11:32 编辑

          这个帖子主要讲解下 双核mailbox通信,采用中断模式

          实现功能:M4核上电后 给m0 通过mailbox  发送 一个数据,同时触发中断 MAILBOX IRQ,m0收到数据后进入接受中断,并把这个数据++返回给m4,同样m4收到后进入接受中断,数据++再发给m0,一直发下去。。。。

    先看下 串口打印的数据吧

    1.png


    这里主要用到了"fsl_mailbox.h"中的一些函数
    1. void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData);
    复制代码
    解释:Set (non-zero) value “mboxData” to CPU “cpu_id”, as well as trigger its MAILBOXIRQ
    cpu_id” 这个核心发送非零数据mboxData” ,并触发 MAILBOX IRQ


    1. uint32_t MAILBOX_GetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id);
    复制代码
    解释:Get mailbox value of CPU “cpu_id”.
    读取cpu_id”核的邮箱传送的数据


    1. void MAILBOX_ClearValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxClrBits);
    复制代码
    解释:Clear mailbox value bits of CPU “cpu_id” masked by “mboxClrBits”, uses 0xFFFFFFFF to clear allbits.
    清除标志位,写0xFFFFFFFF 全清

    程序初始化要加上这2句话
    1.     /* Init Mailbox */
    2.     MAILBOX_Init(MAILBOX);

    3.     /* Enable mailbox interrupt */
    4.     NVIC_EnableIRQ(MAILBOX_IRQn);
    复制代码
    接着就要在相应的中断函数里面实现上述功能了
    M4:
    1. void MAILBOX_IRQHandler()
    2. {
    3.     g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM4);
    4.                 PRINTF("СÂí¸ç:Read value from CM4 mailbox register: %d\n", g_msg);
    5.     g_msg++;
    6.     PRINTF("СÂí¸ç:Write to CM0+ mailbox register: %d\n", g_msg);
    7.     MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
    8.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM4, 0xffffffff);
    9. }
    复制代码


    M0:
    1. void MAILBOX_IRQHandler()
    2. {
    3.     g_msg = MAILBOX_GetValue(MAILBOX, kMAILBOX_CM0Plus);
    4.     g_msg++;
    5.     MAILBOX_SetValue(MAILBOX, kMAILBOX_CM4, g_msg);
    6.     MAILBOX_ClearValueBits(MAILBOX, kMAILBOX_CM0Plus, 0xffffffff);
    7. }
    复制代码

    然后参看文档中的配置下 双核的启动顺序和控制
    22.png
    设置下这几个寄存器
    SYSCON->CPBOOT ,SYSCON->CPSTACK,SYSCON->CPCTRLSYSCON->CPSATA关于这几个寄存器的详细说明,5楼有个热心同学帮忙讲解到了,在此谢谢5楼这位童鞋
    程序配置如下
    1. /* Boot source for Core 1 from flash */
    2.     SYSCON->CPBOOT = SYSCON_CPBOOT_BOOTADDR(*(uint32_t *)((uint8_t *)CORE1_BOOT_ADDRESS + 0x4));
    3.     SYSCON->CPSTACK = SYSCON_CPSTACK_STACKADDR(*(uint32_t *)CORE1_BOOT_ADDRESS);

    4.     int32_t temp = SYSCON->CPCTRL;
    5.     temp |= 0xc0c48000;
    6.     SYSCON->CPCTRL = (temp | SYSCON_CPCTRL_CM0RSTEN_MASK);
    7.     SYSCON->CPCTRL = (temp);
    复制代码



    然后,M4发送给m0一条邮箱指令,触发中断
    1. MAILBOX_SetValue(MAILBOX, kMAILBOX_CM0Plus, g_msg);
    复制代码

    这样双核的程序就会一直在邮箱中断中收发数据了



    -----------------------小马哥系列【LPC54114双核任务二】传送门--------------------
    【LPC54114双核任务二】双核之从零开始--#KEIL工程建立配置#
    【LPC54114双核任务二】双核之从零开始--#HelloWorld双核调试#

    【LPC54114双核任务二】双核之从零开始--#MDK生成BIN#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信1之中断#


    【LPC54114双核任务二】双核之从零开始--#mailbox通信2之mutex#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信3之按键#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信4之PC_M4_M0#

    【LPC54114双核任务二】双核之从零开始--#mailbox通信5之PC_M0_M4#



    【LPC54114双核任务二】双核之从零开始--#mailbox通信6之WIFI_M4_M0#


    【LPC54114双核任务二】已完结,小马哥出品,谢谢大家支持。。。。

    -----------------------小马哥系列【LPC54114双核任务二】传送门--------------------







    好好
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-12-30 18:56
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    68

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    222
    最后登录
    2018-6-5
    发表于 2017-6-29 14:25:21 | 显示全部楼层
    本帖最后由 打火机打不着 于 2017-6-29 14:36 编辑

    222.jpg
    这里说的很清楚了,截图翻译任务的,翻译未勘误,看懂就行了

    不知道我和楼主理解的一样不,

    个人认为(补充楼主的):
    SYSCON:是系统配置寄存器。System configuration

    这几个寄存器 是 和双核相关的。
    These registers control usage aspects of the two CPUs in selected devices. They are not used in other devices that only provide a single CPU








    SYSCON->CPBOOT :Coprocessor Boot register   从核m0启动寄存器,用来设置从核启动地址的


    CPBOOT can be used in an application that uses both CPUs in order to send the slave
    processor (the CPU not selected as the master by the MASTERCPU bit in the CPUCTRL
    register) to an appropriate boot address that is different than the master CPU.
    5555.jpg


    SYSCON->CPSTACK:Coprocessor Stack register    从核栈寄存器,设置从核栈地址



    CPSTACK can be used in an application that uses both CPUs in order to set up the stack
    for the slave processor (the CPU not selected as the master by the MASTERCPU bit in
    the CPUCTRL register) to an appropriate address that is different than the master CPU.

    6666.jpg

    SYSCON->CPSTAT:Coprocessor Status register 双 核状态寄存器  ,







    1. CPU_STAT provides some status for dual CPUs. This register can be read by software at
    2. run time, or with a debugger.
    复制代码
    8888888888.jpg



    SYSCON->CPCTRL:CPU Control register     内核控制寄存器






    The CPUCTRL register provides control for the 2 CPUs. Note that the Cortex-M4 is
    factory set to be the master. The master CPU cannot be reset or have its clock disabled
    via this register. Only the master CPU can use the Power APIs to cause the device to
    enter reduced power modes.
    If the clock to the slave CPU is to be disabled at some point in the application for power
    savings, that CPU should have entered its own sleep mode prior to that point. This avoids
    incomplete operations in the slave CPU.
    看下寄存器就很明了了吧
    333.jpg






    该会员没有填写今日想说内容.
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9321
    最后登录
    2022-5-12
     楼主| 发表于 2017-6-29 10:29:16 | 显示全部楼层

    加油               
    好好
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-6-29 08:39:55 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-7-3 23:04
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    87

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    284
    最后登录
    2018-7-3
    发表于 2017-6-29 10:37:55 | 显示全部楼层
    SYSCON->CPBOOT ,SYSCON->CPSTACK,SYSCON->CPCTRL

    求解释
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9321
    最后登录
    2022-5-12
     楼主| 发表于 2017-6-29 14:44:21 | 显示全部楼层
    打火机打不着 发表于 2017-6-29 14:25
    这里说的很清楚了,截图翻译任务的,翻译未勘误,看懂就行了

    不知道我和楼主理解的一样不,

    谢谢补充,研究的很精细,学习了
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9321
    最后登录
    2022-5-12
     楼主| 发表于 2017-6-29 14:50:38 | 显示全部楼层
    fscl_MQX 发表于 2017-6-29 10:37
    SYSCON->CPBOOT ,SYSCON->CPSTACK,SYSCON->CPCTRL

    求解释

    参考5楼 的讲解
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-7-9 20:44
  • 签到天数: 42 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    74

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    240
    最后登录
    2018-7-9
    发表于 2017-6-29 20:03:07 | 显示全部楼层
    支持支持
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    22

    主题

    817

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1713
    最后登录
    2019-12-7
    发表于 2018-4-27 13:52:31 | 显示全部楼层
    看楼主的帖子学习很多,但有点小问题想请教下楼主。
    看楼主前面的帖子还可以,跟着做成功,这个帖子就不知道怎么弄了,没有那么详细了,中断函数放在哪个位置,
    /* 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);
    这段代码放在哪儿,还在下面的M4发送给m0一条邮箱指令,触发中断,函数放在哪儿,做为新手的我也不知道,
    楼主能否详细下,或都把代码工程也上传,这样方便新手可以对比着做,使用楼主的代码也可以看下自己哪儿弄错了。
    作为新手,不知道说的对也不对。请海涵。谢谢!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9321
    最后登录
    2022-5-12
     楼主| 发表于 2018-4-27 16:19:00 | 显示全部楼层
    haifeng-388081 发表于 2018-4-27 13:52
    看楼主的帖子学习很多,但有点小问题想请教下楼主。
    看楼主前面的帖子还可以,跟着做成功,这个帖子就不知 ...


    好像是这个地方,去年调试的,都忘了哦


    QQ图片20180427161815.png
    好好
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-2 20:13 , Processed in 0.110116 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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