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