99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

freeRTOS用于任務(wù)之間同步的手段事件標(biāo)志組

汽車電子技術(shù) ? 來(lái)源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 11:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

freeRTOS中還有一種可以用于任務(wù)之間同步的手段 — 事件標(biāo)志組。

假如在項(xiàng)目中,有些任務(wù)或者動(dòng)作需要等到某種條件成立的時(shí)候才能被執(zhí)行,不成立的時(shí)候不執(zhí)行,這種情況就可以考慮使用事件標(biāo)志組。設(shè)定一個(gè)事件標(biāo)志,在項(xiàng)目運(yùn)行過(guò)程中監(jiān)控某種條件是否成立,如果條件成立了就設(shè)置這個(gè)事件標(biāo)志位,另外一個(gè)地方如果發(fā)現(xiàn)這個(gè)標(biāo)志位有效了,就執(zhí)行這個(gè)任務(wù)或者動(dòng)作,完成這個(gè)同步的過(guò)程。

0、事件標(biāo)志組的配置 & 原理

FreeRTOS 中事件標(biāo)志的實(shí)現(xiàn),是在 FreeRTOSConfig.h 文件中配置的,如下:

1)選擇 8 個(gè)可用的事件標(biāo)志組

#define configUSE_16_BIT_TICKS   1

配置宏定義 configUSE_16_BIT_TICKS 為 1 時(shí),每創(chuàng)建一個(gè)事件標(biāo)志組,用戶可以使用的事件標(biāo)志是 8 個(gè)。

2)選擇 24 個(gè)可用的事件標(biāo)志組

#define configUSE_16_BIT_TICKS   0

配置宏定義 configUSE_16_BIT_TICKS 為 0 時(shí),每創(chuàng)建一個(gè)事件標(biāo)志組,用戶可以使用的事件標(biāo)志是 24 個(gè)。

上面說(shuō)的 8 個(gè)和 24 個(gè)事件標(biāo)志是怎么回事呢?

首選看看宏 configUSE_16_BIT_TICKS ** 定義了之后做了些什么吧?在文件portmacro.h** 有這么一段代碼:

#if( configUSE_16_BIT_TICKS == 1 )  typedef uint16_t TickType_t;  #define portMAX_DELAY ( TickType_t ) 0xffff#else  typedef uint32_t TickType_t;  #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do not need to be guarded with a critical section. */ #define portTICK_TYPE_IS_ATOMIC 1#endif

注意這個(gè) TickType_t 這個(gè)類型重聲明!!!

以及下面這個(gè)類型重定義:

typedef TickType_t EventBits_t;

再看時(shí)間標(biāo)志組的結(jié)構(gòu)體:

typedef struct xEventGroupDefinition{  EventBits_t uxEventBits;      // 看這個(gè)、看這個(gè)、看這個(gè)!??!嘿嘿?。。?/span>  List_t xTasksWaitingForBits;    /*< List of tasks waiting for a bit to be set. */
#if( configUSE_TRACE_FACILITY == 1 ) UBaseType_t uxEventGroupNumber; #endif
} EventGroup_t;

注意看 EventBits_t uxEventBits;

最后看時(shí)間標(biāo)志組的創(chuàng)建過(guò)程,代碼如下:

EventGroupHandle_t xEventGroupCreate( void ){   EventGroup_t *pxEventBits;
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); if( pxEventBits != NULL ) { pxEventBits->uxEventBits = 0; // 記得看我、記得看我、記得看我?。?!嘻嘻?。?/span> vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); traceEVENT_GROUP_CREATE( pxEventBits ); } else { traceEVENT_GROUP_CREATE_FAILED(); }
return ( EventGroupHandle_t ) pxEventBits;}

看上面代碼的 pxEventBits->uxEventBits = 0; 應(yīng)該就明白了吧?。。?/strong>

其實(shí)freeRTOS的事件標(biāo)志組的實(shí)現(xiàn)原理就是定義了一個(gè)變量,如果是 16 位變量,就僅使用了低 8bit ;如果定義了一個(gè) 32 位變量,就僅使用了低 24bit。

每一個(gè) bit 用 0 和 1 兩種狀態(tài)來(lái)代表事件標(biāo)志。

