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

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

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

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

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

本期在二進(jìn)制信號(hào)量的基礎(chǔ)上介紹計(jì)數(shù)信號(hào)量

01基本介紹

圖片

01.什么是計(jì)數(shù)信號(hào)量

計(jì)數(shù)信號(hào)量顧名思義是用來(lái)計(jì)數(shù)的信號(hào)量,相比于二進(jìn)制信號(hào)量,計(jì)數(shù)信號(hào)量的并不只有兩種狀態(tài)。用官方的開(kāi)發(fā)者文檔中的話(huà)來(lái)說(shuō),計(jì)數(shù)信號(hào)量可以看作長(zhǎng)度大于1的隊(duì)列,我們并不關(guān)心其中的內(nèi)容而是關(guān)系隊(duì)列是否為空。

關(guān)于隊(duì)列的公眾號(hào)可以參考這篇文章。

02.如何創(chuàng)建計(jì)數(shù)信號(hào)量

圖片

官方的參考文檔中提供了兩種創(chuàng)建方式(動(dòng)態(tài)和靜態(tài))我們使用動(dòng)態(tài)創(chuàng)建方式。調(diào)用xSemaphoreCreateCounting函數(shù)

其中包含了兩個(gè)參數(shù),一個(gè)是最大計(jì)數(shù)量還有一個(gè)是初始計(jì)數(shù)量。

創(chuàng)建一個(gè)SemaphoreHandler_t類(lèi)型的句柄變量用以接收返回值。

03.釋放和獲取信號(hào)量

釋放和獲取信號(hào)量和上一期二進(jìn)制信號(hào)量的釋放和獲取方式一樣。均是調(diào)用

xSemaphoreGive釋放信號(hào)量以及調(diào)用

xSemaphoreTake獲取信號(hào)量。

但是計(jì)數(shù)信號(hào)量則多了一個(gè)可以調(diào)用的函數(shù)。

圖片

調(diào)用這個(gè)函數(shù)我們就可以獲得計(jì)數(shù)值啦。

02代碼編寫(xiě)

1測(cè)試流程

我們做兩個(gè)實(shí)驗(yàn),首先是使用一個(gè)LED函數(shù),函數(shù)每翻轉(zhuǎn)一次就向計(jì)數(shù)信號(hào)量釋放一次信號(hào)。

第二個(gè)函數(shù)輪詢(xún)計(jì)數(shù)信號(hào)量,當(dāng)計(jì)數(shù)信號(hào)量的數(shù)量比一半多時(shí),使另一個(gè)LED也開(kāi)始進(jìn)行翻轉(zhuǎn)并同樣釋放信號(hào)量。當(dāng)計(jì)數(shù)信號(hào)量到達(dá)最大數(shù)時(shí),關(guān)閉第二個(gè)燈的翻轉(zhuǎn)。

2大體思路

第一個(gè)LED燈翻轉(zhuǎn),發(fā)送信號(hào)量。定義一個(gè)輪詢(xún)函數(shù)用來(lái)時(shí)刻檢測(cè)信號(hào)量狀況,當(dāng)信號(hào)量到達(dá)一定數(shù)量時(shí)恢復(fù)LED2任務(wù)的運(yùn)行,當(dāng)信號(hào)量滿(mǎn)時(shí)清空信號(hào)量列表并掛起LED2

任務(wù)的掛起與恢復(fù)可以參考這期。

3代碼編寫(xiě)

首先是任務(wù)啟動(dòng)函數(shù),在這個(gè)函數(shù)中我們要?jiǎng)?chuàng)建一個(gè)計(jì)數(shù)信號(hào)量并且啟動(dòng)其他的相關(guān)任務(wù)函數(shù)。

void Start_LED(void * pvParameters)
{
  taskENTER_CRITICAL();                            

  LED_SemaphoreHandler = xSemaphoreCreateCounting(20,0);//最大計(jì)數(shù)20,初始0
  if(LED_SemaphoreHandler!=NULL)
  {
    printf("Semaphore Create Successfullyrn");
  }

  xTaskCreate((TaskFunction_t        )LED_TOG,//任務(wù)函數(shù)
              (char *                )"LED_TOG",//任務(wù)名稱(chēng)
              (configSTACK_DEPTH_TYPE) 128,//堆??臻g128Byte
              (void*                 ) NULL,//無(wú)返回
              (UBaseType_t          ) 1,//優(yōu)先級(jí)1
              (TaskHandle_t *        )&LED_TOG_Handler);//任務(wù)函數(shù)句柄

   xTaskCreate((TaskFunction_t        )LED_TOG2,//任務(wù)函數(shù)
              (char *                )"LED_TOG2",//任務(wù)名稱(chēng)
              (configSTACK_DEPTH_TYPE) 128,//堆??臻g128Byte
              (void*                 ) NULL,//無(wú)返回
              (UBaseType_t          ) 2,//優(yōu)先級(jí)1
              (TaskHandle_t *        )&LED_TOG2_Handler);//任務(wù)函數(shù)句柄

     xTaskCreate((TaskFunction_t        )CountTest,//任務(wù)函數(shù)
              (char *                )"GetCount",//任務(wù)名稱(chēng)
              (configSTACK_DEPTH_TYPE) 128,//堆棧空間128Byte
              (void*                 ) NULL,//無(wú)返回
              (UBaseType_t          ) 0,//優(yōu)先級(jí)1
              (TaskHandle_t *        )&GetCount_Handler);//任務(wù)函數(shù)句柄

  taskEXIT_CRITICAL();
  vTaskSuspend(LED_TOG2_Handler);
  vTaskDelete(NULL);
}

