FreeRTOS信號量---二值信號量

信號量可以用來進行資源管理和任務同步,FreeRTOS中信號量又分為二值信號量、計算型信號量、互斥信號量和遞歸互斥信號量。

0x01 二值信號量

二值信號量其實就是一個只有一個隊列項的隊列,這個特殊的隊列要么是滿的,要么是空的,任務和中斷不用在乎隊列中存的是什么消息,只需要知道這個隊列是滿的還是空的,可以利用這個機制完成任務與中斷之間的同步。

1. 創建二值信號量

在這里插入圖片描述
vSemaphoreCreateBinary

vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
  • xSemaphore :保存創建成功的二值信號量
    此函數是老版本FreeRTOS創建二值信號量函數,新版本已經不再使用。

xSemaphoreCreateBinary:

SemaphoreHandle_t xSemaphoreCreateBinary( void )

此函數是新版本FreeRTOS中統一使用此函數來創建二值信號量,使用此函數創建二值信號量的話,信號量所需要的內存是有FreeRTOS的內存管理部分動態分配的,此函數創建好的二值信號量默認是空的,也就是說創建好的二值信號量使用函數xSemaphoreTask是獲取不到的。

xSemaphoreCreateBinaryStatic

SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
  • pxSemaphoreBuffer :保存信號量結構體
    此函數創建二值信號量所需要的內存需要由用戶分配
2. 釋放信號量

在這里插入圖片描述

xSemaphoreGive

xSemaphoreGive( SemaphoreHandle_t xSemaphore )
  • xSemaphore:要釋放的信號量句柄
    此函數用于釋放二值信號量、計數型信號量或互斥信號量

xSemaphoreGiveFromISR

 xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken)
  • xSemaphore:要釋放的信號量句柄
  • BaseType_t *pxHigherPriorityTaskWoken:標記退出此函數以后是否進行任務切換,此值為pdTRUE的時候在退出中斷之前一定要進行一次任務切換

此函數只能用來釋放二值信號量和計數型信號量

3. 獲取信號量

在這里插入圖片描述
xSemaphoreTake

xSemaphoreTake(*                   SemaphoreHandle_t xSemaphore,*                   TickType_t xBlockTime*               )
  • SemaphoreHandle_t xSemaphore:要獲取信號量的句柄
  • TickType_t xBlockTime:阻塞時間
    此函數用于獲取二值信號量、計數型信號量或互斥信號量

xSemaphoreTakeFromISR

 xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken)
  • SemaphoreHandle_t xSemaphore:要獲取信號量的句柄
  • BaseType_t *pxHigherPriorityTaskWoken:標記退出此函數以后是否進行任務切換,等于pdTURE一定進行任務切換
4. 驗證

設計一個通過串口發送指定的指令來控制開發版上的LED1和BEEP開關的實驗。指令如下:
LED1ON:打開LED1
LED1OFF:關閉LED1
BEEFON:打開BEEF
BEEFOFF:關閉BEEF
設計三個任務,功能如下:
start_task:用來創建其他2個任務
task1_task:控制LED0閃爍,提示系統正在運行
DataProcess_task:指令處理任務,根據接收到的指令來控制不同的外設
實驗中還創建一個二值信號量BinarySemaphore用于完成串口中斷和任務DataProcess_task之間的同步。

DataProcess_task函數