2、事件標(biāo)志組的API管理函數(shù)

2.1、事件標(biāo)志組的創(chuàng)建

函數(shù)原型:

EventGroupHandle_t xEventGroupCreate( void );

函數(shù)描述:

函數(shù) xEventGroupCreate 用于創(chuàng)建事件標(biāo)志組。

返回值,如果創(chuàng)建成功,此函數(shù)返回事件標(biāo)志組的句柄,失敗會(huì)返回 NULL。

2.2、事件標(biāo)志組的位設(shè)置

(1)在任務(wù)中設(shè)置

函數(shù)原型:

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,   /* 事件標(biāo)志組句柄 */                      const EventBits_t uxBitsToSet );   /* 事件標(biāo)志位設(shè)置 */

函數(shù)描述:

函數(shù) xEventGroupSetBits 用于設(shè)置指定的事件標(biāo)志位為 1。

第 1 個(gè)參數(shù)是事件標(biāo)志組句柄。

第 2 個(gè)參數(shù)表示 24 個(gè)可設(shè)置的事件標(biāo)志位,EventBits_t 是定義的 32 位變量,低 24 位用于事件標(biāo)志設(shè)置。變量 uxBitsToSet 的低 24 位的某個(gè)位設(shè)置為 1,那么被設(shè)置的 事件標(biāo)志組的相應(yīng)位就設(shè)置為 1。變量 uxBitsToSet 設(shè)置為 0 的位對(duì)事件標(biāo)志相應(yīng)位沒(méi)有影響。比 如設(shè)置變量 uxBitsToSet = 0x0003 就表示將事件標(biāo)志的位 0 和位 1 設(shè)置為1,其余位沒(méi)有變化。

返回當(dāng)前的事件標(biāo)志組數(shù)值。

(2)在中斷中設(shè)置

函數(shù)原型:

BaseType_t xEventGroupSetBitsFromISR(                      EventGroupHandle_t xEventGroup,       /* 事件標(biāo)志組句柄 */                      const EventBits_t uxBitsToSet,       /* 事件標(biāo)志位設(shè)置 */                      BaseType_t *pxHigherPriorityTaskWoken ); /* 高優(yōu)先級(jí)任務(wù)是否被喚醒的狀態(tài)保存 */

函數(shù)描述:

函數(shù) xEventGroupSetBits 用于設(shè)置指定的事件標(biāo)志位為 1。

第 1 個(gè)參數(shù)是事件標(biāo)志組句柄。

第 2 個(gè)參數(shù)表示 24 個(gè)可設(shè)置的事件標(biāo)志位,EventBits_t 是定義的 32 位變量,低 24 位用于事件標(biāo)志設(shè)置。變量 uxBitsToSet 的低 24 位的某個(gè)位設(shè)置為 1,那么被設(shè)置的 事件標(biāo)志組的相應(yīng)位就設(shè)置為 1。變量 uxBitsToSet 設(shè)置為 0 的位對(duì)事件標(biāo)志相應(yīng)位沒(méi)有影響。比 如設(shè)置變量 uxBitsToSet = 0x0003 就表示將事件標(biāo)志的位 0 和位 1 設(shè)置為 1,其余位沒(méi)有變化。

第3個(gè)參數(shù)用于保存是否有高優(yōu)先級(jí)任務(wù)準(zhǔn)備就緒。如果函數(shù)執(zhí)行完畢后,此參數(shù)的數(shù)值是pdTRUE, 說(shuō)明有高優(yōu)先級(jí)任務(wù)要執(zhí)行,否則沒(méi)有。

返回值,如果消息成功發(fā)送給 daemon 任務(wù)(就是 FreeRTOS 的定時(shí)器任務(wù))返回 pdPASS,否則 返回 pdFAIL,另外 daemon 任務(wù)中的消息隊(duì)列滿了也會(huì)返回 pdFAIL。

使用前一定要保證事件標(biāo)志已經(jīng)通過(guò)函數(shù) xEventGroupCreate 創(chuàng)建了。同時(shí)要在 FreeRTOSConfig.h 文件中使能如下三個(gè)宏定義:

