FreeRTOS任務通知

從v8.2.0版本開始,FreeRTOS新增了任務通知這個功能,可以使用任務通知來代替信號量、消息隊列、事件標志組等這些東西,使用任務通知的話效率會更高。
任務通知在FreeRTOS是一個可選的選項,要使用任務通知的話就需要將宏configUSE_TASK_NOTIFICATIONS定義為1 。FreeRTOS的每個任務都有一個32位的通知值,任務控制塊中的成員變量ulNotifiedValue就是這個通知值。任務通知是一個事件,可以提高速度,減少RAM的使用,但是任務通知也是有限的,FreeRTOS的任務通知只能有一個接收任務,接收任務可以因為任務通知而進入阻塞態,但是發送任務不會因為任務通知發送失敗而阻塞。

0x01 發送任務通知

任務通知函數有6個
在這里插入圖片描述

  1. xTaskNotify
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
  • TaskHandle_t xTaskToNotify: 任務句柄,指定任務通知是發送給那個任務的
  • uint32_t ulValue:任務通知值
  • eNotifyAction eAction:任務通知更新的方法,是一個枚舉類型
typedef enum
{eNoAction = 0,				/* Notify the task without updating its notify value. */eSetBits,					/* Set bits in the task's notification value.更新指定的bit */eIncrement,					/* Increment the task's notification value.通知值加1 */eSetValueWithOverwrite,		/* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. 覆寫的方式更新通知值*/eSetValueWithoutOverwrite	/* Set the task's notification value if the previous value has been read by the task.不覆寫通知值 */
} eNotifyAction;
  1. xTaskNotifyFromISR
BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
  • BaseType_t *pxHigherPriorityTaskWoken:退出此函數是否要進行任務切換
  1. xTaskNotifyGive
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
  • TaskHandle_t xTaskToNotify:指定通知是發送給那個任務的
  1. vTaskNotifyGiveFromISR
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
  1. xTaskNotifyAndQuery
xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t*pulPreviousNotificationValue);
  • TaskHandle_t xTaskToNotify:任務句柄,指定任務通知是發送給那個任務的
  • uint32_t ulValue:任務通知值
  • eNotifyAction eAction:任務通知更新方法
  • uint32_t* pulPreviousNotificationValue:用來保存更新前的任務通知值
  1. xTaskNotifyAndQueryFromISR
xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t*pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken);

0x02 獲取任務通知

獲取任務通知的函數有兩個

  • ulTaskNotifyTake():獲取任務通知,可以設置在退出此函數的時候將任務通知值清理或者減1.當任務通知用作二值信號量或者計數信號量的時候使用此函數來獲取信號量。
  • xTaskNotifyWait():等待任務通知,比ulTaskNotifyTake更為強大,全功能版任務通知獲取函數
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait )
  • BaseType_t xClearCountOnExit:為pdFALSE的話,在退出函數的時候,任務通知值減1,類似計數型信號量,當為pdTRUE的話,在退出函數的時候任務通知清零,類似二值信號量
  • TickType_t xTicksToWait:阻塞時間

返回值:任務通知值減少值或者清零之前的值

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait )
  • uint32_t ulBitsToClearOnEntry:當沒有接收到任務通知的時候,將任務通知與此參數的取反值進行按位與運算,當此參數為0xffffffff或者ULONG_MAX的時候就會將任務通知值清零
  • uint32_t ulBitsToClearOnExit:如果接收到了任務通知,在做完相應的處理退出函數之前將任務通知與此參數的取反值進行按位與運算,當此參數為0xffffffff或者ULONG_MAX的時候就會將任務通知值清零
  • uint32_t *pulNotificationValue:此參數來保存任務通知值
  • TickType_t xTicksToWait :阻塞時間

返回值:
pdTRUE:獲取了任務通知
pdFALSE:任務通知獲取失敗

實驗 任務通知模擬二值信號量

獲取任務通知值,如果獲取到的話,則進行邏輯處理

