首页 > 评测 > One to Many-多核心编程初探——CY8CKIT-062-BLE评测之二
One to Many-多核心编程初探——CY8CKIT-062-BLE评测之二
- [导读]
- 任务分配与同步是多核编程的最重要问题
文件:cy_ipc_sema.c, cy_ipc_sema.h
此外PDL中还包含有IPC的配置模版文件:cy_ipc_config.c, cy_ipc_config.h,这两个文件会在每个使用了IPC的工程中拷贝一份以便该项目配置IPC功能.
图 IPC硬件应用结构
从硬件的角度来讲,IPC通信分5步走:
1. 发送的内核获取一个通道;
2. 将数据放入通道;
3. 发送内核产生一个通知中断;
4. 接收内核获取发送内核的标记并取走数据;
5. 接收内核产生一个释放中断
从硬件上来讲,传输的数据最大为32bit的word,但是如果使用管道API,真正传输的数据为指向任意数据的指针.
管道层
管道层与桌面/服务器系统的管道十分类似,就是建立起一个双向的通信连接.每个管道有两个端点,每个端点位于不同内核.每个端点都有自己的通道与中断.
图 管道层操作
就PSOC6双核处理器来讲,一共有16个IPC通道和相应的IPC中断.0-7的通道与中断留给系统用,其余给应用程序使用.
信号旗层
Semaphore就是上一章的例子使用的用来共享,同步资源使用的API.(另:Semaphore有很多种中文翻译版本,信号旗是作者认为最合理的翻译.)
这里把上一章的例子中的代码简要分析一下子:
要初始化Semaphore
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
/* Initialize the IPC semaphore subsystem. This must done by this CPU, with definition of
semaphore array address, before the other CPU starts using the semaphore system. */
if (Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, sizeof(myArray) * 8ul, myArray) != CY_IPC_SEMA_SUCCESS)
{
handle_error();
}
这里初始化的是128bit的semaphore,事实上这个大小只受SRAM大小的限制.注意多个内核中只能有一个内核运行这个函数,一般而言是Cortex M0+来运行这段代码.
之后获取Handle,以后的应用要使用:
myIpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(MY_IPC_CHANNEL);
至此为止就可以唤醒另外一个内核了:
Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR);
对于Cortex M4这边的初始化代码:
if (Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, (uint32_t)NULL, (uint32_t *)NULL) != CY_IPC_SEMA_SUCCESS)
{
handle_error();
}
myIpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(MY_IPC_CHANNEL);
注意用来存储Semaphore的地址那里是空的.另外两边的通道号当然要是一样的.
这样两边都可以开始使用这个Semaphore了.具体如何使用代码请参考Github页面.
结论与资源
嵌入式系统多核心并行编程是个较新的话题, 作者对其理解还不深刻. 文章肯定不少缺漏之处, 请读者多多指教.
另外本文所配的代码请于此Git页面下载:
https://github.com/zhanzr/cy8ckit-demo.git
正在本文写作的期间,Cypress公司又推出了PSoC Creator 4.2的Beta 2版本,感兴趣的同学可以去下载看看新内容.
上述Github中除了上述的Semaphore的例子之外,还有本人所作的双内核的Benchmark的程序.其中Dhrystone得分为:
Both Cortex M0+ and Cortex M4 run @ 100MHz. ARMGCC 5.4.1, -O3, Newlib-Nano, Without float format printf. UART 115200 Retarget IO.
CM0+: Microseconds for one run through Dhrystone: 7.35 Dhrystones per Second: 136008.16
CM4: Microseconds for one run through Dhrystone: 4.97 Dhrystones per Second: 201156.66
为了便于比较,两个内核都设定为100MHz.因为这种评测并非能准确反映所评测内核的真实性能,故此仅仅作为参考,不做过多解读.相关代码,感兴趣的同学可以参考.
此篇分享到此为止,多谢阅读!
- 本文系21ic原创,未经许可禁止转载!
网友评论
- 联系人:巧克力娃娃
- 邮箱:board@21ic.com
- 我要投稿
-
欢迎入驻,开放投稿
-
人均百万?英伟达中国员工收入曝光! 2024-08-29
-
《黑神话:悟空》玩家硬盘升级攻略:提升游戏体验,畅享3A大作 2024-08-29
-
数睿数据参加《系统与软件工程 低代码开发平台通用技术要求》国家标准编制 2024-08-29
- NRF52810蓝牙数字耳机找人定制
预算:¥30005天前
- 125KW模块式PCS软硬件外包开发
预算:¥1100000015小时前
- 12V汽车启动电源项目BMS设计
预算:¥50000023小时前
- 数据可视化软件 开发
预算:¥5000023小时前
- PLC项目调试修改
预算:¥100001天前
- 起动电机控制器开发
预算:¥1100001天前