#define INCLUDE_xEventGroupSetBitFromISR     1#define configUSE_TIMERS             1#define INCLUDE_xTimerPendFunctionCall     1

3、事件標(biāo)志組的位清除

(1)在任務(wù)中設(shè)置

EventBits_t xEventGroupClearBits(                                 EventGroupHandle_t xEventGroup,                                 const EventBits_t uxBitsToClear );

函數(shù)描述:

xEventGroup:需要操作的事件標(biāo)志組;

uxBitsToClear:要清零的事件位,比如要清楚bit2就設(shè)置為0x04。

返回值:將指定事件位清零之前的事件組值。

(2)在中斷中設(shè)置

BaseType_t xEventGroupClearBitsFromISR(                                EventGroupHandle_t xEventGroup,                                const EventBits_t uxBitsToClear );

xEventGroup:需要操作的事件標(biāo)志組;

uxBitsToClear:要清零的事件位,比如要清楚bit2就設(shè)置為0x04。

返回值:將指定事件位清零之前的事件組值。

4、等待時(shí)間標(biāo)志組中的指定位被設(shè)置

(1)在任務(wù)中等待

函數(shù)原型:

EventBits_t xEventGroupWaitBits(                            const EventGroupHandle_t xEventGroup,  /* 事件標(biāo)志組句柄 */                            const EventBits_t uxBitsToWaitFor,     /* 等待被設(shè)置的事件標(biāo)志位 */                            const BaseType_t xClearOnExit,         /* 選擇是否清零被置位的事件標(biāo)志位 */                            const BaseType_t xWaitForAllBits,      /* 選擇是否等待所有標(biāo)志位都被設(shè)置 */                            TickType_t xTicksToWait );             /* 設(shè)置等待時(shí)間 */

函數(shù)描述:

函數(shù) xEventGroupWaitBits 等待事件標(biāo)志被設(shè)置。

第 1 個(gè)參數(shù)是事件標(biāo)志組句柄。

第 2 個(gè)參數(shù)表示等待 24 個(gè)事件標(biāo)志位中的指定標(biāo)志,EventBits_t 是定義的 32 位變量,低 24 位用于事件標(biāo)志設(shè)置。比如設(shè)置變量 uxBitsToWaitFor = 0x0003 就表示等待事 件標(biāo)志的位 0 和位 1 設(shè)置為 1。 此參數(shù)切不可設(shè)置為 0 。

第 3 個(gè)參數(shù)選擇是否清除已經(jīng)被置位的事件標(biāo)志,如果這個(gè)參數(shù)設(shè)置為 pdTRUE,且函數(shù) xEventGroupWaitBits 在參數(shù) xTicksToWait 設(shè)置的溢出時(shí)間內(nèi)返回,那么相應(yīng)被設(shè)置的事件標(biāo)志 位會(huì)被清零。如果這個(gè)參數(shù)設(shè)置為 pdFALSE,對(duì)已經(jīng)被設(shè)置的事件標(biāo)志位沒(méi)有影響。

第 4 個(gè)參數(shù)選擇是否等待所有的標(biāo)志位都被設(shè)置,如果這個(gè)參數(shù)設(shè)置為 pdTRUE,要等待第 2 個(gè)參 數(shù) uxBitsToWaitFor 所指定的標(biāo)志位全部被置 1,函數(shù)才可以返回。當(dāng)然,超出了在參數(shù) xTicksToWait 設(shè)置的溢出時(shí)間也是會(huì)返回的。如果這個(gè)參數(shù)設(shè)置為 pdFALSE,第 2 個(gè)參數(shù) uxBitsToWaitFor 所指定的任何標(biāo)志位被置 1,函數(shù)都會(huì)返回,超出溢出時(shí)間也會(huì)返回。

第 5 個(gè)參數(shù)設(shè)置等待時(shí)間,單位時(shí)鐘節(jié)拍周期。如果設(shè)置為 portMAX_DELAY,表示永久等待。

返回值:由于設(shè)置的時(shí)間超時(shí)或者指定的事件標(biāo)志位被置 1,導(dǎo)致函數(shù)退出時(shí)返回的事件標(biāo)志組數(shù)值。

5、刪除事件標(biāo)志組

