首頁(yè) > 評(píng)測(cè) > One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二
One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二
- [導(dǎo)讀]
- 任務(wù)分配與同步是多核編程的最重要問(wèn)題
文件:cy_ipc_sema.c, cy_ipc_sema.h
此外PDL中還包含有IPC的配置模版文件:cy_ipc_config.c, cy_ipc_config.h,這兩個(gè)文件會(huì)在每個(gè)使用了IPC的工程中拷貝一份以便該項(xiàng)目配置IPC功能.
圖 IPC硬件應(yīng)用結(jié)構(gòu)
從硬件的角度來(lái)講,IPC通信分5步走:
1. 發(fā)送的內(nèi)核獲取一個(gè)通道;
2. 將數(shù)據(jù)放入通道;
3. 發(fā)送內(nèi)核產(chǎn)生一個(gè)通知中斷;
4. 接收內(nèi)核獲取發(fā)送內(nèi)核的標(biāo)記并取走數(shù)據(jù);
5. 接收內(nèi)核產(chǎn)生一個(gè)釋放中斷
從硬件上來(lái)講,傳輸?shù)臄?shù)據(jù)最大為32bit的word,但是如果使用管道API,真正傳輸?shù)臄?shù)據(jù)為指向任意數(shù)據(jù)的指針.
管道層
管道層與桌面/服務(wù)器系統(tǒng)的管道十分類似,就是建立起一個(gè)雙向的通信連接.每個(gè)管道有兩個(gè)端點(diǎn),每個(gè)端點(diǎn)位于不同內(nèi)核.每個(gè)端點(diǎn)都有自己的通道與中斷.
圖 管道層操作
就PSOC6雙核處理器來(lái)講,一共有16個(gè)IPC通道和相應(yīng)的IPC中斷.0-7的通道與中斷留給系統(tǒng)用,其余給應(yīng)用程序使用.
信號(hào)旗層
Semaphore就是上一章的例子使用的用來(lái)共享,同步資源使用的API.(另:Semaphore有很多種中文翻譯版本,信號(hào)旗是作者認(rèn)為最合理的翻譯.)
這里把上一章的例子中的代碼簡(jiǎn)要分析一下子:
要初始化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,事實(shí)上這個(gè)大小只受SRAM大小的限制.注意多個(gè)內(nèi)核中只能有一個(gè)內(nèi)核運(yùn)行這個(gè)函數(shù),一般而言是Cortex M0+來(lái)運(yùn)行這段代碼.
之后獲取Handle,以后的應(yīng)用要使用:
myIpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(MY_IPC_CHANNEL);
至此為止就可以喚醒另外一個(gè)內(nèi)核了:
Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR);
對(duì)于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);
注意用來(lái)存儲(chǔ)Semaphore的地址那里是空的.另外兩邊的通道號(hào)當(dāng)然要是一樣的.
這樣兩邊都可以開(kāi)始使用這個(gè)Semaphore了.具體如何使用代碼請(qǐng)參考Github頁(yè)面.
結(jié)論與資源
嵌入式系統(tǒng)多核心并行編程是個(gè)較新的話題, 作者對(duì)其理解還不深刻. 文章肯定不少缺漏之處, 請(qǐng)讀者多多指教.
另外本文所配的代碼請(qǐng)于此Git頁(yè)面下載:
https://github.com/zhanzr/cy8ckit-demo.git
正在本文寫作的期間,Cypress公司又推出了PSoC Creator 4.2的Beta 2版本,感興趣的同學(xué)可以去下載看看新內(nèi)容.
上述Github中除了上述的Semaphore的例子之外,還有本人所作的雙內(nèi)核的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
為了便于比較,兩個(gè)內(nèi)核都設(shè)定為100MHz.因?yàn)檫@種評(píng)測(cè)并非能準(zhǔn)確反映所評(píng)測(cè)內(nèi)核的真實(shí)性能,故此僅僅作為參考,不做過(guò)多解讀.相關(guān)代碼,感興趣的同學(xué)可以參考.
此篇分享到此為止,多謝閱讀!
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評(píng)論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開(kāi)放投稿
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開(kāi)發(fā)
預(yù)算:¥1100000015小時(shí)前
- 12V汽車啟動(dòng)電源項(xiàng)目BMS設(shè)計(jì)
預(yù)算:¥50000023小時(shí)前
- 數(shù)據(jù)可視化軟件 開(kāi)發(fā)
預(yù)算:¥5000023小時(shí)前
- PLC項(xiàng)目調(diào)試修改
預(yù)算:¥100001天前
- 起動(dòng)電機(jī)控制器開(kāi)發(fā)
預(yù)算:¥1100001天前