精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

汽車電子技術 ? 來源:玩轉單片機 ? 作者:Julian ? 2023-02-10 14:43 ? 次閱讀

FreeRTOS 中,每個執(zhí)行線程都被稱為”任務”。在嵌入式社區(qū)中,對此并沒有一個公允的術語,但我更喜歡用”任務”而不是”線程”,因為從以前的經驗來看,線程具有更多的特定含義。

創(chuàng)建任務的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)建的任務函數(shù)的函數(shù)名,用于指向需要運行的任務

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

usStackDepth:任務堆棧大小(實際上申請到的是這里的4倍,單位為字, 4 個字節(jié)),設的太小任務 可能無法運行!

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

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

pxCreatedTask:任務句柄,實際是一個指針,也是任務的任務堆棧

返回值:

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

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

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

vTaskDelete( TaskHandle_t xTaskToDelete )

xTaskToDelete:要刪除的任務的任務句柄

臨界區(qū)

臨界區(qū)就是一段在執(zhí)行的時候不能被中斷的代碼段。在多任務操作系統(tǒng)里面,對全局變量的操作不能被打斷,不能執(zhí)行到一半就被其他任務再次操作。一般被打斷,原因就是系統(tǒng)調度或外部中斷。對臨界區(qū)的保護控制,歸根到底就是對系統(tǒng)中斷的使能控制。在使用臨界區(qū)時,關閉中斷響應,對部分優(yōu)先級的中斷進行屏蔽,因此臨界區(qū)不允許運行時間過長。為了對臨界區(qū)進行控制,就需要使用信號通信,實現(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

推薦應用時使用下面這樣定義數(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;

前綴初識

FreeRTOS 中,定義變量的時候往往會把變量的類型當作前綴,可以一眼知其類型。

char 型變量的前綴是 c

short 型變量的前綴是 s

long 型變量的前綴是 l

復雜的結構體,句柄等定義的變量名的前綴是 x

變量是無符號型的再加前綴 u,是指針變量則加前綴 p

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

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

任務創(chuàng)建

#include "stm32f10x.h"
#include 
#include "FreeRTOS.h"
#include "task.h"


#define START_TASK_PRIO 1       //任務優(yōu)先級
#define START_STK_SIZE 128      //任務堆棧大小
TaskHandle_t StartTask_Handler;     //任務句柄
void start_task(void *pvParameters);//任務函數(shù)


#define LED0_TASK_PRIO 2       //任務優(yōu)先級
#define LED0_STK_SIZE 50       //任務堆棧大小
TaskHandle_t LED0Task_Handler;   //任務句柄
void led0_task(void *p_arg);     //任務函數(shù)


void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;        //定義結構體變量

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //開啟時鐘

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;            //選擇你要設置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //設置推挽輸出模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設置傳輸速率
  GPIO_Init(GPIOC,&GPIO_InitStructure);                //初始化GPIO

  GPIO_SetBits(GPIOC,GPIO_Pin_0);             //將LED端口拉高,熄滅LED
}


int main( void ) 
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統(tǒng)中斷優(yōu)先級分組 4
  LED_Init(); //初始化 LED
  //創(chuàng)建開始任務
  xTaskCreate(
    (TaskFunction_t )start_task,     //任務函數(shù)
    (const char* )"start_task",     //任務名稱
    (uint16_t )START_STK_SIZE,       //任務堆棧大小
    (void* )NULL,             //傳遞給任務函數(shù)的參數(shù)
    (UBaseType_t )START_TASK_PRIO,     //任務優(yōu)先級
    (TaskHandle_t* )&StartTask_Handler  //任務句柄 
  );
  vTaskStartScheduler();  //開啟調度
}


//開始任務函數(shù)
void start_task(void *pvParameters)
{
  taskENTER_CRITICAL();   //進入臨界區(qū)
  //創(chuàng)建 LED0 任務
  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); //刪除開始任務
  taskEXIT_CRITICAL();   //退出臨界區(qū)
}


//LED0 任務函數(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--

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

    關注

    5068

    文章

    19014

    瀏覽量

    303234
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    62001
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19651
收藏 人收藏

    評論

    相關推薦

    FreeRTOS介紹與基礎任務創(chuàng)建

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

    FreeRTOS中的任務管理

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

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

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

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

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

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

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

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

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

    FreeRTOS任務的使用

    FreeRTOS學習筆記(二):任務創(chuàng)建/刪除,掛起/解掛上篇文章介紹了任務相關的基礎知識,本篇文章對F
    發(fā)表于 02-18 07:14

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

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

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

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

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

    從零入門 FreeRTOS 操作系統(tǒng)之創(chuàng)建任務啟動方式在 main() 函數(shù)中將硬件和 RTOS 系統(tǒng)先初始化好,然后創(chuàng)建一個啟動任務后就啟
    發(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'>任務</b>流程

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

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

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

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

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

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

    RA FreeRTOS任務創(chuàng)建

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

    RA FreeRTOS任務創(chuàng)建

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