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

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

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

FreeRTOS的事件標(biāo)志組

汽車電子技術(shù) ? 來源:玩轉(zhuǎn)單片機(jī) ? 作者: Julian ? 2023-02-10 15:58 ? 次閱讀

之前介紹了使用信號(hào)量來完成同步,但是使用信號(hào)量來同步的話,任務(wù)只能與單個(gè)的事件或任務(wù)進(jìn)行同步。有時(shí)候某個(gè)任務(wù)可能會(huì)需要與多個(gè)事件或任務(wù)進(jìn)行同步,此時(shí)信號(hào)量就無能為力了。FreeRTOS 提供了一個(gè)可選的解決方法,那就是事件標(biāo)志組。

事件標(biāo)志位可以理解為一個(gè)Bit位,多個(gè)事件位就組成了事件標(biāo)志組,F(xiàn)reeRTOS可選8個(gè)事件標(biāo)志位或者24個(gè)事件標(biāo)志位,具體是由configUSE_16_BIT_TICKS來確定,它為1的時(shí)候是8個(gè)標(biāo)準(zhǔn)位,為0時(shí)是24個(gè)標(biāo)志位!

創(chuàng)建標(biāo)志組

EventGroupHandle_t xEventGroupCreate( void );

返回值:

創(chuàng)建失敗返回NULL,創(chuàng)建成功返回句柄

置位API函數(shù)

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
                                 const EventBits_t uxBitsToSet );

參數(shù)

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

uxBitsToSet:寫入數(shù)值,例如0x09就表示置位第0位和第三位

讀取事件組的位

EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup,
                                 const EventBits_t uxBitsToWaitFor,
                                 const BaseType_t xClearOnExit,
                                 const BaseType_t xWaitForAllBits,
                                 TickType_t xTicksToWait );

參數(shù):

xEventGroup:事件標(biāo)志組的句柄

uxBitsToWaitFor:需要等待的標(biāo)志位

xClearOnExit:是否需要清除標(biāo)志位

xWaitForAllBits:是否等待所有設(shè)定標(biāo)志位

xTicksToWait:最大等待時(shí)間

注意:更多API函數(shù),請(qǐng)參考官方相關(guān)

附上簡(jiǎn)單使用應(yīng)用

#include "stm32f10x.h"
#include 
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"


#define START_TASK_PRIO 1      //任務(wù)優(yōu)先級(jí)
#define START_STK_SIZE 128      //任務(wù)堆棧大小
TaskHandle_t StartTask_Handler;   //任務(wù)句柄
void start_task(void *pvParameters);//任務(wù)函數(shù)


#define LED0_TASK_PRIO 2       //任務(wù)優(yōu)先級(jí)
#define LED0_STK_SIZE 50       //任務(wù)堆棧大小
TaskHandle_t LED0Task_Handler;     //任務(wù)句柄
void led0_task(void *p_arg);     //任務(wù)函數(shù)


EventGroupHandle_t Event_Handle = NULL;//事件標(biāo)志組的句柄


void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;        //定義結(jié)構(gòu)體變量

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //開啟時(shí)鐘

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;            //選擇你要設(shè)置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //設(shè)置推挽輸出模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設(shè)置傳輸速率
  GPIO_Init(GPIOC,&GPIO_InitStructure);                //初始化GPIO

  GPIO_SetBits(GPIOC,GPIO_Pin_0);             //將LED端口拉高,熄滅LED
}


int main( void ) 
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組 4
  LED_Init(); //初始化 LED
  //創(chuàng)建任務(wù)標(biāo)志組
  Event_Handle = xEventGroupCreate();
  //置位標(biāo)志位
  xEventGroupSetBits( ( EventGroupHandle_t) Event_Handle,
            ( EventBits_t )       0x08       );

  //創(chuàng)建開始任務(wù)
  xTaskCreate(
    (TaskFunction_t )start_task,     //任務(wù)函數(shù)
    (const char* )"start_task",     //任務(wù)名稱
    (uint16_t )START_STK_SIZE,       //任務(wù)堆棧大小
    (void* )NULL,             //傳遞給任務(wù)函數(shù)的參數(shù)
    (UBaseType_t )START_TASK_PRIO,     //任務(wù)優(yōu)先級(jí)
    (TaskHandle_t* )&StartTask_Handler  //任務(wù)句柄 
  );
  vTaskStartScheduler();  //開啟調(diào)度
}
//開始任務(wù)函數(shù)
void start_task(void *pvParameters)
{
  taskENTER_CRITICAL();   //進(jìn)入臨界區(qū)
  //創(chuàng)建 LED0 任務(wù)
  xTaskCreate(
    (TaskFunction_t )led0_task, 
    (const char* )"led0_task", 
    (uint16_t )LED0_STK_SIZE, 
    (void* )NULL,
    (UBaseType_t )LED0_TASK_PRIO,
    (TaskHandle_t* )&LED0Task_Handler
  );
  vTaskDelete(StartTask_Handler); //刪除開始任務(wù)
  taskEXIT_CRITICAL();   //退出臨界區(qū)
}


