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

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

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

3天內不再提示

FreeRTOS任務掛起恢復與使用中斷遇到的坑

碼農愛學習 ? 來源:碼農愛學習 ? 作者:碼農愛學習 ? 2022-09-26 09:01 ? 次閱讀

任務掛起簡單點理解就是現在不需要執行這個任務,讓它先暫停,就是掛起。恢復就是從剛才掛起的狀態下繼續運行。

API函數

任務掛起vTaskSuspend()

函數原型(tasks.c中):

void vTaskSuspend( TaskHandle_t xTaskToSuspend )

參數

xTaskToSuspend:需要掛起的任務句柄

任務恢復vTaskResume()

函數原型(tasks.c中):

void vTaskResume( TaskHandle_t xTaskToResume )

參數:

xTaskToSuspend:需要恢復的任務句柄

中斷函數中進行任務恢復xTaskResumeFromISR()

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

參數:

xTaskToSuspend:需要掛起的任務句柄

總結

這幾個函數用起來還是很簡單的,只需要傳入任務的句柄即可。

注意,任務掛起是沒有FromISR版本的,所以在中斷中貌似就不可以使用任務掛起了。

程序驗證

在上個例程的基礎上,增加一個按鍵檢測任務和外部中斷函數,用來測試任務掛起與恢復。

按鍵任務

//key任務函數
void key_task(void *pvParameters)
{
	u8 key;
	static uint8_t flag=0;
	
	while(1)
	{
		key=KEY_Scan(0);
		switch(key)
		{
			case KEY1_PRES:
				if(!flag)
				{
					vTaskSuspend(Task1Task_Handler);//掛起任務1
					printf("1 suspendrn");
				}
				else
				{
					vTaskResume(Task1Task_Handler);	//恢復任務1
					printf("1 resumern");
				}
				flag=~flag;
				break;
			case K_UP_PRES:
				vTaskSuspend(Task2Task_Handler);//掛起任務2
				printf("2 suspendrn");
				break;
		}
		vTaskDelay(10);			//延時10ms 
	}
}

中斷配置與中斷函數

//==============中斷相關配置
void EXTIX_Init(void)
{
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	
	//KEY_Init(); //按鍵對應的IO口初始化
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘
 
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 連接到中斷線4
	
	/* 配置EXTI_Line4 */
	EXTI_InitStructure.EXTI_Line =  EXTI_Line4;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		//中斷事件
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;				//中斷線使能
	EXTI_Init(&EXTI_InitStructure);							//配置
 
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;		//外部中斷4
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x06;//搶占優先級6
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;	//子優先級0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//使能外部中斷通道
	NVIC_Init(&NVIC_InitStructure);							//配置	   
}

//外部中斷4服務程序
void EXTI4_IRQHandler(void)
{
	BaseType_t YieldRequired;
	
	//vTaskDelay(10);	//消抖-------//中斷函數中不可以使用vTaskDelay()!!!
	if(KEY0==0)	 
	{			
        //vTaskResume(Task2Task_Handler);//這里必須使用FromISR版本的!!!	
		YieldRequired=xTaskResumeFromISR(Task2Task_Handler);//恢復任務2
		printf("2 resumern");
		if(YieldRequired==pdTRUE)
		{
			/*如果函數xTaskResumeFromISR()返回值為pdTRUE,那么說明要恢復的這個
			任務的任務優先級等于或者高于正在運行的任務(被中斷打斷的任務),所以在
			退出中斷的時候一定要進行上下文切換!*/
			portYIELD_FROM_ISR(YieldRequired);
		}
	}		 
	EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  
}

整個主函數

//*******************************************
//STM32F407+FreeRTOS 任務掛起與恢復(結合中斷)
//File: main.c
//Author: xxpcb(wxgzh:碼農愛學習)
//Version: V1.0
//Date: 2020/06/04
//*******************************************

#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "usart.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 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);

#define KEY_TASK_PRIO		2	
#define KEY_STK_SIZE 		128  
TaskHandle_t KeyTask_Handler;
void key_task(void *pvParameters);

void EXTIX_Init(void);

int main(void)
{ 	
	//設置系統中斷優先級分組4(FreeRTOS中的默認方式!)
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	//初始化LED端口
	LED_Init();	
	//初始化按鍵
    KEY_Init();	
	//初始化外部中斷
	EXTIX_Init();
	//串口初始化
	uart_init(115200);

	//創建開始任務
	xTaskCreate((TaskFunction_t )start_task,            //任務函數
				(const char*    )"start_task",          //任務名稱
				(uint16_t       )START_STK_SIZE,        //任務堆棧大小
				(void*          )NULL,                  //傳遞給任務函數的參數
				(UBaseType_t    )START_TASK_PRIO,       //任務優先級
				(TaskHandle_t*  )&StartTask_Handler);   //任務句柄  
	//開啟任務調度				
	vTaskStartScheduler();          
}

