素材來(lái)源:技術(shù)讓夢(mèng)想更偉大
作者:李肖遙
FreeRTOS 是一個(gè)可裁剪、可剝奪型的多任務(wù)內(nèi)核,十分好用,而且沒(méi)有任務(wù)數(shù)限制,在此之前分析過(guò)很多了,簡(jiǎn)單來(lái)說(shuō),F(xiàn)reeRTOS實(shí)時(shí)系統(tǒng)能夠創(chuàng)建多個(gè)獨(dú)立的任務(wù),并且任務(wù)之間互不干擾,為了這一點(diǎn)的實(shí)現(xiàn),每個(gè)任務(wù)都應(yīng)該有自己的堆棧空間。當(dāng)任務(wù)進(jìn)行切換,執(zhí)行環(huán)境則保存到該任務(wù)的堆棧中,所以,當(dāng)一段時(shí)間后切換回該任務(wù),它能夠精確地回復(fù)上次工作時(shí)的狀態(tài)。
之前也匯總了一些教程,參考精選匯總 | freertos從基礎(chǔ)到高級(jí)篇系列
FreeRTOS 提供了實(shí)時(shí)操作系統(tǒng)所需的所有功能,包括資源管理、同步、任務(wù)通信等,本篇主要說(shuō)一下任務(wù)通信,任務(wù)創(chuàng)建之后并不是一起運(yùn)行的,而是通過(guò)優(yōu)先級(jí)順序進(jìn)行任務(wù)的調(diào)用來(lái)實(shí)現(xiàn)的。
輪子也造好了,很多我們可以直接拿來(lái)用,ARM Cortex 微控制器軟件接口標(biāo)準(zhǔn)是cmsis,且是與供應(yīng)商無(wú)關(guān)的硬件抽象層,CMSIS-RTOS是實(shí)時(shí)操作系統(tǒng)的通用API,簡(jiǎn)單來(lái)說(shuō)就是將Freertos、Rtthread等操作系統(tǒng)再進(jìn)行一次封裝,形成通用的API函數(shù),目的是使移植更方便。這里我們選用接口是CMSIS_V2,之前也講到過(guò)stm32CubeIDE中CMSIS_V1和CMSIS_V2選項(xiàng)的區(qū)別。

首先創(chuàng)建兩個(gè)任務(wù)myTask01和myTask02,如下圖所示:

創(chuàng)建2個(gè)事件myEvent01,myEvent02,如下圖所示:

拉下來(lái)也可以配置以下信息,在此我們默認(rèn)配置計(jì)數(shù)信號(hào)量、分配方式、控制塊名稱等配置信息。
生成代碼之后任務(wù)和事件如下代碼:
/*?Definitions?for?myTask01?*/
osThreadId_t?myTask01Handle;
const?osThreadAttr_t?myTask01_attributes?=?{
??.name?=?"myTask01",
??.stack_size?=?128?*?4,
??.priority?=?(osPriority_t)?osPriorityLow,
};
...
/*?Definitions?for?myEvent02?*/
osEventFlagsId_t?myEvent02Handle;
const?osEventFlagsAttr_t?myEvent02_attributes?=?{
??.name?=?"myEvent02"
};
這個(gè)是創(chuàng)建任務(wù)的句柄,代碼如下:
??/*?creation?of?myTask01?*/
??myTask01Handle?=?osThreadNew(StartTask01,?NULL,?&myTask01_attributes);
??/*?creation?of?myTask02?*/
??myTask02Handle?=?osThreadNew(StartTask02,?NULL,?&myTask02_attributes);
我們改寫代碼,實(shí)現(xiàn)task2往task發(fā)送信號(hào),實(shí)現(xiàn)簡(jiǎn)單的任務(wù)通信,代碼如下。
/*?USER?CODE?END?Header_StartTask01?*/
void?StartTask01(void?*argument)
{
????/*?USER?CODE?BEGIN?StartTask01?*/
????/*?Infinite?loop?*/
????osStatus_t?os_Status;
???while(1)
???{
????os_Status?=?osEventFlagsWait(myTask02Handle,???/*?事件標(biāo)志組ID?*/
????????????COMM2_EVENT,???????/*?等待事件標(biāo)志位0與事件標(biāo)志位1?*/
????????????osFlagsWaitAny,????/*?邏輯或?*/
???????????????osWaitForever??????/*?一直等待?*/
????????????);
????if(os_Status?==?COMM1_EVENT)
????{
???????printf("startTask02?is?running.\r\n");
????}
???}
????/*?USER?CODE?END?StartTask01?*/
}
/*?USER?CODE?BEGIN?Header_StartTask02?*/
osEventFlagsWait函數(shù)的具體實(shí)現(xiàn)以及定義如下圖所示:

osEventFlagsSet就是往某個(gè)任務(wù)的句柄發(fā)送一個(gè)信號(hào),實(shí)現(xiàn)如下
/*?USER?CODE?END?Header_StartTask02?*/
void?StartTask02(void?*argument)
{
?/*?USER?CODE?BEGIN?StartTask02?*/
?/*?Infinite?loop?*/
?for(;;)
?{
???osEventFlagsSet(myEvent01Handle,?COMM1_EVENT);
???osDelay(1);
?}
?/*?USER?CODE?END?StartTask02?*/
}最后就可以實(shí)現(xiàn)多個(gè)任務(wù)間的通信了。
end
一口Linux?
關(guān)注,回復(fù)【1024】海量Linux資料贈(zèng)送
精彩文章合集
文章推薦
?【專輯】ARM ?【專輯】粉絲問(wèn)答 ?【專輯】linux入門 ?【專輯】計(jì)算機(jī)網(wǎng)絡(luò) ?【專輯】Linux驅(qū)動(dòng) ?【干貨】嵌入式驅(qū)動(dòng)工程師學(xué)習(xí)路線 ?【干貨】Linux嵌入式所有知識(shí)點(diǎn)-思維導(dǎo)圖