//DataProcess_task函數
void DataProcess_task(void *pvParameters)
{u8 len=0;u8 CommandValue=COMMANDERR;u32 NotifyValue;u8 *CommandStr;POINT_COLOR=BLUE;while(1){NotifyValue=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);	//獲取任務通知if(NotifyValue==1)									//清零之前的任務通知值為1,說明任務通知有效{len=USART_RX_STA&0x3fff;						//得到此次接收到的數據長度CommandStr=mymalloc(SRAMIN,len+1);				//申請內存sprintf((char*)CommandStr,"%s",USART_RX_BUF);CommandStr[len]='\0';							//加上字符串結尾符號LowerToCap(CommandStr,len);						//將字符串轉換為大寫		CommandValue=CommandProcess(CommandStr);		//命令解析if(CommandValue!=COMMANDERR){LCD_Fill(10,90,210,110,WHITE);				//清除顯示區域LCD_ShowString(10,90,200,16,16,CommandStr);	//在LCD上顯示命令printf("命令為:%s\r\n",CommandStr);switch(CommandValue)						//處理命令{case LED1ON: LED1=0;break;case LED1OFF:LED1=1;break;case BEEPON:BEEP=0;break;case BEEPOFF:BEEP=1;break;}}else{printf("無效的命令,請重新輸入!!\r\n");}USART_RX_STA=0;memset(USART_RX_BUF,0,USART_REC_LEN);			//串口接收緩沖區清零myfree(SRAMIN,CommandStr);						//釋放內存}else {vTaskDelay(10);      //延時10ms,也就是10個時鐘節拍	}}
}

接收到了數據,發送任務通知,vTaskNotifyGiveFromISR的第一個參數是DataProcess_task任務的任務句柄DataProcess_Handler

//串口1中斷服務程序
void USART1_IRQHandler(void)                	
{ u32 timeout=0;u32 maxDelay=0x1FFFF;BaseType_t xHigherPriorityTaskWoken;HAL_UART_IRQHandler(&UART1_Handler);	//調用HAL庫中斷處理公用函數timeout=0;while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//等待就緒{timeout++;超時處理if(timeout>maxDelay) break;		}timeout=0;while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次處理完成之后,重新開啟中斷并設置RxXferCount為1{timeout++; //超時處理if(timeout>maxDelay) break;	}//發送任務通知if((USART_RX_STA&0x8000)&&(DataProcess_Handler!=NULL))//接收到數據,并且接收任務通知的任務有效{vTaskNotifyGiveFromISR(DataProcess_Handler,&xHigherPriorityTaskWoken);//發送任務通知portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的話進行一次任務切換}
} 

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

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

相關文章

kinect在openni下也能玩摳出人物換背景

之前想了個很拉風的名字《用kinect玩穿越》,但是現在功能還不是很完善,細節處理也不是很好,臉皮沒有足夠的厚,所以呢還是叫換背景吧。 這里面包含兩個技術要點: 一、摳出活動人物 在微軟的SDK里深度圖像的前3位即0-2位…

物聯網基礎知識_聯網| 基礎知識能力問答 套裝1

物聯網基礎知識1) There are the following statements that are given below, which of them are correct about the computer network? A computer network is an interconnection between multiple devices to share hardware resources and information.A computer networ…

Emit學習-基礎篇-基本概念介紹

之前的Hello World例子應該已經讓我們對Emit有了一個模糊的了解,那么Emit到底是什么樣一個東西,他又能實現些什么功能呢?昨天查了點資料,大致總結了下,由于才開始學習肯定有不完善的地方,希望大家能夠批評指…

The FreeRTOS Distribution(介紹、移植、類型定義)

1 Understand the FreeRTOS Distribution 1.1 Definition :FreeRTOS Port FreeRTOS目前可以在20種不同的編譯器構建,并且可以在30多種不同的處理器架構上運行,每個受支持的編譯器和處理器組合被認為是一個單獨的FreeRTOS Port。 1.2 Build…

notepad++節點_在C ++中刪除鏈接列表的中間節點

notepad節點Given a single Linked List and we have to delete the middle the element of the Linked List. 給定一個鏈表,我們必須刪除鏈表中間的元素。 If the length of the linked list is odd then delete (( n1)/2)th term of the linked list and if the…

SET ANSI_NULLS ON

指定在與 Null 值一起使用等于 () 和不等于 (<>) 比較運算符時采用符合 ISO 標準的行為。 當 SET ANSI_NULLS 為 ON 時&#xff0c;即使 column_name 中包含空值&#xff0c;使用 WHERE column_name NULL 的 SELECT 語句仍返回零行。即使 column_name 中包含非空值&…

Eclipse項目左上角出現大紅色感嘆號怎么辦?

出現大紅色感嘆號是因為環境不匹配 解決方法&#xff1a; 右擊出現大紅色感嘆號的項目 點擊 Libraries&#xff0c;將有叉號的給Remove掉 然后再點擊 Add Library —> JRE System Library —> Next 勾選第二個即可 之后&#xff0c;就不會出現大紅色感嘆號了。

PCB---STM32最小系統制作過程

