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

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

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

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

CHANBAEK ? 來源:實(shí)在太懶于是不想取名 ? 作者:電路小白 ? 2023-11-07 11:43 ? 次閱讀

在數(shù)據(jù)結(jié)構(gòu)中有一種很重要的數(shù)據(jù)結(jié)構(gòu)叫做隊(duì)列,其特點(diǎn)是數(shù)據(jù)先進(jìn)先出。在FreeRTOS中也有一類隊(duì)列,我們利用這類隊(duì)列在FreeRTOS中實(shí)現(xiàn)任務(wù)與任務(wù)間的消息傳遞,所以也可以稱之為消息隊(duì)列。

隊(duì)列是任務(wù)間通信的主要形式。它們可以用于在任務(wù)之間以及中斷和任務(wù)之間發(fā)送消息。在大多數(shù)情況下,它們作為線程安全的 FIFO(先進(jìn)先出)緩沖區(qū)使用,新數(shù)據(jù)被發(fā)送到隊(duì)列的后面, 盡管數(shù)據(jù)也可以發(fā)送到前面。(拷貝自FreeRTOS開發(fā)者文檔)

圖片

隊(duì)列通過這樣子的結(jié)構(gòu)在任務(wù)間單方向傳遞消息。

在FreeRTOS的API引用文檔中我們可以看到隊(duì)列的控制函數(shù)。

圖片

我們在文檔中找到隊(duì)列創(chuàng)建函數(shù)(動(dòng)態(tài))

圖片

首先我們需要在程序中包含入queue.h文件才能使用隊(duì)列。

其次和之前幾期的操作一樣,我們需要在FreeRTOSConfig.h文件中需要配置相對應(yīng)的宏以激活該創(chuàng)建隊(duì)列的構(gòu)造函數(shù)。

xQueueCreate的參數(shù)有兩個(gè),首先是uxQueueLength隊(duì)列可同時(shí)容納的最大項(xiàng)目數(shù)簡而言之也就是:這個(gè)隊(duì)列有多長。

其次是uxItemSize,顧名思義是每一個(gè)項(xiàng)目(每個(gè)小塊塊)能存儲(chǔ)多少數(shù)據(jù)(字節(jié))

最后要強(qiáng)調(diào)的是,這個(gè)函數(shù)的返回值是QueueHandle_t,即以句柄的形式返回,因此我們創(chuàng)建任務(wù)的時(shí)候也需要以句柄變量接收其返回值。

圖片
圖片

我們在啟動(dòng)函數(shù)中加入我們創(chuàng)建隊(duì)列的函數(shù),其長度為1,每個(gè)項(xiàng)目的大小為一個(gè)字節(jié)。

圖片

我們接著在API引用文檔中找到關(guān)于隊(duì)列發(fā)送的函數(shù)(如上)。

發(fā)送的函數(shù)平平無奇,但是有幾點(diǎn)需要注意;

首先是發(fā)布項(xiàng)目按副本排隊(duì)而不是引用指針,指的是我們傳入的數(shù)據(jù)是先拷貝的臨時(shí)變量傳入,而并非我們傳入數(shù)據(jù)的地址,我想這樣子是為了避免在接收端時(shí)對數(shù)據(jù)進(jìn)行修改導(dǎo)致錯(cuò)誤。

其次是該函數(shù)不能在中斷函數(shù)中調(diào)用(有專門的函數(shù)是在中斷中發(fā)布項(xiàng)目的)

函數(shù)參數(shù)中的第三項(xiàng)xTicksWait簡單的理解就是可等待的最大時(shí)間,我們?nèi)绻覀兊年?duì)列已滿則嘗試等待,超過一定周期認(rèn)為超時(shí)則項(xiàng)目發(fā)布失敗。

我們在按鈕檢測任務(wù)中編寫:按下按鈕2時(shí)向隊(duì)列中放入字符p(p初始值為‘a(chǎn)’),每按下這個(gè)按鈕,p的值遞增。