void DataProcess_task(void *pvParameters)
{u8 len = 0;u8 CommandValue = COMMANDERR;BaseType_t err = pdFALSE;u8 *CommandStr;POINT_COLOR = BLUE;while(1){if(BinarySemaphore!=NULL){err=xSemaphoreTake(BinarySemaphore,portMAX_DELAY);	//獲取信號量if(err==pdTRUE)										//獲取信號量成功{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 if(err==pdFALSE){vTaskDelay(10);      //延時10ms,也就是10個時鐘節拍	}}
}

DataProcess_task是用來申請獲取信號量,如果申請到了,就往下執行,如果沒事申請到,就會一直阻塞,申請到之后,對數據做處理,然后做出相應的回應。

串口1中斷服務程序

//串口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)&&(BinarySemaphore!=NULL))//接收到數據,并且二值信號量有效{xSemaphoreGiveFromISR(BinarySemaphore,&xHigherPriorityTaskWoken);	//釋放二值信號量portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的話進行一次任務切換}
} 

串口1中斷服務程序是用來接收串口發送的數據,如果接收完畢,將會釋放二值信號量,DataProcess_task才能往下執行,如果沒有接收完數據或者沒有接收到數據,DataProcess_task會一直阻塞。

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

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

相關文章

Linux 上 rpm包管理工具的基本使用

查詢是否安裝某個包:rpm -q 包名查詢所有已安裝的包:rpm -q a查詢未安裝包的文件信息:rpm -qilp 未安裝的包安裝包:rpm -i 包測試安裝包:rpm -i test 包刪除包:rpm -e 包名測試刪除包:rpm -e te…

ios 內存使用陷阱

在iphone開發過程中,代碼中的內存泄露我們很容易用內存檢測工具leaks 檢測出來,并一一改之,但有些是因為ios 的缺陷和用法上的錯誤,leaks 檢測工具并不能檢測出來,你只會看到大量的內存被使用,最后收到didR…

FreeRTOS軟件定時器

軟件定時器允許設置一段時間,當設置的時間達到后就執行指定的功能函數,被軟件定時器調用的功能函數叫做定時器的回調函數。軟件定時器的回調函數是在定時器服務任務中執行的,所以一定不能在回調函數中調用任何阻塞任務的API函數,比…

Java類class isAssignableFrom()方法及示例

類class isAssignableFrom()方法 (Class class isAssignableFrom() method) isAssignableFrom() method is available in java.lang package. isAssignableFrom()方法在java.lang包中可用。 isAssignableFrom() method is used to check whether the class or an interface den…

關于 列表實例

wss3.0工具中有個列表實例項目。此項目的作用是在自定義網站或自定義字段時使用默認值。也就是定義其默認的數據。 格式詳見微軟msdn:http://msdn.microsoft.com/zh-cn/library/ms478860.aspx轉載于:https://www.cnblogs.com/heavencloud/archive/2009/03/20/141793…

WP7之Application Bar控件

Microsoft.Phone.Shell命名空間中定義了ApplicationBar及其相關類(ApplicationBarIconButton和ApplicationBarMenuItem),這些類派生自Object,并完全獨立于常規Silverlight編程中的DependencyObject,UIElement和FrameworkElement類層次結構。A…

TomCat使用以及端口號被占用的處理方法

一.HTTP協議 什么是HTTP協議 HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是因特網上應用最為廣泛的一種網絡傳輸協議,所有的WWW文件都必須遵守這個標準。 HTTP請求 HTTP響應 2.如何處理端口被占用 方法一&#xff…

FreeRTOS事件標志組

使用信號量來同步的話,任務只能與單個事務或任務進行同步,有時候某個任務可能會需要與多個事件或任務進行同步,此時信號量就無能為力了,FreeRTOS為此提供了一個可選的解決方法,那就是事件標志組。 0x01 事件標志組 事…

FusionCharts等產品簡介

以前做柱狀圖、餅形圖等圖表都是根據數據繪制出來的靜態圖,偶然看到別人的一套系統,居然可以讓柱狀圖的柱子動畫般的逐個出現,效果還是很不錯的。不要跟我抬杠說不就是展現數據嘛,靜態圖表有什么不好,要知道用戶一般可…

c#foreach循環_C#| 使用foreach循環打印整數數組

c#foreach循環Given an integer array and we have to print its elements using "foreach loop" in C#. 給定一個整數數組,我們必須在C#中使用“ foreach循環”打印其元素 。 Syntax for foreach loop: foreach循環的語法: fore…

Eclipse和Tomcat綁定并且將上傳資源到Tomcat上

步驟如下: 創建一個Dynamic Web Project(圖一) Target runtime 選擇Apache Tomcat v7.0版本(圖二) 切記要選擇 v7.0 和2.5 (若沒有圖二選項見圖三) 然后,點擊window --> Prefer…

淺析.NET平臺編程語言的未來走向

在去年的PDC2008召開期間,微軟逐步公開了圍繞.NET和編程語言的很多想法,據此我們可以饒有興趣地對.NET的未來預測一番。 .NET平臺以運行在通用語言運行時(Common Language Runtime,CLR)上的C#和VB.NET作為開端。CLR是通用語言架構(Common Lan…

FreeRTOS任務通知

從v8.2.0版本開始,FreeRTOS新增了任務通知這個功能,可以使用任務通知來代替信號量、消息隊列、事件標志組等這些東西,使用任務通知的話效率會更高。 任務通知在FreeRTOS是一個可選的選項,要使用任務通知的話就需要將宏configUSE_T…

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;就不會出現大紅色感嘆號了。