//開始任務任務函數
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //進入臨界區
	
    //創建TASK1任務
    xTaskCreate((TaskFunction_t )task1_task,             
                (const char*    )"task1_task",           
                (uint16_t       )TASK1_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )TASK1_TASK_PRIO,        
                (TaskHandle_t*  )&Task1Task_Handler);   
    //創建TASK2任務
    xTaskCreate((TaskFunction_t )task2_task,     
                (const char*    )"task2_task",   
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_TASK_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler); 
    //創建KEY任務
    xTaskCreate((TaskFunction_t )key_task,     
                (const char*    )"key_task",   
                (uint16_t       )KEY_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )KEY_TASK_PRIO,
                (TaskHandle_t*  )&KeyTask_Handler); 
				
    vTaskDelete(StartTask_Handler); //刪除開始任務
				
    taskEXIT_CRITICAL();            //退出臨界區
}

//task1任務函數
void task1_task(void *pvParameters)
{
	while(1)
	{
		LEDa_Toggle;
        vTaskDelay(500); //延時500ms
	}
}

//task2任務函數
void task2_task(void *pvParameters)
{
	while(1)
	{
        LEDb_ON;
        vTaskDelay(200); //延時200ms
		LEDb_OFF;
        vTaskDelay(800); //延時800ms
	}
}

//key任務函數
void key_task(void *pvParameters)
{
	u8 key;
	static uint8_t flag=0;
	
	while(1)
	{
		key=KEY_Scan(0);
		switch(key)
		{
			case KEY1_PRES:
				if(!flag)
				{
					vTaskSuspend(Task1Task_Handler);//掛起任務1
					printf("1 suspendrn");
				}
				else
				{
					vTaskResume(Task1Task_Handler);	//恢復任務1
					printf("1 resumern");
				}
				flag=~flag;
				break;
			case K_UP_PRES:
				vTaskSuspend(Task2Task_Handler);//掛起任務2
				printf("2 suspendrn");
				break;
		}
		vTaskDelay(10);			//延時10ms 
	}
}

//==============中斷相關配置
void EXTIX_Init(void)
{
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	
	//KEY_Init(); //按鍵對應的IO口初始化
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG時鐘
 
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 連接到中斷線4
	
	/* 配置EXTI_Line4 */
	EXTI_InitStructure.EXTI_Line =  EXTI_Line4;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		//中斷事件
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;				//中斷線使能
	EXTI_Init(&EXTI_InitStructure);							//配置
 
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;		//外部中斷4
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x06;//搶占優先級6
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;	//子優先級0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//使能外部中斷通道
	NVIC_Init(&NVIC_InitStructure);							//配置	   
}

//外部中斷4服務程序
void EXTI4_IRQHandler(void)
{
	BaseType_t YieldRequired;
	
	//vTaskDelay(10);	//消抖-------//中斷函數中不可以使用vTaskDelay()!!!
	if(KEY0==0)	 
	{			
        //vTaskResume(Task2Task_Handler);//這里必須使用FromISR版本的!!!	
		YieldRequired=xTaskResumeFromISR(Task2Task_Handler);//恢復任務2
		printf("2 resumern");
		if(YieldRequired==pdTRUE)
		{
			/*如果函數xTaskResumeFromISR()返回值為pdTRUE,那么說明要恢復的這個
			任務的任務優先級等于或者高于正在運行的任務(被中斷打斷的任務),所以在
			退出中斷的時候一定要進行上下文切換!*/
			portYIELD_FROM_ISR(YieldRequired);
		}
	}		 
	EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中斷標志位  
}

實驗現象

程序運行起來后,兩個LED任務按照自己的方式閃爍,按下KEY1,LED任務1掛起,即LED保持在常亮或常滅狀態,再次按下KEY1,LED任務1恢復,即LED繼續閃爍。按下KEY_UP,LED任務2掛起,再按下KEY0,LED任務2恢復。同時串口也會打印相關信息

注意,中斷程序中沒有使用延時消抖,所以按下KEY0,從中斷恢復任務時,可能會執行多次恢復,(1次掛起)多次恢復目前是沒有什么影響的。

注意事項(避免程序卡死)!!!

中斷函數中不可以使用vTaskDelay()!

實驗中用到了按鍵作為中斷,本想用vTaskDelay(10)進行消抖,結果是程序運行起來后,按下中斷的按鍵,程序卡死,通過調試運行,發現程序死在了這里:

//port.c的429~443行
void vPortEnterCritical( void )
{
	portDISABLE_INTERRUPTS();
	uxCriticalNesting++;

	/* This is not the interrupt safe version of the enter critical function so
	assert() if it is being called from an interrupt context.  Only API
	functions that end in "FromISR" can be used in an interrupt.  Only assert if
	the critical nesting count is 1 to protect against recursive calls if the
	assert function also uses a critical section. */
	if( uxCriticalNesting == 1 )
	{
		configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
	}
}

英文注釋的大致意思是:

這不是進入關鍵函數的中斷安全版本,所以assert()如果是從中斷上下文中調用的話。只有以“FromISR”結尾的API函數才能在中斷中使用。只有在關鍵嵌套計數為1時才使用assert,以防止assert函數也使用關鍵部分時出現遞歸調用。

所以FreeRTOS的API函數只有帶FromISR后綴的才能在中斷函數中使用,而vTaskDelay()好像也沒有FromISR版本,所以就不能使用!推而廣之,其它不帶FromISR后綴的API函數也不能在中斷函數中使用!

另外,中斷函數本來就是為了處理緊急情況,在中斷函數中延時是不太合理的。

中斷函數中必須使用帶FromISR后綴的API函數!

這一條和上一條其實是一個意思,實驗中在中斷函數中對信號量進行釋放,使用的是xTaskResumeFromISR()函數,如果改成vTaskResume(),實測發現程序同樣會卡死在這里。

中斷的優先級不能設置的過高(對應數字過小)!

按鍵中斷的優先級設置:

    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;		//外部中斷4
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x06;//搶占優先級6
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;	//子優先級0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//使能外部中斷通道
	NVIC_Init(&NVIC_InitStructure);							//配置	

第2行的搶占優先級為6是沒有問題的,如果改成3,程序在進入按鍵中斷會卡死在這里(port.c文件的末尾):

#if( configASSERT_DEFINED == 1 )
	void vPortValidateInterruptPriority( void )
	{
	uint32_t ulCurrentInterrupt;
	uint8_t ucCurrentPriority;

		/* 獲取當前正在執行的中斷的數量。*/
		ulCurrentInterrupt = vPortGetIPSR();

		/* 中斷號是用戶定義的中斷嗎?*/
		if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )
		{
			/* 查找中斷的優先級。*/
			ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];

			/* 如果一個被分配了高于configMAX_SYSCALL_INTERRUPT_PRIORITY優先級的中斷的服務
			例程(ISR)調用了一個ISR安全的FreeRTOS API函數,那么下面的斷言將失敗。
			ISR安全FreeRTOS API函數必須*僅*被分配優先級在
			configMAX_SYSCALL_INTERRUPT_PRIORITY或以下的中斷調用。

			數字上較低的中斷優先級數在邏輯上代表較高的中斷優先級,因此中斷的優先級必須設置為
			等于或數字上*高于* configMAX_SYSCALL_INTERRUPT_PRIORITY。

			使用FreeRTOS API的中斷不能保留其缺省優先級為零,因為這是可能的最高優先級,它保證
			高于configMAX_SYSCALL_INTERRUPT_PRIORITY,因此也保證無效。

			FreeRTOS維護單獨的線程和ISR API函數,以確保中斷條目盡可能快速和簡單。

            以下鏈接提供詳細資料:
			http://www.freertos.org/RTOS-Cortex-M3-M4.html
			http://www.freertos.org/FAQHelp.html */
			configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
		}

		/* 優先級分組:中斷控制器(NVIC)允許定義每個中斷優先級的比特被分割成定義中斷的優先級比特和
		定義中斷的次優先級比特。為簡單起見,必須將所有位定義為搶占優先位。
		如果不是這樣(如果某些位表示次優先級),下面的斷言將失敗。

		如果應用程序只使用CMSIS庫進行中斷配置,那么在啟動調度程序之前,通過調用NVIC_SetPriorityGrouping(0);
		可以在所有Cortex-M設備上實現正確的設置。但是請注意,一些特定于供應商的外設庫假設了非零優先級組設置,
		在這種情況下,使用值為0將導致不可預測的行為。 */
		configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );
	}

#endif /* configASSERT_DEFINED */

注意里面的幾段:

中斷優先級級別

如果一個被分配了高于configMAX_SYSCALL_INTERRUPT_PRIORITY優先級的中斷的服務例程(ISR)調用了一個ISR安全的FreeRTOS API函數,那么下面的斷言將失敗。ISR安全FreeRTOS API函數必須被分配優先級在configMAX_SYSCALL_INTERRUPT_PRIORITY或以下的中斷調用。

這句的意思是,如果在中斷函數中使用了FreeRTOS的API函數,當然前提也是使用帶FromISR后綴的,中斷的優先級不能高于宏定義configMAX_SYSCALL_INTERRUPT_PRIORITY,這個宏定義在FreeRTOSConfig.h中:

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
	/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4        /* 15 priority levels */
