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)該有自己的堆??臻g。當(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ù)和事件如下代碼:
/*DefinitionsformyTask01*/ osThreadId_tmyTask01Handle; constosThreadAttr_tmyTask01_attributes={ .name="myTask01", .stack_size=128*4, .priority=(osPriority_t)osPriorityLow, }; ... /*DefinitionsformyEvent02*/ osEventFlagsId_tmyEvent02Handle; constosEventFlagsAttr_tmyEvent02_attributes={ .name="myEvent02" };
這個(gè)是創(chuàng)建任務(wù)的句柄,代碼如下:
/*creationofmyTask01*/ myTask01Handle=osThreadNew(StartTask01,NULL,&myTask01_attributes); /*creationofmyTask02*/ myTask02Handle=osThreadNew(StartTask02,NULL,&myTask02_attributes);
我們改寫代碼,實(shí)現(xiàn)task2往task發(fā)送信號(hào),實(shí)現(xiàn)簡(jiǎn)單的任務(wù)通信,代碼如下。
/*USERCODEENDHeader_StartTask01*/ voidStartTask01(void*argument) { /*USERCODEBEGINStartTask01*/ /*Infiniteloop*/ osStatus_tos_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("startTask02isrunning. "); } } /*USERCODEENDStartTask01*/ } /*USERCODEBEGINHeader_StartTask02*/
osEventFlagsWait函數(shù)的具體實(shí)現(xiàn)以及定義如下圖所示:
osEventFlagsSet就是往某個(gè)任務(wù)的句柄發(fā)送一個(gè)信號(hào),實(shí)現(xiàn)如下
/*USERCODEENDHeader_StartTask02*/ voidStartTask02(void*argument) { /*USERCODEBEGINStartTask02*/ /*Infiniteloop*/ for(;;) { osEventFlagsSet(myEvent01Handle,COMM1_EVENT); osDelay(1); } /*USERCODEENDStartTask02*/ }
最后就可以實(shí)現(xiàn)多個(gè)任務(wù)間的通信了。
-
微控制器
+關(guān)注
關(guān)注
48文章
7936瀏覽量
154264 -
ARM
+關(guān)注
關(guān)注
134文章
9342瀏覽量
376409 -
通信
+關(guān)注
關(guān)注
18文章
6196瀏覽量
137628 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
492瀏覽量
64109 -
實(shí)時(shí)操作系統(tǒng)
+關(guān)注
關(guān)注
1文章
202瀏覽量
31293
原文標(biāo)題:FreeRTOS 任務(wù)間通信,怎么實(shí)現(xiàn)?
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
FreeRTOS中的任務(wù)管理
轉(zhuǎn):第27章 FreeRTOS任務(wù)消息郵箱
如何去實(shí)現(xiàn)基于stm32的FreeRTOS多任務(wù)程序
任務(wù)間通信的目的是什么
請(qǐng)問(wèn)ESP32單核如何使用FreeRTOS測(cè)試隊(duì)列進(jìn)行任務(wù)間通信?
FreeRTOS隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序
FreeRTOS隊(duì)列創(chuàng)建任務(wù)間通信的基本應(yīng)用程序
(一)FreeRTOS學(xué)習(xí)之FreeRTOS任務(wù)基礎(chǔ)知識(shí)

FreeRTOS系列第11篇---FreeRTOS任務(wù)控制

評(píng)論