void vEventGroupDelete( EventGroupHandle_t xEventGroup );

xEventGroup:要?jiǎng)h除的時(shí)間標(biāo)志組

6、事件標(biāo)志組的示例demo

代碼中創(chuàng)建了兩個(gè)任務(wù)和一個(gè)24bit可用的時(shí)間標(biāo)志組,一個(gè)任務(wù)通過(guò)按鍵掃描設(shè)置事件標(biāo)志組的值,通過(guò)按鍵按三下設(shè)置事件標(biāo)志組的值為0x00000008,然后另外一個(gè)任務(wù)阻塞等待,直到檢測(cè)到事件標(biāo)志組被設(shè)置為0x00000008之后翻轉(zhuǎn)LED的閃爍。

EventGroupHandle_t FlagEventGroup;  //事件標(biāo)志組FlagEventGroup = xEventGroupCreate();   //創(chuàng)建事件標(biāo)志組 24bit可用
//task1任務(wù)函數(shù)void task1_task(void *pvParameters) //prio = 2{ u8 keyVal = 0; EventBits_t FlagVal; u32 setVal = 0x0001; while(1) { keyVal = KEY_Scan(0); if(keyVal == KEY0_PRES) { FlagVal = xEventGroupSetBits(FlagEventGroup, setVal); printf("事件標(biāo)志組設(shè)置值為:%d\\r\\n",FlagVal); xEventGroupClearBits(FlagEventGroup, setVal); //清除標(biāo)志位 setVal <<= 1; } LED1 ^= 1; vTaskDelay(200); //延時(shí)n個(gè)時(shí)鐘節(jié)拍 }}
//task2任務(wù)函數(shù)void task2_task(void *pvParameters) //prio = 3{ u32 i,j; u32 TxStr[3] = {0}; while(1) { xEventGroupWaitBits(FlagEventGroup, //事件標(biāo)志組句柄 0x0008, //等待 24 個(gè)事件標(biāo)志位中的指定標(biāo)志 pdFALSE, //是否清除已經(jīng)被置位的事件標(biāo)志,pdTRUE - 清除,pdFALSE - 不清除 pdFALSE, //是否等待所有的標(biāo)志位都被設(shè)置,pdTRUE - 是,pdFALSE - 不是 portMAX_DELAY //等待時(shí)間,單位時(shí)鐘節(jié)拍周期 ); LED0 ^= 1;
vTaskDelay(500); //延時(shí)n個(gè)時(shí)鐘節(jié)拍 }}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 同步
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    19601
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    493

    瀏覽量

    64375
  • 事件標(biāo)志組
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1394
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于FreeRTOS的STM32F103系統(tǒng)—隊(duì)列

    FreeRTOS中,隊(duì)列是實(shí)現(xiàn)任務(wù)之間同步、互斥和通信的一種重要方法(其他的實(shí)現(xiàn)方法有:任務(wù)通知、事件
    的頭像 發(fā)表于 11-10 11:37 ?1443次閱讀
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系統(tǒng)—隊(duì)列

    FreeRTOS信號(hào)量的使用與實(shí)例

    在嵌入式系統(tǒng)中,任務(wù)管理是一個(gè)重要的部分,它涉及到任務(wù)之間的通信和同步,信號(hào)量,隊(duì)列,互斥鎖和事件標(biāo)志
    的頭像 發(fā)表于 12-12 15:25 ?3520次閱讀

    使用STM32CubeMX生成的FreeRTOS系統(tǒng)中,似乎沒(méi)有新封裝的事件標(biāo)志,怎么解決?

    使用STM32CubeMX生成的FreeRTOS系統(tǒng)中,似乎沒(méi)有新封裝的事件標(biāo)志,如果按照原生的FreeRTOS使用事件標(biāo)志
    發(fā)表于 03-22 08:34

    使用FreeRTOS系統(tǒng)事件標(biāo)志有些收不到是怎么回事?

    教下,使用FreeRTOS的的件標(biāo)志, 任務(wù)貌似有些標(biāo)志位收不到,是怎么回事啊 ? 比如事件標(biāo)志
    發(fā)表于 04-26 06:53

    轉(zhuǎn):freeRTOS事件學(xué)習(xí)

    像其他RTOS一樣,freeRTOS同樣有對(duì)事件標(biāo)志位的創(chuàng)建和處理,在中斷中可以通過(guò)事件傳遞信息給其他的任務(wù),那么如何創(chuàng)建事件呢?要使用
    發(fā)表于 08-12 18:29

    轉(zhuǎn):第18章 FreeRTOS事件標(biāo)志

    問(wèn)題。18.1.2 FreeRTOS任務(wù)間事件標(biāo)志的實(shí)現(xiàn) 任務(wù)間事件標(biāo)志
    發(fā)表于 09-02 12:40

    轉(zhuǎn):第26章 FreeRTOS任務(wù)事件標(biāo)志

    本章節(jié)為大家講解FreeRTOS事件標(biāo)志的另一種實(shí)現(xiàn)方式----基于任務(wù)通知(Task Notifications)的事件標(biāo)志
    發(fā)表于 09-08 06:48

    第13章 事件標(biāo)志

    轉(zhuǎn)rtx操作系統(tǒng)前面的章節(jié)我們已經(jīng)講解了任務(wù)管理和時(shí)間管理,從本章節(jié)開(kāi)始講解任務(wù)間的通信和同步機(jī)制。首先講解任務(wù)間的通信和同步機(jī)制之一,事件
    發(fā)表于 10-05 09:15

    【NUCLEO-F412ZG試用體驗(yàn)】FreeRTOS_事件標(biāo)志實(shí)現(xiàn)任務(wù)和中斷的同步

    使用事件標(biāo)志可以實(shí)現(xiàn)任務(wù)任務(wù)之間以及任務(wù)和中斷之間
    發(fā)表于 12-28 21:19

    怎么才能讓任務(wù)等待到事件標(biāo)志后一直執(zhí)行并且還要把事件標(biāo)志清零?

    一個(gè)任務(wù)等待事件標(biāo)志執(zhí)行有掛起和不掛起之分,等待到事件標(biāo)志就執(zhí)行一次并且把事件標(biāo)志清零,等待
    發(fā)表于 09-20 03:49

    怎樣去設(shè)置FreeRTOS事件標(biāo)志的事件位呢

    事件標(biāo)志是什么意思呢?怎樣去設(shè)置FreeRTOS事件標(biāo)志的事件位呢?
    發(fā)表于 02-28 06:44

    FreeRTOS中如何在多任務(wù)中訪問(wèn)外設(shè)?

    FreeRTOS中兩個(gè)任務(wù)需要輪流使用通過(guò)一個(gè)SPI獲取外部ADC的采集數(shù)據(jù),如何保證兩個(gè)任務(wù)同步?用隊(duì)列,互斥,信號(hào)量還是事件標(biāo)志
    發(fā)表于 11-10 06:23

    FreeRTOS的事件標(biāo)志

    之前介紹了使用信號(hào)量來(lái)完成同步,但是使用信號(hào)量來(lái)同步的話,任務(wù)只能與單個(gè)的事件或任務(wù)進(jìn)行同步。有時(shí)候某個(gè)
    的頭像 發(fā)表于 02-10 15:58 ?1388次閱讀

    FreeRTOS的消息隊(duì)列

    基于 FreeRTOS 的應(yīng)用程序由一獨(dú)立的任務(wù)構(gòu)成——每個(gè)任務(wù)都是具有獨(dú)立權(quán)限的程序。這些獨(dú)立的任務(wù)
    的頭像 發(fā)表于 02-14 09:56 ?1207次閱讀
    <b class='flag-5'>FreeRTOS</b>的消息隊(duì)列

    FreeRTOS創(chuàng)建事件標(biāo)志

    創(chuàng)建事件標(biāo)志 3、設(shè)置事件位 4、獲取事件標(biāo)志值 5、等待指定的事件位 某個(gè)任務(wù)可能需要與多個(gè)事件進(jìn)行
    的頭像 發(fā)表于 07-06 17:23 ?730次閱讀
    <b class='flag-5'>FreeRTOS</b>創(chuàng)建事件<b class='flag-5'>標(biāo)志</b><b class='flag-5'>組</b>