PCB 制作過程STM32核心模塊連接外部電源晶振OSC_IN(8MHz)OSC32_IN(32.768MHz&#xff09;復位下載口BOOT模式電源模塊添加功能UARTWKUPSTM32核心模塊 這里我們以STM32F103C8T6為列&#xff0c;先將芯片的原理圖放到原理圖中 對于STM32&#xff0c;有幾個模塊是核心&#xff0…

scala 隨機生成整數_如何在Scala中以整數形式獲取當前年份?

scala 隨機生成整數In Scala programming language, there is an option for the programmer to use libraries of java because of its interoperability with java. 在Scala編程語言中&#xff0c;程序員可以選擇使用Java庫&#xff0c;因為它可以與Java互操作。 There are …

轉載:glut.h 與 stdlib.h中 的exit()重定義問題的解決

遇到的問題&#xff0c;來自&#xff1a;http://blog.sina.com.cn/s/blog_629c53bd0100f5li.html 出現&#xff1a; c:\codeprogram\microsoft visual studio 10.0\vc\include\stdlib.h(353): error C2381: “exit”: 重定義&#xff1b;__declspec(noreturn) 不同1> c:\pro…

括號配對問題(C++棧)

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

FreeRTOS---堆內存管理(一)

FreeRTOS的堆內存管理簡介動態內存分配及其與 FreeRTOS 的相關性動態內存分配選項內存分配方案Heap_1heap_2Heap_3Heap_4設置heap_4的起始地址Heap_5vPortDefineHeapRegions()堆相關的函數xPortGetFreeHeapSizexPortGetMinimumEverFreeHeapSizeMalloc調用失敗的Hook函數這篇文章…

python中生成隨機整數_在Python中生成0到9之間的隨機整數

python中生成隨機整數Following are the few explanatory illustrations using different python modules, on how to generate random integers? Consider the scenario of generating the random numbers between 0 and 9 (both inclusive). 以下是使用不同的python模塊的一…

愚人節惡搞網站謹防遭黑客攻擊

金山毒霸云安全中心日前發出預警&#xff0c;在近期攔截的大量“掛馬”、釣魚等惡意網頁中&#xff0c;與“愚人節”相關的&#xff0c;在近一周數量急劇增加。 愚人節將至&#xff0c;怎么整人好玩?近期許多惡搞網站、相關的網絡論壇的流量不斷攀升。金山毒霸云安全中心日前發…

JavaScript中的String()函數與示例

String()函數 (String() function) String() function is a predefined global function in JavaScript, it is used to convert an object to the string. String()函數是JavaScript中預定義的全局函數&#xff0c;用于將對象轉換為字符串。 Example: 例&#xff1a; In thi…

ASCII碼排序(C++)

題目描述: 輸入三個字符&#xff08;可以重復&#xff09;后&#xff0c;按各字符的ASCII碼從小到大的順序輸出這三個字符。 輸入描述: 第一行輸入一個數N,表示有N組測試數據。后面的N行輸入多組數據&#xff0c;每組輸入數據都是占一行&#xff0c;有三個字符組成&#xff0c;…

FreeRTOS--堆內存管理(二)

堆內存管理代碼具體實現heap_1內存申請函數內存釋放函數heap_2內存塊內存堆初始化函數內存塊插入函數內存申請函數判斷是不是第一次申請內存開始分配內存內存釋放函數heap_3heap_4內存堆初始化函數內存塊插入函數heap_5上一篇文章說了FreeRTOS實現堆內存的原理&#xff0c;這一…

在查詢的結果中添加自增列 兩種方法

解決辦法《一》&#xff1a; 在SQL Server數據庫中表信息會用到Identity關鍵字來設置自增列。但是當有數據被刪除的話&#xff0c;自增列就不連續了。如果想查詢出這個表的信息&#xff0c;并添 加一列連續自增的ID&#xff0c;可用如下查詢語句&#xff1a; SELECT Row_Nu…

一個非常簡單的C#面試題

怎樣實現對所有類可讀但是在同一個assembly可寫那&#xff1f; 答案&#xff1a; 同一個assembly namespace ClassLibrary1 { public class Class1 { public string Name { get; internal set; } } public class Class2 { public void GS() { Class1 cc new Class1(); cc.Name…

css中的node.js_在Node App中使用基本HTML,CSS和JavaScript

css中的node.jsYou may think this is not important, but it is!. As a beginner in node.js, most coding exercises are always server sided. 您可能認為這并不重要&#xff0c;但確實如此&#xff01; 作為node.js的初學者&#xff0c;大多數編碼練習始終都是服務器端的。…