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

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

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

FreeRTOS的任務(wù)創(chuàng)建與刪除

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

FreeRTOS 中,每個(gè)執(zhí)行線程都被稱為”任務(wù)”。在嵌入式社區(qū)中,對(duì)此并沒有一個(gè)公允的術(shù)語,但我更喜歡用”任務(wù)”而不是”線程”,因?yàn)閺囊郧暗慕?jīng)驗(yàn)來看,線程具有更多的特定含義。

創(chuàng)建任務(wù)的API函數(shù)(可以在tasks.c文件中找到)

BaseType_t xTaskCreate(  TaskFunction_t pxTaskCode,
              const char * const pcName,
              const uint16_t usStackDepth,
              void * const pvParameters,
              UBaseType_t uxPriority,
              TaskHandle_t * const pxCreatedTask )
typedef void (*TaskFunction_t)( void * );
typedef long BaseType_t
typedef unsigned long UBaseType_t
typedef void * TaskHandle_t;

參數(shù)

pxTaskCode:自己創(chuàng)建的任務(wù)函數(shù)的函數(shù)名,用于指向需要運(yùn)行的任務(wù)

pcName:任務(wù)的名字,字符串型,名稱可以隨意起,一般與函數(shù)名相同

usStackDepth:任務(wù)堆棧大小(實(shí)際上申請(qǐng)到的是這里的4倍,單位為字, 4 個(gè)字節(jié)),設(shè)的太小任務(wù) 可能無法運(yùn)行!

pvParameters:任務(wù)函數(shù)的參數(shù),不需要傳參設(shè)為NULL即可

uxPriority:任務(wù)優(yōu)先級(jí),0~(configMAX_PRIORITIES-1),數(shù)值越大優(yōu)先級(jí)越高,0 代表最低優(yōu)先級(jí)

pxCreatedTask:任務(wù)句柄,實(shí)際是一個(gè)指針,也是任務(wù)的任務(wù)堆棧

返回值:

pdPASS:數(shù)值1,任務(wù)創(chuàng)建成功,且添加到就緒列表

錯(cuò)誤代碼:負(fù)數(shù),任務(wù)創(chuàng)建識(shí)別

刪除任務(wù)的API函數(shù)(可以在tasks.c文件中找到)

vTaskDelete( TaskHandle_t xTaskToDelete )

xTaskToDelete:要?jiǎng)h除的任務(wù)的任務(wù)句柄

臨界區(qū)

臨界區(qū)就是一段在執(zhí)行的時(shí)候不能被中斷的代碼段。在多任務(wù)操作系統(tǒng)里面,對(duì)全局變量的操作不能被打斷,不能執(zhí)行到一半就被其他任務(wù)再次操作。一般被打斷,原因就是系統(tǒng)調(diào)度或外部中斷。對(duì)臨界區(qū)的保護(hù)控制,歸根到底就是對(duì)系統(tǒng)中斷的使能控制。在使用臨界區(qū)時(shí),關(guān)閉中斷響應(yīng),對(duì)部分優(yōu)先級(jí)的中斷進(jìn)行屏蔽,因此臨界區(qū)不允許運(yùn)行時(shí)間過長(zhǎng)。為了對(duì)臨界區(qū)進(jìn)行控制,就需要使用信號(hào)通信,實(shí)現(xiàn)同步或互斥操作。

FreeRTOS數(shù)據(jù)類型(可以在portmacro.h文件找到)

#define portCHAR        char  
#define portFLOAT       float  
#define portDOUBLE      double  
#define portLONG        long  
#define portSHORT       short  
#define portSTACK_TYPE  uint32_t  
#define portBASE_TYPE   long

推薦應(yīng)用時(shí)使用下面這樣定義數(shù)據(jù)類型

typedef int int32_t;  
typedef short int16_t;  
typedef char int8_t;  
typedef unsigned int uint32_t;  
typedef unsigned short uint16_t;  
typedef unsigned char uint8_t;

前綴初識(shí)

FreeRTOS 中,定義變量的時(shí)候往往會(huì)把變量的類型當(dāng)作前綴,可以一眼知其類型。

char 型變量的前綴是 c

short 型變量的前綴是 s

long 型變量的前綴是 l

復(fù)雜的結(jié)構(gòu)體,句柄等定義的變量名的前綴是 x

變量是無符號(hào)型的再加前綴 u,是指針變量則加前綴 p

函數(shù)名包含了函數(shù)返回值的類型、函數(shù)所在的文件名和函數(shù)的功能,如果是私有的函數(shù)則會(huì)加一個(gè) prv(private)的前綴。

宏內(nèi)容是由大寫字母表示,前綴是小寫字母,表示該宏在哪個(gè)頭文件定義

任務(wù)創(chuàng)建

#include "stm32f10x.h"
#include 
#include "FreeRTOS.h"
#include "task.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ù)


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ù)
  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)
  {
    if(GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_0))
    {
      GPIO_ResetBits( GPIOC, GPIO_Pin_0);
    }
    else
    {
      GPIO_SetBits( GPIOC, GPIO_Pin_0);
    }
    vTaskDelay(400);
  }
}

