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

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

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

基于STM32F407的FreeRTOS學(xué)習(xí)筆記(12)

CHANBAEK ? 來源:實在太懶于是不想取名 ? 作者: 電路小白 ? 2023-11-13 17:27 ? 次閱讀

在上一期內(nèi)容中我們簡單的介紹了任務(wù)通知的幾個函數(shù)以及簡單的使用了任務(wù)通知來實現(xiàn)兩個信號之間的通信。

本期我們將利用任務(wù)通知來模擬三種方式的任務(wù)間通信。

信號量

在我們介紹信號量的文章中介紹過,信號分為二進制信號量和計數(shù)信號量。

接著我們使用任務(wù)通知來模擬這兩項功能。

二進制信號量可以看作長度為1的隊列,我們不關(guān)心其值為多少,只關(guān)心它的狀態(tài)。

圖片

圖片

在直達(dá)任務(wù)通知中我們可以用xTaskNotifyGive來模擬二進制信號量的釋放以及ulTaskNotifyTake()來模擬二進制信號量的讀取。

在ulTaskNotifyTake()中需要注意的是,我們需要設(shè)置一個參數(shù)用來確定我們模擬的是二進制信號量還是計數(shù)信號量。

圖片

image.png

代碼測試

void Mid_Task(void * pvParameters)//參數(shù)為 void * pvParameters
{
  while(1)
  {
    if(KEY_Scan(0)==1)
    {
      printf("Key_Pressrn");
      xTaskNotifyGive(High_Handler);//傳入任務(wù)函數(shù)句柄,模擬信號量釋放
    }
  }
    vTaskDelay(10);
}


void High_Task(void * pvParameters)
{
  BaseType_t err;
  while(1)
  {
    err = ulTaskNotifyTake(pdFALSE,10);//讀取后清零,模擬二進制信號量
    if(err == pdTRUE)
    {
      printf("Recieve Message!rn");
    }
    vTaskDelay(10);
  }
}

圖片

模擬二進制信號量成功。

之后,我們將接收的函數(shù)中的pdFALSE修改為pdTRUE,這樣子我們就可以模擬我們的計數(shù)信號量了。

這里就不作演示了,但是要注意的是,只用這樣子的模擬二進制信號量也要注意優(yōu)先級反轉(zhuǎn)問題,關(guān)于優(yōu)先級反轉(zhuǎn)的問題可以參考公眾號中的關(guān)于二進制信號量的文章。

事件組

合理的運用RTOS中的事件組可以很好的處理許多事件,在事件組的介紹中我們說過,我們常用的事件組可以做到24位事件位。而在直達(dá)任務(wù)通知中,我們也同樣可以指定某些位的改變來實現(xiàn)事件組的效果。

圖片

我們可以修改xTaskNotify中的eAction來將通知值作為事件組,修改特定位來實現(xiàn)事件位的效果。

代碼測試

void Mid_Task(void * pvParameters)//參數(shù)為 void * pvParameters
{
  int i = 0; 
  while(1)
  {
    if(KEY_Scan(0)==1)
    {
      printf("Key_Press keynumber : 1rn");
      xTaskNotify( (TaskHandle_t) High_Handler,//目標(biāo)任務(wù)句柄
                   (uint32_t) 0x04,//第二位 00000100
                   (eNotifyAction) eSetBits);//位設(shè)置模式,模擬事件組
    }
    if(KEY_Scan(0)==2)
    {
      printf("Key_Press keynumber : 2rn");
      xTaskNotify( (TaskHandle_t) High_Handler,//目標(biāo)任務(wù)句柄
                   (uint32_t) 0x08,//第三位  00001000
                   (eNotifyAction) eSetBits);//位設(shè)置模式,模擬事件組
    }
  }
    vTaskDelay(10);
}


void High_Task(void * pvParameters)
{
  BaseType_t err;
  uint32_t number;//存放通知值
  uint32_t Value;  //模擬事件組
  while(1)
  {
     err =  xTaskNotifyWait( (uint32_t) 0x0000,//不清理
                             (uint32_t) 0xffff,//清理當(dāng)前
                             (uint32_t*) &number,//接收任務(wù)值
                             (TickType_t) 10 );//等待事件
    Value = Value | number ; //獲得事件位
    if((Value&(0x08+0x04)) == (0x08+0x04))
    {
      printf("KEY1 and KEY2 have Pressedrn"); 
      Value = 0;//事件組清零
    }
    vTaskDelay(10);
  }
}

圖片

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

    關(guān)注

    2

    文章

    772

    瀏覽量

    41534
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849
  • 信號量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8296
