首页 > 评测 > One to Many-多核心编程初探——CY8CKIT-062-BLE评测之二

One to Many-多核心编程初探——CY8CKIT-062-BLE评测之二

  • 作者:
  • 来源:21ic
  • [导读]
  • 任务分配与同步是多核编程的最重要问题

文件:cy_ipc_sema.c, cy_ipc_sema.h

此外PDL中还包含有IPC的配置模版文件:cy_ipc_config.c, cy_ipc_config.h,这两个文件会在每个使用了IPC的工程中拷贝一份以便该项目配置IPC功能.

image7.png

图 IPC硬件应用结构

从硬件的角度来讲,IPC通信分5步走:

1. 发送的内核获取一个通道;

2. 将数据放入通道;

3. 发送内核产生一个通知中断;

4. 接收内核获取发送内核的标记并取走数据;

5. 接收内核产生一个释放中断

从硬件上来讲,传输的数据最大为32bit的word,但是如果使用管道API,真正传输的数据为指向任意数据的指针.

管道层

管道层与桌面/服务器系统的管道十分类似,就是建立起一个双向的通信连接.每个管道有两个端点,每个端点位于不同内核.每个端点都有自己的通道与中断.

image8.png

图 管道层操作

就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版本,感兴趣的同学可以去下载看看新内容.

https://community.cypress.com/servlet/JiveServlet/downloadBody/14408-102-3-15787/PSoCCreatorSetup_4.2_b574.exe.zip

上述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原创,未经许可禁止转载!

网友评论