--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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5060

    文章

    18975

    瀏覽量

    302113
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61919
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    504

    瀏覽量

    19636
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FreeRTOS介紹與基礎(chǔ)任務(wù)創(chuàng)建

    本篇介紹FreeRTOS與基礎(chǔ)任務(wù)創(chuàng)建
    的頭像 發(fā)表于 09-26 09:00 ?2314次閱讀
    <b class='flag-5'>FreeRTOS</b>介紹與基礎(chǔ)<b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>

    FreeRTOS中的任務(wù)管理

    任務(wù)FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨(dú)立運(yùn)行。FreeRTOS 中的任務(wù)是基于優(yōu)先級(jí)的搶占式調(diào)度,優(yōu)先級(jí)高的任務(wù)
    的頭像 發(fā)表于 11-27 17:03 ?922次閱讀

    Freertos vTaskDelete多次刪除多次創(chuàng)建同一個(gè)任務(wù),出現(xiàn)內(nèi)存不夠用效果怎么解決?

    我碰到一個(gè)問題,就是這個(gè)freertos,我創(chuàng)建任務(wù)1-->刪除任務(wù)1-->創(chuàng)建
    發(fā)表于 08-04 05:05

    ESP32--FreeRTOS任務(wù)創(chuàng)建刪除過程是怎樣的?

    ESP32--FreeRTOS任務(wù)創(chuàng)建刪除過程是怎樣的?
    發(fā)表于 01-14 06:02

    FreeRTOS任務(wù)創(chuàng)建過程

    FreeRTOS筆記(四):任務(wù)創(chuàng)建/刪除,掛起/解掛詳解在第二篇筆記中介紹了任務(wù)創(chuàng)建的API,
    發(fā)表于 02-08 06:10

    FreeRTOS創(chuàng)建任務(wù)的流程分享

    從零入門 FreeRTOS 操作系統(tǒng)之創(chuàng)建任務(wù)啟動(dòng)方式在 main() 函數(shù)中將硬件和 RTOS 系統(tǒng)先初始化好,然后創(chuàng)建一個(gè)啟動(dòng)任務(wù)后就啟
    發(fā)表于 02-11 06:59

    對(duì)FreeRTOS任務(wù)的使用

    FreeRTOS學(xué)習(xí)筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛上篇文章介紹了任務(wù)相關(guān)的基礎(chǔ)知識(shí),本篇文章對(duì)F
    發(fā)表于 02-18 07:14

    FreeRTOS任務(wù)如何創(chuàng)建刪除?

    FreeRTOS移植到Cortex-M3硬件平臺(tái)的文章中,我們已經(jīng)見過任務(wù)創(chuàng)建API,但那篇文章的重點(diǎn)在于如何移植FreeRTOS,本文將重點(diǎn)放在
    的頭像 發(fā)表于 03-11 18:08 ?2888次閱讀

    FreeRTOS筆記(四):任務(wù)創(chuàng)建/刪除,掛起/解掛詳解

    FreeRTOS筆記(四):任務(wù)創(chuàng)建/刪除,掛起/解掛詳解在第二篇筆記中介紹了任務(wù)創(chuàng)建的API,
    發(fā)表于 12-04 19:36 ?15次下載
    <b class='flag-5'>FreeRTOS</b>筆記(四):<b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>/<b class='flag-5'>刪除</b>,掛起/解掛詳解

    從零入門 FreeRTOS 操作系統(tǒng)之創(chuàng)建任務(wù)流程

    從零入門 FreeRTOS 操作系統(tǒng)之創(chuàng)建任務(wù)啟動(dòng)方式在 main() 函數(shù)中將硬件和 RTOS 系統(tǒng)先初始化好,然后創(chuàng)建一個(gè)啟動(dòng)任務(wù)后就啟
    發(fā)表于 12-07 18:36 ?7次下載
    從零入門 <b class='flag-5'>FreeRTOS</b> 操作系統(tǒng)之<b class='flag-5'>創(chuàng)建</b><b class='flag-5'>任務(wù)</b>流程

    #FreeRTOS學(xué)習(xí)筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛

    FreeRTOS學(xué)習(xí)筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛上篇文章介紹了任務(wù)相關(guān)的基礎(chǔ)知識(shí),本篇文章對(duì)F
    發(fā)表于 12-23 19:56 ?2次下載
    #<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)筆記(二):<b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>/<b class='flag-5'>刪除</b>,掛起/解掛

    FreeRTOS高級(jí)篇2---FreeRTOS任務(wù)創(chuàng)建分析

    FreeRTOS基礎(chǔ)系列《FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建刪除》中
    發(fā)表于 01-26 17:42 ?23次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>分析

    FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建刪除

    FreeRTOS移植到Cortex-M3硬件平臺(tái)的文章中,我們已經(jīng)見過任務(wù)創(chuàng)建API,但那篇文章的重點(diǎn)在于如何移植FreeRTOS,本文將重點(diǎn)放在
    發(fā)表于 01-26 17:56 ?13次下載
    <b class='flag-5'>FreeRTOS</b>系列第10篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>和<b class='flag-5'>刪除</b>

    RA FreeRTOS任務(wù)創(chuàng)建

    隨著嵌入式應(yīng)用程序變得越來越復(fù)雜,單片機(jī)裸機(jī)開發(fā)已經(jīng)無法滿足工程師對(duì)于復(fù)雜程序的需求。于是具有多任務(wù)調(diào)度和實(shí)時(shí)響應(yīng)特性的RTOS便越來越受工程師們青睞。瑞薩RA系列MCU兼容FreeRTOS系統(tǒng)
    的頭像 發(fā)表于 03-10 14:35 ?1225次閱讀

    RA FreeRTOS任務(wù)創(chuàng)建

    隨著嵌入式應(yīng)用程序變得越來越復(fù)雜,單片機(jī)裸機(jī)開發(fā)已經(jīng)無法滿足工程師對(duì)于復(fù)雜程序的需求。于是具有多任務(wù)調(diào)度和實(shí)時(shí)響應(yīng)特性的RTOS便越來越受工程師們青睞。瑞薩RA系列MCU兼容FreeRTOS系統(tǒng)
    的頭像 發(fā)表于 07-12 10:00 ?607次閱讀
    RA <b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>