首頁 > 評測 > One to Many-多核心編程初探——CY8CKIT-062-BLE評測之二

One to Many-多核心編程初探——CY8CKIT-062-BLE評測之二

  • 作者:
  • 來源:21ic
  • [導(dǎo)讀]
  • 任務(wù)分配與同步是多核編程的最重要問題
TIM截圖20180123164705.jpg

 

圖 雙核心使用打印串口流程

其中兩者的打印代碼段均為:

void non_ipc_output(uint32_t cpuid, uint32_t ticks)

{

printf("%08X val:%u\n",

cpuid,

ticks);

}

while(1)

{

non_ipc_output(SCB->CPUID, g_Ticks);

}

運行結(jié)果如下:

image4.png

圖 雙核心使用打印函數(shù)運行結(jié)果

從結(jié)果可以看出來,雙核心的打印全部穿插在一起了.看不出來原本的打印內(nèi)容.發(fā)生這樣的情況顯然不是想要的結(jié)果.分析出現(xiàn)問題的根源在于:當(dāng)前系統(tǒng)僅有的資源被多個核心使用而發(fā)生的爭奪.

借鑒多進程編程的經(jīng)驗,可以得知解決這一問題的關(guān)鍵在于當(dāng)某一核心使用該資源時,另外核心必須等待或者直接放棄.一般的做法是設(shè)定一定的等待時間,如果過了時間依舊獲取不到該資源則進行超時退出等待.于是我們將上文的打印函數(shù)進行修改:

void ipc_output(uint32_t cpuid, uint32_t ticks)

{

uint32_t timeout;

uint32_t rtnVal;

// Cy_GPIO_Set(PIN_WRITING);

/* timeout wait to set semaphore */

for (timeout = 0ul; timeout < MY_TIMEOUT; timeout++)

{

rtnVal = (uint32_t)Cy_IPC_Sema_Set(MY_SEMANUM, false);

/* exit the timeout wait if semaphore successfully set or error */

if ((rtnVal == (uint32_t)CY_IPC_SEMA_SUCCESS) || IsSemaError(rtnVal))

{

break;

}

CyDelayUs(1);

}

if (timeout >= MY_TIMEOUT)

{

//Timeout

}

if (rtnVal == CY_IPC_SEMA_SUCCESS)

{

printf("%08X val:%u\n",

cpuid,

ticks);

/* timeout wait to clear semaphore */

for (timeout = 0ul; timeout < MY_TIMEOUT; timeout++)

{

rtnVal = (uint32_t)Cy_IPC_Sema_Clear(MY_SEMANUM, false);

/* exit the timeout wait if semaphore successfully cleared or error */

if ((rtnVal == (uint32_t)CY_IPC_SEMA_SUCCESS) || IsSemaError(rtnVal))

{

break;

}

CyDelayUs(1);

}

if (timeout >= MY_TIMEOUT)

{

//Timeout

}

}

}

再次進行運行,結(jié)果如下:

image5.png

圖 進行資源保護之后的共享打印結(jié)果

因為需要保護的資源要等到某一核心使用完畢之后才能被其他核心使用,這個過程不能被打斷,所以稱之為原子性操作.不管是多線程還是多核心,這個概念都類似.事實上嵌入式系統(tǒng)的程序員對這個概念并不陌生,ISR中與主循環(huán)中都需要修改的參數(shù)就必須以原子性操作來修改.

image6.png

圖 原子性操作示意

PSoC6上的硬件IPC特性與PDL中的IPC接口

PSoC6處理器中在硬件上就有對IPC的支持,此外PDL中也有詳盡的IPC的驅(qū)動代碼.

PDL中的IPC驅(qū)動可以分為三部分:

驅(qū)動API:

最底層的API,事實上用戶無需調(diào)用這個層的API.

文件:cy_ipc_drv.c, cy_ipc_drv.h

管道API:

用于內(nèi)核之間建立管道進行較大的數(shù)據(jù)量傳輸.

文件:cy_ipc_pipe.c, cy_ipc_pipe.h

信號旗API:

用于內(nèi)核之間同步狀態(tài),資源共享.上一章節(jié)的例子即是使用Semaphore來進行資源共享的.

  • 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!

網(wǎng)友評論