首頁(yè) > 評(píng)測(cè) > One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二

One to Many-多核心編程初探——CY8CKIT-062-BLE評(píng)測(cè)之二

  • 作者:
  • 來(lái)源:21ic
  • [導(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功能.

image7.png

圖 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)都有自己的通道與中斷.

image8.png

圖 管道層操作

就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)容.

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

上述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)放投稿

熱門標(biāo)簽
項(xiàng)目外包 more+