在线时间4 小时
UID3370303
注册时间2017-6-14
NXP金币63
该用户从未签到
高级会员

- 积分
- 695
- 最后登录
- 2019-12-4
|
上一篇帖子从源代码说了双核的启动原理:【LPC54114双核任务二】理解双核(一)
https://www.nxpic.org.cn/module/ ... amp;fromuid=3370303
(出处: 恩智浦技术社区)
现在从官方提供的底层通信mailbox来看一下。
mailbox提供了一系列内联函数来实现数据传递和资源互斥锁。
首先从原理上想,两个内核想要共享数据,其实只能是在内存或者其他存储的位置上共享。共享就存在两个问题,一是地址的传递,二是修改的互斥。即在多线程程序中,两线程对同一变量修改的不可预测性。
- static inline void MAILBOX_Init(MAILBOX_Type *base)
- {
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_EnableClock(kCLOCK_Mailbox);
- #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
- }
复制代码 该段代码初始化mailbox时钟
- static inline void MAILBOX_Deinit(MAILBOX_Type *base)
- {
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_DisableClock(kCLOCK_Mailbox);
- #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
- }
复制代码 该段代码关闭了mailbox时钟
- static inline void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData)
- {
- assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
- base->MBOXIRQ[cpu_id].IRQ = mboxData;
- }
复制代码 传入一个结构体地址,当前的cpu id,欲传输的数据,在该地址的数据可以被另一个核心读取
- static inline uint32_t MAILBOX_GetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id)
- {
- assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
- return base->MBOXIRQ[cpu_id].IRQ;
- }
复制代码 读取setvalue设定下的数据
- static inline void MAILBOX_SetValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxSetBits)
- {
- assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
- base->MBOXIRQ[cpu_id].IRQSET = mboxSetBits;
- }
复制代码 主要用于mailbox中断,设置中断标志位,启动中断
- static inline void MAILBOX_ClearValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxClrBits)
- {
- assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
- base->MBOXIRQ[cpu_id].IRQCLR = mboxClrBits;
- }
复制代码 清楚中断标志位,一般用于中断函数的最后
- static inline uint32_t MAILBOX_GetMutex(MAILBOX_Type *base)
- {
- return (base->MUTEX & MAILBOX_MUTEX_EX_MASK);
- }
复制代码 当返回值为0的时候,代表该资源被其他核心占用,不可以进行更改,当返回值为1的时候,代表可以更改,并占用该资源。
- static inline void MAILBOX_SetMutex(MAILBOX_Type *base)
- {
- base->MUTEX = MAILBOX_MUTEX_EX_MASK;
- }
复制代码 解除对该变量的占用,应当在每次不使用变量的时候说明。以此来实现双核对数据的更新。
其实从代码中看,双核数据传递的东西有限,但若是用强制类型转换将结构体的指针转化为int型进行传递,传递完以后另一个核心进行类型还原为指针,则大型数据的共享能得以实现。erpc函数相关用的就是这种方式。由于时间原因,没有写例程。但但概念思路理清之后,一切就简单了。关于硬件实现实在应该是下一步探索的方向,但由于底子比较薄,以后再说。
谢谢。
|
|