還有一個(gè)按鈕3,按下按鈕3則在隊(duì)列中讀取一則消息,并打印出來。

void Get_info(void * pvParameters)
{
  unsigned char p = 'a';
    unsigned char r;
  while(1)
  {

    unsigned char key = KEY_Scan(0);
    BaseType_t err;
    if(key==1)
    {
      memset(informationbuff,0,400);
      vTaskGetRunTimeStats(informationbuff);
      printf("%srn",informationbuff);
    }

    if(key==2)
    {
      printf("Key_2 Pressrn");
      if(KeyNumberHandler!=NULL)//隊(duì)列句柄有效
      {

        err = xQueueSend(KeyNumberHandler,&p,10);
        p++;
        if(err!=pdTRUE)
        {
          printf("Send Fail rn");

        }
        else
        {
          printf("Send %c Successrn",p);

        }

      }
    }
    if(key==3)
    {
      printf("Key 3 Pressrn");
      if(KeyNumberHandler!=NULL)//隊(duì)列句柄有效
      {

        xQueueReceive(KeyNumberHandler,&r,10);
        printf("Queue Receive:%c rn",r);
        r = '?';//清空
      }
    }
    vTaskDelay(10);
  }
}

我們在按鈕檢測任務(wù)中加入按鈕2和按鈕3的情況,并且定義了一個(gè)變量err來檢測我們的隊(duì)列是否添加成功,我們觀察串口并看看打印情況。

可以看到,我們按下按鈕2,成功將 ‘b’ 消息送入隊(duì)列(我們是先p++再送入隊(duì)列的)

圖片

我們再繼續(xù)按下按鈕2,由于隊(duì)列的長度為1,且隊(duì)列的項(xiàng)目并沒有出隊(duì)列,因此串口會(huì)提示送入隊(duì)列失敗。

圖片

此時(shí)p等于 ' c ',我們按下按鈕3,讓數(shù)據(jù)出隊(duì)列,并且再按下一次按鈕3讀取是否有數(shù)據(jù)。

圖片

可以看到,讀取隊(duì)列之后隊(duì)列的內(nèi)容將被釋放,后續(xù)的內(nèi)容將前進(jìn)。之后我們再按下按鈕2 ,此時(shí)就可以向隊(duì)列中送入數(shù)據(jù)(我多按了一下)。

圖片

除此之外,F(xiàn)reeRTOS中還有一個(gè)函數(shù)為xQueueOverwrite,傳入?yún)?shù)除了沒有阻塞時(shí)間之外和xQueueSend一樣,它的作用為將消息送入隊(duì)列,如果沒有空間則覆蓋最后一個(gè)空間,我們將按鈕2中的函數(shù)換為該函數(shù)再試試。

圖片

我們每次送入隊(duì)列都成功,因?yàn)樗鼤?huì)把隊(duì)列的最后一個(gè)項(xiàng)目覆蓋掉。

關(guān)于隊(duì)列的介紹就到此啦,具體的API可以上FreeRTOS的官網(wǎng)查看參考文檔。

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

    關(guān)注

    3

    文章

    384

    瀏覽量

    43461
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40063
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    10877
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29288
收藏 人收藏

    評論

    相關(guān)推薦

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

    在嵌入式編程中,定時(shí)器是一個(gè)非常重要且強(qiáng)大的功能,用來幫我們定時(shí)性的調(diào)用中斷服務(wù)函數(shù)來幫助我們處理程序。定時(shí)器通常是用硬件來實(shí)現(xiàn)的,例如STM32F407就有8個(gè)硬件定時(shí)器。
    的頭像 發(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實(shí)驗(yàn)

    STM32F407 UCOS III實(shí)驗(yàn),介紹基于STM32F407的UCOSIII實(shí)例,參考下
    發(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枚舉-列舉同一寄存器的不同選項(xiàng)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)注幾個(gè)文檔: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èi)下載。
    發(fā)表于 07-31 11:01 ?168次下載

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

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