收藏 人收藏

    評論

    相關(guān)推薦

    基于STM32F407FreeRTOS學(xué)習(xí)筆記(9)

    在嵌入式編程中,定時器是一個非常重要且強大的功能,用來幫我們定時性的調(diào)用中斷服務(wù)函數(shù)來幫助我們處理程序。定時器通常是用硬件來實現(xiàn)的,例如STM32F407就有8個硬件定時器。
    的頭像 發(fā)表于 11-08 11:08 ?841次閱讀
    基于<b class='flag-5'>STM32F407</b>的<b class='flag-5'>FreeRTOS</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(9)

    STM32F407模板

    STM32F407模板,感興趣可以看看。
    發(fā)表于 07-25 18:52 ?130次下載

    STM32F407 UCOS III實驗

    STM32F407 UCOS III實驗,介紹基于STM32F407的UCOSIII實例,參考下
    發(fā)表于 09-22 14:08 ?81次下載

    STM32F407 DCMI攝像頭源碼

    STM32F407 DCMI攝像頭源碼(電源技術(shù)存在的問題總結(jié))-【資源描述】:STM32F407 DCMI攝像頭源碼【編程語言】:C語言
    發(fā)表于 09-16 16:15 ?123次下載
    <b class='flag-5'>STM32F407</b> DCMI攝像頭源碼

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-AFIO未完

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-AFIO- 頭文件 gpio.h#define GPIO_PinSource0 ((uint8_t)0x00)#define
    發(fā)表于 11-29 15:36 ?2次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-AFIO未完

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-RCC

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-RCC- rcc.htypedef struct{ uint32_t SYSCLK_Frequency; /*!< SYSCLK clock
    發(fā)表于 11-29 15:51 ?13次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-RCC

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-GPIO

    STM32F407標(biāo)準(zhǔn)庫學(xué)習(xí)筆記-GPIO頭文件 gpio.h枚舉-列舉同一寄存器的不同選項typedef enum{ GPIO_Low_Speed = 0x00, /*!<
    發(fā)表于 11-29 15:51 ?46次下載
    <b class='flag-5'>STM32F407</b>標(biāo)準(zhǔn)庫<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-GPIO

    STM32F407的串口UART 基礎(chǔ)配置STM32CubeMX

    STM32F407的串口UART 基礎(chǔ)配置STM32CubeMX
    發(fā)表于 11-29 16:06 ?54次下載
    <b class='flag-5'>STM32F407</b>的串口UART 基礎(chǔ)配置<b class='flag-5'>STM32</b>CubeMX

    [STM32]STM32F407系列教程之四,pwm產(chǎn)生原理

    [STM32]STM32F407系列教程之四,pwm產(chǎn)生原理
    發(fā)表于 11-29 17:51 ?51次下載
    [<b class='flag-5'>STM32</b>]<b class='flag-5'>STM32F407</b>系列教程之四,pwm產(chǎn)生原理

    STM32F407芯片介紹

    1. 文檔準(zhǔn)備做嵌入式開發(fā)的第一步就是了解主芯片,了解STM32F407主要要關(guān)注幾個文檔:1. stm32F407芯片手冊2. stm32F407參考手冊3. Arm Cortex-M4數(shù)據(jù)手冊
    發(fā)表于 12-04 13:21 ?109次下載
    <b class='flag-5'>STM32F407</b>芯片介紹

    STM32F407開發(fā)板用戶手冊】第1章?? 初學(xué)STM32F407的準(zhǔn)備工作

    STM32F407開發(fā)板用戶手冊】第1章?? 初學(xué)STM32F407的準(zhǔn)備工作
    發(fā)表于 12-04 13:36 ?75次下載
    【<b class='flag-5'>STM32F407</b>開發(fā)板用戶手冊】第1章?? 初學(xué)<b class='flag-5'>STM32F407</b>的準(zhǔn)備工作

    STM32F407原理圖下載

    STM32F407原理圖下載
    發(fā)表于 01-17 13:44 ?417次下載

    stm32f407原理圖

    stm32f407原理圖
    發(fā)表于 07-14 16:07 ?202次下載

    STM32F407最小系統(tǒng)

    STM32F407最小系統(tǒng)免費下載。
    發(fā)表于 07-31 11:01 ?168次下載

    STM32F407 FreeRTOS開發(fā)手冊 V1.1

    STM32F407 FreeRTOS開發(fā)手冊_V1.1PDF文件下載。
    發(fā)表于 07-31 11:16 ?52次下載