//LED0 任務(wù)函數(shù)
void led0_task(void *pvParameters)
{
  while(1)
  {
    xEventGroupWaitBits( ( EventGroupHandle_t ) Event_Handle,  //句柄
               ( EventBits_t        ) 0x08,      //需要等待的位
               ( BaseType_t         ) pdTRUE ,    //需要清零
               ( BaseType_t         ) pdTRUE,      //等待所有設(shè)定標(biāo)志位
               ( TickType_t         ) portMAX_DELAY );//死等待

    if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_0))
    {
      GPIO_ResetBits( GPIOC, GPIO_Pin_0);
    }
    else
    {
      GPIO_SetBits( GPIOC, GPIO_Pin_0);
    }
    //置位標(biāo)志位
    xEventGroupSetBits( ( EventGroupHandle_t) Event_Handle,
              ( EventBits_t )       0x08         );

    vTaskDelay(400);
  }
}

注意:如果LED0任務(wù)中的置位函數(shù),那么LED0函數(shù)只會(huì)運(yùn)行一次,因?yàn)闃?biāo)志位已經(jīng)清除了,需要再次置位標(biāo)志位才會(huì)繼續(xù)運(yùn)行!

--END--

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62278
  • 信號(hào)量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

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

    關(guān)注

    0

    文章

    3

    瀏覽量

    1304
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    使用STM32CubeMX生成的FreeRTOS系統(tǒng)中,似乎沒有新封裝的事件標(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)建和處理,在中斷中可以通過事件傳遞信息給其他的任務(wù),那么如何創(chuàng)建事件呢?要使用創(chuàng)建Event的API,首先必須配置,且包含
    發(fā)表于 08-12 18:29

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

    第18章FreeRTOS事件標(biāo)志 前面的章節(jié)我們已經(jīng)講解了任務(wù)管理和時(shí)間管理,從本章節(jié)開始講解任務(wù)間的通信和同步機(jī)制。首先講解任務(wù)間的通信和同步機(jī)制之一,事件標(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

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

    使用事件標(biāo)志可以實(shí)現(xiàn)任務(wù)和任務(wù)之間以及任務(wù)和中斷之間的通信或者同步。首先說明,本例程參考了《安富萊_STM32-V5開發(fā)板_FreeRTOS教程(V1.0)》,是在上上期報(bào)告的基礎(chǔ)上,把按鍵中斷由
    發(fā)表于 12-28 21:19

    UCOS3的事件標(biāo)志

    我理解的事件標(biāo)志主要功能就是根據(jù)同步標(biāo)志組里面的信號(hào)的標(biāo)志位來執(zhí)行語句。比如有A,B,C三個(gè)信號(hào),當(dāng)我們有一個(gè)任務(wù)D需要ABC三個(gè)信號(hào)都到了之后再去執(zhí)行任務(wù)D.這時(shí)候就可以用到任務(wù)
    發(fā)表于 05-11 14:27

    freertos中斷置位事件標(biāo)志輸出Error的解決辦法?

    新人求教,在原子里的程序加了置位標(biāo)志,串口輸出Error:..\FreeRTOS\portable\RVDS\ARM_CM3\port.c,680,但是不影響程序的運(yùn)行,這個(gè)是什么原因
    發(fā)表于 06-18 09:00

    【轉(zhuǎn)載】AT32 FreeRTOS應(yīng)用筆記

    ........................................83例程介紹 ...................................................... 85FreeRTOS 事件標(biāo)志
    發(fā)表于 08-16 11:56

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

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

    UCOS擴(kuò)展例程-UCOSIII事件標(biāo)志

    UCOS擴(kuò)展例程- UCOSIII事件標(biāo)志
    發(fā)表于 12-14 17:24 ?14次下載

    freeRTOS中的消息郵箱

    freeRTOS中的消息郵箱使用是比較靈活的,它可以實(shí)現(xiàn)二值信號(hào)量、計(jì)數(shù)信號(hào)量、事件標(biāo)志、消息隊(duì)列等通知方式。
    的頭像 發(fā)表于 02-10 11:05 ?1632次閱讀
    <b class='flag-5'>freeRTOS</b>中的消息郵箱

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

    freeRTOS中還有一種可以用于任務(wù)之間同步的手段 — 事件標(biāo)志。
    的頭像 發(fā)表于 02-10 11:10 ?1566次閱讀

    FreeRTOS事件標(biāo)志介紹

    1、事件位(事件標(biāo)志) 事件位用來表明某個(gè)事件是否發(fā)生,事件位通常用作事件標(biāo)志,比如下面的幾個(gè)例子: ● 當(dāng)收到一條消息并且把這條消息處理掉以后就可以將某個(gè)位(標(biāo)志)置 1,當(dāng)隊(duì)列中沒有消息需要處理
    的頭像 發(fā)表于 07-06 17:22 ?603次閱讀

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

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