FreeRTOS任務掛起和恢復

任務掛起:暫停某個任務的執行
任務恢復:讓暫停的任務繼續執行
通過任務掛起和恢復,可以達到讓任務停止一段時間后重新運行。
相關API函數:
在這里插入圖片描述

vTaskSuspend

void vTaskSuspend( TaskHandle_t xTaskToSuspend );
  • xTaskToSuspend :要掛起任務的任務句柄,如果使用函數xTaskCreate創建任務的話,xTaskCreate的參數pxCreatedTask就是此任務的任務句柄,如果使用xTaskCreateStatic創建任務,那么函數的返回值就是此任務的任務句柄。

vTaskResume

void vTaskResume( TaskHandle_t xTaskToResume ) ;
  • xTaskToResume :要恢復的任務的任務句柄

將一個任務從掛起態恢復到就緒態,只有通過vTaskSuspend設置為掛起態的任務才可以使用vTaskResume恢復

xTaskResumeFromISR

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) ;

此函數是vTaskResume的中斷版本,用于在中斷服務函數中恢復一個任務
返回值:

  • pdTRUE:恢復運行的任務的任務優先級等于或者高于正在運行的任務(被中斷打斷的任務)
  • pdFALSE:恢復運行的任務的任務優先級低于當前運行的任務(被中斷打斷的任務)

實驗程序設計

  • start_task:用來創建其他三個任務
  • key_task:按鍵服務函數,檢測按鍵的按下結果,根據不同的按鍵結果執行不同的操作
  • task1_task:應用任務1
  • task2_task:應用任務2

具體代碼:
start_task:

void start_task(void *pvParameters)
{taskENTER_CRITICAL();		//進入臨界區xTaskCreate(key_task,"key_task",KEY_STK_SIZE,NULL,KEY_TASK_PRIO,&KeyTask_Handler);xTaskCreate(task1_task,"task1_task",TASK1_STK_SIZE,NULL,TASK1_TASK_PRIO,&Task1Task_Handler);xTaskCreate(task2_task,"task2_task",TASK2_STK_SIZE,NULL,TASK2_TASK_PRIO,&Task2Task_Handler);taskEXIT_CRITICAL();		//退出臨界區vTaskDelete(StartTask_Handler);	//刪除任務
}

key_task:

void key_task(void *pvParameters)
{u8 key;while(1){key=KEY_Scan(0);switch(key){case WKUP_PRES:vTaskSuspend(Task1Task_Handler);	//掛起任務1break;case KEY0_PRES:vTaskResume(Task1Task_Handler);	//恢復任務1break;case KEY1_PRES:vTaskSuspend(Task2Task_Handler);break;case KEY2_PRES:vTaskResume(Task2Task_Handler);break;		}vTaskDelay(10);	//延遲10ms}}

task1_task:

//task1任務函數
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//畫一個矩形	LCD_DrawLine(5,130,115,130);		//畫線POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任務執1行次數加1 注意task1_num1加到255的時候會清零!!LED0=!LED0;LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充區域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//顯示任務執行次數vTaskDelay(1000);                           //延時1s,也就是1000個時鐘節拍	}
}

task2_task

//task2任務函數
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //畫一個矩形	LCD_DrawLine(125,130,234,130);		//畫線POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任務2執行次數加1 注意task1_num2加到255的時候會清零!!LED1=!LED1;//printf("任務2已經執行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //顯示任務執行次數LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充區域vTaskDelay(1000);                           //延時1s,也就是1000個時鐘節拍	}
}

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "sdram.h"
#include "key.h"
#include "exti.h"
#include "FreeRTOS.h"
#include "task.h"//任務優先級
#define START_TASK_PRIO		1
//任務堆棧大小	
#define START_STK_SIZE 		128  
//任務句柄
TaskHandle_t StartTask_Handler;
//任務函數
void start_task(void *pvParameters);//任務優先級
#define KEY_TASK_PRIO		2
//任務堆棧大小	
#define KEY_STK_SIZE 		128  
//任務句柄
TaskHandle_t KeyTask_Handler;
//任務函數
void key_task(void *pvParameters);//任務優先級
#define TASK1_TASK_PRIO		3
//任務堆棧大小	
#define TASK1_STK_SIZE 		128  
//任務句柄
TaskHandle_t Task1Task_Handler;
//任務函數
void task1_task(void *pvParameters);//任務優先級
#define TASK2_TASK_PRIO		4
//任務堆棧大小	
#define TASK2_STK_SIZE 		128  
//任務句柄
TaskHandle_t Task2Task_Handler;
//任務函數
void task2_task(void *pvParameters);//LCD刷屏時使用的顏色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      GRED,  GBLUE, RED,   MAGENTA,       	 GREEN, CYAN,  YELLOW,BROWN, 			BRRED, GRAY };int main(void)
{HAL_Init();                     //初始化HAL庫   Stm32_Clock_Init(360,25,2,8);   //設置時鐘,180Mhzdelay_init(180);                //初始化延時函數uart_init(115200);              //初始化串口LED_Init();                     //初始化LED KEY_Init();						//初始化按鍵SDRAM_Init();					//初始化SDRAMLCD_Init();						//初始化LCDPOINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"Apollo STM32F4/F7");	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-3");LCD_ShowString(30,50,200,16,16,"Task Susp and Resum");//LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,"2021/11/21");xTaskCreate(start_task,"start_task",START_STK_SIZE,NULL,START_TASK_PRIO,&StartTask_Handler);vTaskStartScheduler();	//開啟糞污調度}void start_task(void *pvParameters)
{taskENTER_CRITICAL();		//進入臨界區xTaskCreate(key_task,"key_task",KEY_STK_SIZE,NULL,KEY_TASK_PRIO,&KeyTask_Handler);xTaskCreate(task1_task,"task1_task",TASK1_STK_SIZE,NULL,TASK1_TASK_PRIO,&Task1Task_Handler);xTaskCreate(task2_task,"task2_task",TASK2_STK_SIZE,NULL,TASK2_TASK_PRIO,&Task2Task_Handler);taskEXIT_CRITICAL();		//退出臨界區vTaskDelete(StartTask_Handler);	//刪除任務
}void key_task(void *pvParameters)
{u8 key;while(1){key=KEY_Scan(0);switch(key){case WKUP_PRES:vTaskSuspend(Task1Task_Handler);	//掛起任務1break;case KEY0_PRES:vTaskResume(Task1Task_Handler);	//恢復任務1break;case KEY1_PRES:vTaskSuspend(Task2Task_Handler);break;case KEY2_PRES:vTaskResume(Task2Task_Handler);break;		}vTaskDelay(10);	//延遲10ms}}//task1任務函數
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//畫一個矩形	LCD_DrawLine(5,130,115,130);		//畫線POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任務執1行次數加1 注意task1_num1加到255的時候會清零!!LED0=!LED0;LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充區域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//顯示任務執行次數vTaskDelay(1000);                           //延時1s,也就是1000個時鐘節拍	}
}//task2任務函數
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //畫一個矩形	LCD_DrawLine(125,130,234,130);		//畫線POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任務2執行次數加1 注意task1_num2加到255的時候會清零!!LED1=!LED1;//printf("任務2已經執行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //顯示任務執行次數LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充區域vTaskDelay(1000);                           //延時1s,也就是1000個時鐘節拍	}
}

編譯即可

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379755.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

向oracle存儲過程中傳參值出現亂碼

在頁面中加入<meta http-equiv"Content-Type" content"text ml;charsetUTF-8"/>就可以解決這一問題 適用情況&#xff1a; 1.中文 2.特殊符號 轉載于:https://www.cnblogs.com/GoalRyan/archive/2009/02/16/1391348.html

Scala程序將多行字符串轉換為數組

Scala | 多行字符串到數組 (Scala | Multiline strings to an array) Scala programming language is employed in working with data logs and their manipulation. Data logs are entered into the code as a single string which might contain multiple lines of code and …

SQL 異常處理 Begin try end try begin catch end catch--轉

SQL 異常處理 Begin try end try begin catch end catch 總結了一下錯誤捕捉方法:try catch ,error, raiserror 這是在數據庫轉換的時候用的的異常處理, Begin TryInsert into SDT.dbo.DYEmpLostTM(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,OpNo,OTFlag,LostTypeID,OffStd…

FreeRTOS中斷配置與臨界段

Cortex-M中斷 中斷是指計算機運行過程中&#xff0c;出現某些意外情況需主機干預時&#xff0c;機器能自動停止正在運行的程序并轉入處理新情況的程序&#xff08;中斷服務程序&#xff09;&#xff0c;處理完畢后又返回原被暫停的程序繼續運行。Cortex-M內核的MCU提供了一個用…

vector向量容器

一、vector向量容器 簡介&#xff1a; Vector向量容器可以簡單的理解為一個數組&#xff0c;它的下標也是從0開始的&#xff0c;使用時可以不用確定大小&#xff0c;但是它可以對于元素的插入和刪除&#xff0c;可以進行動態調整所占用的內存空間&#xff0c;它里面有很多系統…

netsh(二)

netsh 來自微軟的網絡管理看家法寶很多時候&#xff0c;我們可能需要在不同的網絡中工作&#xff0c;一遍又一遍地重復修改IP地址是一件比較麻煩的事。另外&#xff0c;系統崩潰了&#xff0c;重新配置網卡等相關參數也比較煩人&#xff08;尤其是無線網卡&#xff09;。事實上…

java uuid靜態方法_Java UUID getLeastSignificantBits()方法與示例

java uuid靜態方法UUID類getLeastSignificantBits()方法 (UUID Class getLeastSignificantBits() method) getLeastSignificantBits() method is available in java.util package. getLeastSignificantBits()方法在java.util包中可用。 getLeastSignificantBits() method is us…

Google C2Dm相關文章

Android C2DM學習——云端推送&#xff1a;http://blog.csdn.net/ichliebephone/article/details/6591071 Android C2DM學習——客戶端代碼開發&#xff1a;http://blog.csdn.net/ichliebephone/article/details/6626864 Android C2DM學習——服務器端代碼開發&#xff1a;http…

FreeRTOS的列表和列表項

列表和列表項 列表 列表是FreeRTOS中的一個數據結構&#xff0c;概念上和鏈表有點類型&#xff0c;是一個循環雙向鏈表&#xff0c;列表被用來跟蹤FreeRTOS中的任務。列表的類型是List_T&#xff0c;具體定義如下&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRI…

string基本字符系列容器

二、string基本字符系列容器 簡介&#xff1a;C語言只提供了一個char類型來處理字符&#xff0c;而對于字符串&#xff0c;只能通過字符串數組來處理&#xff0c;顯得十分不方便。CSTL提供了string基本字符系列容器來處理字符串&#xff0c;可以把string理解為字符串類&#x…

正則表達式(一)

正則表達式概述 1.1什么是正則表達式&#xff1f; 正則表達式(Regular Expression)起源于人類神經系統的早期研究。神經生理學家Warren McCulloch和Walter Pitts研究出一種使用數學方式描述神經網絡的方法。1956年&#xff0c;數學家Stephen Kleene發表了一篇標題為“神經…

42.有“舍”才有“得”

大干世界&#xff0c;萬種誘惑&#xff0c;什么都想要&#xff0c;會累死你&#xff0c;該放就放&#xff0c;該舍就舍。人必須先有所舍&#xff0c;才能有所得&#xff0c;舍如同種子撒播出去&#xff0c;轉了一圈&#xff0c;又帶了一大群子子孫孫回來。“舍”永遠在“得”的…

Java StringBuilder codePointCount()方法與示例

StringBuilder類codePointCount()方法 (StringBuilder Class codePointCount() method) codePointCount() method is available in java.lang package. codePointCount()方法在java.lang包中可用。 codePointCount() method is used to count the number of Unicode code point…

FreeRTOS時間管理

在使用FreeRTOS的過程中&#xff0c;我們通常會在一個任務函數中使用延時函數對這個任務延時&#xff0c;當執行延時函數的時候就會進行任務切換&#xff0c;并且此任務就會進入阻塞太&#xff0c;直到延時完成&#xff0c;任務重新進入就緒態。延時函數舒屬于FreeRTOS的時間管…

set和multiset集合容器

三、①set集合容器 簡介&#xff1a;set集合的目的就是為了快速檢索。set集合容器實現了紅黑樹的平衡二叉檢索樹的數據結構。set集合里面不允許有重復的元素出現&#xff1b;使用set容器前&#xff0c;需要在程序的頭文件中聲明 #include < set >。 函數方法總結&#…

javascript獲取select的值全解

獲取顯示的漢字 document.getElementById("bigclass").options[window.document.getElementById("bigclass").selectedIndex].text 獲取數據庫中的id window.document.getElementById("bigclass").value 獲取select組分配的索引id window.docume…

Java File類void deleteOnExit()方法(帶示例)

文件類void deleteOnExit() (File Class void deleteOnExit()) This method is available in package java.io.File.deleteOnExit(). 軟件包java.io.File.deleteOnExit()中提供了此方法。 This method is used to delete the file or directory when the virtual machine termi…

FreeRTOS隊列

在實際應用中&#xff0c;我們會遇到一個任務或者中斷服務需要和另一個任務進行消息傳遞&#xff0c;FreeRTOS提供了隊列的機制來完成任務與任務、任務與中斷之間的消息傳遞。 0x01 隊列簡介 隊列是為了任務與任務、任務與中斷之間的通信而準備的&#xff0c;可以在任務與任務…

括號配對問題(C)

描述 現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。 輸入 第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的N行輸入多組輸入數據&#xff0c;每組輸入數據都是一個字符串S(S的長度小于10000&#xff0c;且S不是空串…

劇情介紹:“阿甘正傳”

阿甘是個智商只有75的低能兒。在學校里為了躲避別的孩子的欺侮&#xff0c;聽從一個朋友珍妮的話而開始“跑”。他跑著躲避別人的捉弄。在中學時&#xff0c;他為了躲避別人而跑進了一所學校的橄欖球場&#xff0c;就這樣跑進了大學。阿甘被破格錄取&#xff0c;并成了橄欖球巨…