其次LED函數(shù)的內(nèi)容非常簡(jiǎn)單,檢測(cè)信號(hào)量是否創(chuàng)建(指針不為空)如果指針不為空則翻轉(zhuǎn)LED,并且釋放信號(hào)量。(注意第二個(gè)LED的函數(shù)不釋放信號(hào)量防止釋放兩次信號(hào)量)

void LED_TOG(void * pvParameters)//參數(shù)為 void * pvParameters
{

  while(1)
  {
    if(LED_SemaphoreHandler!=NULL)
    {
      HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
      xSemaphoreGive(LED_SemaphoreHandler);
    }

    vTaskDelay(500);//延遲500ms
  }
}


void LED_TOG2(void * pvParameters)//參數(shù)為 void * pvParameters
{
  while(1)
  {
    if(LED_SemaphoreHandler!=NULL)
    {
      HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    }
    vTaskDelay(500);
  }
}

在循環(huán)檢測(cè)函數(shù)中,我們定義一個(gè)count來(lái)接收計(jì)數(shù)信號(hào)量的數(shù)量。接著當(dāng)信號(hào)量大于10時(shí)我們恢復(fù)LED2函數(shù)的運(yùn)行(可以多次恢復(fù),只有一次效果)。

當(dāng)信號(hào)量為20時(shí),我們先暫停LED1函數(shù)的運(yùn)行防止我們清空信號(hào)量的時(shí)候LED1又在釋放信號(hào)量。之后通過(guò)不斷的獲取信號(hào)量來(lái)清空信號(hào)量,因?yàn)樾盘?hào)量本質(zhì)就是隊(duì)列,之后恢復(fù)他們的運(yùn)行。

void CountTest(void * pvParameters)
{
  while(1)
  {
    BaseType_t count;
    if(LED_SemaphoreHandler!=NULL)
    {
      count = uxSemaphoreGetCount(LED_SemaphoreHandler);
      if(count >= 9 )
      {
        vTaskResume(LED_TOG2_Handler);//恢復(fù)函數(shù)2
      }
      if(count >= 20 )
      {
        vTaskSuspend(LED_TOG_Handler);//先掛起函數(shù)1
        while(count != 0)
        {
          xSemaphoreTake(LED_SemaphoreHandler,10);
          count = uxSemaphoreGetCount(LED_SemaphoreHandler);
        }

        vTaskResume(LED_TOG_Handler);//恢復(fù)函數(shù)1
        vTaskSuspend(LED_TOG2_Handler);//掛起函數(shù)2
      }

    }
    vTaskDelay(10);
  }
}
聲明:本文內(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)投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    761

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

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

    關(guān)注

    0

    文章

    53

    瀏覽量

    8282
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    在嵌入式編程中,定時(shí)器是一個(gè)非常重要且強(qiáng)大的功能,用來(lái)幫我們定時(shí)性的調(diào)用中斷服務(wù)函數(shù)來(lái)幫助我們處理程序。定時(shí)器通常是用硬件來(lái)實(shí)現(xiàn)的,例如STM32F407就有8個(gè)硬件定時(shí)器。
    的頭像 發(fā)表于 11-08 11:08 ?710次閱讀
    基于<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ù)存在的問(wèn)題總結(jié))-【資源描述】:STM32F407 DCMI攝像頭源碼【編程語(yǔ)言】:C語(yǔ)言
    發(fā)表于 09-16 16:15 ?123次下載
    <b class='flag-5'>STM32F407</b> DCMI攝像頭源碼

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

    STM32F407標(biāo)準(zhǔn)庫(kù)學(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)庫(kù)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-AFIO未完

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

    STM32F407標(biāo)準(zhǔn)庫(kù)學(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)庫(kù)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>-RCC

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

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

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

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

    STM32F407原理圖下載

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

    stm32f407原理圖

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

    STM32F407最小系統(tǒng)

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

    STM32F407 FreeRTOS開(kāi)發(fā)手冊(cè) V1.1

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