#endif

/* 在調用“設置優先級”函數時可以使用的最低中斷優先級 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0xf

/* 可以被任何中斷服務程序使用的最高中斷優先級,它可以調用來中斷安全的FreeRTOS API函數。
不要從任何比這個優先級更高的中斷調用中斷安全的FREERTOS API函數!(優先級越高,數值越低)*/
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5

/* 內核端口層本身使用的中斷優先級。這些對所有Cortex-M端口都是通用的,并且不依賴于任何特定的庫函數。*/
#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY 不能設置為零 !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

即中斷優先級設置范圍為5~15(0xf)。

當然,如果中斷函數中沒有使用FreeRTOS的API,那么中斷的優先級就不受限制。

中斷優先級分組

優先級分組:中斷控制器(NVIC)允許定義每個中斷優先級的比特被分割成定義中斷的優先級比特和定義中斷的次優先級比特。為簡單起見,必須將所有位定義為搶占優先位。如果不是這樣(如果某些位表示次優先級),下面的斷言將失敗。

如果應用程序只使用CMSIS庫進行中斷配置,那么在啟動調度程序之前,通過調用NVIC_SetPriorityGrouping(0);可以在所有Cortex-M設備上實現正確的設置。但是請注意,一些特定于供應商的外設庫假設了非零優先級組設置,在這種情況下,使用值為0將導致不可預測的行為。

這兩段意思是在說優先級分組的事,即所有位都是搶占優先級,沒有次優先級,即中斷分組模式4,也就是在主函數設置的:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

如果換成其它的,比如NVIC_PriorityGroup_3,程序進入中斷后也會卡死在。

審核編輯:湯梓紅

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

    關注

    2

    文章

    1487

    瀏覽量

    61829
  • 函數
    +關注

    關注

    3

    文章

    4308

    瀏覽量

    62444
  • FreeRTOS
    +關注

    關注

    12

    文章

    483

    瀏覽量

    62018
收藏 人收藏

    評論

    相關推薦

    FreeRTOS中的任務管理

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

    FreeRTOS里在中斷掛起任務出錯的原因?怎么解決?

    各位大佬,新手剛學習FreeRTOS,現在想在中斷掛起某個任務,我在教程里看到說有中斷中的恢復
    發表于 04-16 08:26

    轉:第10章 FreeRTOS任務管理

    10.8FreeRTOS任務刪除10.9FreeRTOS任務掛起10.10FreeRTOS
    發表于 08-23 09:54

    freeRTOS操作系統的任務掛起

    freeRTOS在cntTask任務中,計數到10次之后便不再進入該任務為什么?請led4Task并沒有被掛起,又是為什么?本人剛入門freeRTO
    發表于 10-18 21:39

    UCOSII的任務掛起恢復問題

    遇到一個問題,我在用ucosII時,我任務A一直未被掛起,但我有一個任務B(優先級比A高,1ms觸發一次),每執行一次任務B都會
    發表于 07-04 04:35

    請問UCOSiii在中斷中是否可以進行任務掛起恢復

    UCOSiii的中斷不可以進行任務的創建,我想問在中斷中可不可以進行任務掛起恢復????
    發表于 07-16 23:42

    FreeRTOS掛起線程失敗怎么辦

    最近在ST的STA8090上做項目開發,遇到個比較棘手的問題。希望各位大神能幫忙指點一下。環境:STA8090芯片+FreeRTOS+SDK固件庫目的:需要掛起線程我在代碼里加了幾個下面這樣的
    發表于 06-11 04:35

    FreeRTOS任務掛起恢復的相關資料推薦

    任務掛起恢復要使用著些API則需要使能宏定義:INCLUDE_vTaskSuspend、INCLUDE_xTaskResumeFromISR任務
    發表于 12-27 08:06

    uCOS-III任務掛起恢復

    任務掛起恢復掛起恢復掛起恢復任務
    發表于 01-20 06:51

    FreeRTOS任務掛起與刪除的區別在哪

    當一個任務暫時需要停止運行,那么就可以將任務掛起,在需要運行的時候在恢復就可以了。任務恢復運行以
    發表于 01-21 11:02

    FreeRTOS任務的使用

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

    UCOS擴展例程-UCOSIII任務掛起恢復

    UCOS擴展例程-UCOSIII任務掛起恢復
    發表于 12-14 17:24 ?18次下載

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

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

    FreeRTOS系列第11篇---FreeRTOS任務控制

    FreeRTOS任務控制API函數主要實現任務延時、任務掛起、解除任務
    發表于 01-26 17:54 ?12次下載
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務</b>控制

    FreeRTOS任務掛起恢復

    掛起API函數(可以在tasks.c中找到)
    的頭像 發表于 02-10 15:06 ?880次閱讀