查看: 4357|回复: 0

[原创] 【LPC54114双核任务二】理解双核(二)

[复制链接]

该用户从未签到

3

主题

4

帖子

0

高级会员

Rank: 4

积分
695
最后登录
2019-12-4
发表于 2017-7-1 22:32:36 | 显示全部楼层 |阅读模式
上一篇帖子从源代码说了双核的启动原理:【LPC54114双核任务二】理解双核(一)
https://www.nxpic.org.cn/module/ ... amp;fromuid=3370303
(出处: 恩智浦技术社区)
现在从官方提供的底层通信mailbox来看一下。
mailbox提供了一系列内联函数来实现数据传递和资源互斥锁。
首先从原理上想,两个内核想要共享数据,其实只能是在内存或者其他存储的位置上共享。共享就存在两个问题,一是地址的传递,二是修改的互斥。即在多线程程序中,两线程对同一变量修改的不可预测性。
  1. static inline void MAILBOX_Init(MAILBOX_Type *base)
  2. {
  3. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  4.     CLOCK_EnableClock(kCLOCK_Mailbox);
  5. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  6. }
复制代码
该段代码初始化mailbox时钟
  1. static inline void MAILBOX_Deinit(MAILBOX_Type *base)
  2. {
  3. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  4.     CLOCK_DisableClock(kCLOCK_Mailbox);
  5. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  6. }
复制代码
该段代码关闭了mailbox时钟
  1. static inline void MAILBOX_SetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxData)
  2. {
  3.     assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
  4.     base->MBOXIRQ[cpu_id].IRQ = mboxData;
  5. }
复制代码
传入一个结构体地址,当前的cpu id,欲传输的数据,在该地址的数据可以被另一个核心读取
  1. static inline uint32_t MAILBOX_GetValue(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id)
  2. {
  3.     assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
  4.     return base->MBOXIRQ[cpu_id].IRQ;
  5. }
复制代码
读取setvalue设定下的数据
  1. static inline void MAILBOX_SetValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxSetBits)
  2. {
  3.     assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
  4.     base->MBOXIRQ[cpu_id].IRQSET = mboxSetBits;
  5. }
复制代码
主要用于mailbox中断,设置中断标志位,启动中断
  1. static inline void MAILBOX_ClearValueBits(MAILBOX_Type *base, mailbox_cpu_id_t cpu_id, uint32_t mboxClrBits)
  2. {
  3.     assert((cpu_id == kMAILBOX_CM0Plus) || (cpu_id == kMAILBOX_CM4));
  4.     base->MBOXIRQ[cpu_id].IRQCLR = mboxClrBits;
  5. }
复制代码
清楚中断标志位,一般用于中断函数的最后
  1. static inline uint32_t MAILBOX_GetMutex(MAILBOX_Type *base)
  2. {
  3.     return (base->MUTEX & MAILBOX_MUTEX_EX_MASK);
  4. }
复制代码
当返回值为0的时候,代表该资源被其他核心占用,不可以进行更改,当返回值为1的时候,代表可以更改,并占用该资源。
  1. static inline void MAILBOX_SetMutex(MAILBOX_Type *base)
  2. {
  3.     base->MUTEX = MAILBOX_MUTEX_EX_MASK;
  4. }
复制代码
解除对该变量的占用,应当在每次不使用变量的时候说明。以此来实现双核对数据的更新。

其实从代码中看,双核数据传递的东西有限,但若是用强制类型转换将结构体的指针转化为int型进行传递,传递完以后另一个核心进行类型还原为指针,则大型数据的共享能得以实现。erpc函数相关用的就是这种方式。由于时间原因,没有写例程。但但概念思路理清之后,一切就简单了。关于硬件实现实在应该是下一步探索的方向,但由于底子比较薄,以后再说。
谢谢。




回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-8-31 06:56 , Processed in 0.077269 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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