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

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

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

基于STM32F407的FreeRTOS學習筆記(2)

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

上一期配置完FreeRTOS的環(huán)境后,這一期記錄自己關(guān)于任務(wù)創(chuàng)建的學習過程。

圖片

官方的API手冊中有這些函數(shù),xTaskCreate和xTaskCreateStatic分別是利用動態(tài)方法和靜態(tài)方法創(chuàng)建任務(wù)。(動態(tài)和靜態(tài)的區(qū)別之后再研究)vTaskDelete是刪除任務(wù),因為freeRTOS的任務(wù)內(nèi)存空間存儲在堆區(qū),所以很像C語言的動態(tài)內(nèi)存分配,任務(wù)使用和結(jié)束我們都應(yīng)該創(chuàng)建和刪除這些任務(wù)防止占用過多空間。

xTaskCreate的函數(shù)模型如下,參數(shù)內(nèi)容總共有六項:任務(wù)函數(shù)的函數(shù)指針,任務(wù)函數(shù)的名稱,任務(wù)函數(shù)所需堆??臻g,任務(wù)函數(shù)的類型,任務(wù)函數(shù)的優(yōu)先級,以及任務(wù)函數(shù)的函數(shù)句柄

圖片

vTaskDelete的函數(shù)模型如下,參數(shù)內(nèi)容為函數(shù)句柄,如果為NULL則刪除該任務(wù)本身。

圖片

因此我們創(chuàng)建任務(wù)的步驟是:首先定義一個啟動任務(wù),該任務(wù)是為了啟動我們的真正任務(wù),因此在調(diào)用完一遍后要用vTaskDelete 中輸入NULL刪除啟動函數(shù)本身。

圖片

任務(wù)函數(shù)編寫

/*
LED1翻轉(zhuǎn)
*/
void LED_TOG(void * pvParameters)//參數(shù)為 void * pvParameters
{
  while(1)
  {
    printf("LED_TOG runningrn");//串口打印運行信息
    HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);//LED1翻轉(zhuǎn)
    vTaskDelay(500);//延遲500ms
  }
}

要注意的是vTaskDelay是FreeRTOS用來延時的函數(shù)。

圖片

之后我們要創(chuàng)建任務(wù)函數(shù)的啟動函數(shù)

TaskHandle_t Start_LED_Handler;


void Start_LED(void * pvParameters)
{
  xTaskCreate((TaskFunction_t        )LED_TOG,//任務(wù)函數(shù)
              (char *                )"LED_TOG",//任務(wù)名稱
              (configSTACK_DEPTH_TYPE) 128,//堆棧空間128Byte
              (void*                 ) NULL,//無返回
              (UBaseType_t          ) 1,//優(yōu)先級1
              (TaskHandle_t *        )LED_TOG_Handler);//任務(wù)函數(shù)句柄
  vTaskDelete(NULL);
}

我們創(chuàng)建啟動任務(wù)的函數(shù),將 任務(wù)函數(shù)的函數(shù)指針,任務(wù)函數(shù)的名稱,任務(wù)函數(shù)所需堆??臻g,任務(wù)函數(shù)的類型,任務(wù)函數(shù)的優(yōu)先級,以及任務(wù)函數(shù)的函數(shù)句柄 ,填入vTaskCreate函數(shù)中,其中每個參數(shù)都使用了強制類型轉(zhuǎn)換防止出現(xiàn)錯誤。

同樣的方法,我們創(chuàng)建啟動 啟動函數(shù)的任務(wù)(有點繞口因為啟動函數(shù)本身是一個任務(wù))

void FreeRTOS_Init()
{
  xTaskCreate((TaskFunction_t        )Start_LED,
              (char *                )"Start_LED",
              (configSTACK_DEPTH_TYPE) 128,
              (void*                 ) NULL,
              (UBaseType_t          ) 0,
              (TaskHandle_t *        )Start_LED_Handler);
  vTaskStartScheduler();//啟動運行函數(shù)
}

這樣子我們在主函數(shù)中添加剛剛定義的啟動啟動函數(shù)

int main(void)
{
  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


  /* USER CODE BEGIN Init */
  KEY_Init();
  /* USER CODE END Init */


  /* Configure the system clock */
  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  FreeRTOS_Init();
  /* USER CODE END 2 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

我們的代碼就可以正常運行啦!

我們在用上述的方法實現(xiàn)兩個燈一起翻轉(zhuǎn)

還是先編輯任務(wù)函數(shù)如下,并且定義其相關(guān)句柄

TaskHandle_t LED_TOG2_Handler;
void LED_TOG2(void * pvParameters)//參數(shù)為 void * pvParameters
{
  while(1)
  {
    printf("LED_TOG runningrn");//串口打印運行信息
    HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻轉(zhuǎn)
    vTaskDelay(500);//延遲500ms
  }
}

在任務(wù)啟動函數(shù)中加入我們新建的任務(wù)。

void Start_LED(void * pvParameters)
{
  xTaskCreate((TaskFunction_t        )LED_TOG,//任務(wù)函數(shù)
              (char *                )"LED_TOG",//任務(wù)名稱
              (configSTACK_DEPTH_TYPE) 128,//堆棧空間128Byte
              (void*                 ) NULL,//無返回
              (UBaseType_t          ) 1,//優(yōu)先級1
              (TaskHandle_t *        )LED_TOG_Handler);//任務(wù)函數(shù)句柄

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

  vTaskDelete(NULL);
}

再次運行我們的代碼。

麥克阿瑟將軍曾說過:點燈對于嵌入式來說,就像Hello World對于程序員一樣重要。我們不能不去點燈,就像西方不能失去耶路撒冷。

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

    關(guān)注

    180

    文章

    7581

    瀏覽量

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

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29288
收藏 人收藏

    評論

    相關(guān)推薦

    基于STM32F407FreeRTOS學習筆記(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'>學習</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標準庫學習筆記-AFIO未完

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

    STM32F407標準庫學習筆記-RCC

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

    STM32F407標準庫學習筆記-GPIO

    STM32F407標準庫學習筆記-GPIO頭文件 gpio.h枚舉-列舉同一寄存器的不同選項typedef enum{ GPIO_Low_Speed = 0x00, /*!<
    發(fā)表于 11-29 15:51 ?46次下載
    <b class='flag-5'>STM32F407</b>標準庫<b class='flag-5'>學習</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. 文檔準備做嵌入式開發(fā)的第一步就是了解主芯片,了解STM32F407主要要關(guān)注幾個文檔:1. stm32F407芯片手冊2. stm32F407參考手冊3. Arm Cortex-
    發(fā)表于 12-04 13:21 ?109次下載
    <b class='flag-5'>STM32F407</b>芯片介紹

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

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

    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次下載