本期在二進(jìn)制信號(hào)量的基礎(chǔ)上介紹計(jì)數(shù)信號(hào)量
01基本介紹
01.什么是計(jì)數(shù)信號(hào)量
計(jì)數(shù)信號(hào)量顧名思義是用來(lái)計(jì)數(shù)的信號(hào)量,相比于二進(jìn)制信號(hào)量,計(jì)數(shù)信號(hào)量的并不只有兩種狀態(tài)。用官方的開(kāi)發(fā)者文檔中的話(huà)來(lái)說(shuō),計(jì)數(shù)信號(hào)量可以看作長(zhǎng)度大于1的隊(duì)列,我們并不關(guān)心其中的內(nèi)容而是關(guān)系隊(duì)列是否為空。
關(guān)于隊(duì)列的公眾號(hào)可以參考這篇文章。
02.如何創(chuàng)建計(jì)數(shù)信號(hào)量
官方的參考文檔中提供了兩種創(chuàng)建方式(動(dòng)態(tài)和靜態(tài))我們使用動(dòng)態(tài)創(chuàng)建方式。調(diào)用xSemaphoreCreateCounting函數(shù)
其中包含了兩個(gè)參數(shù),一個(gè)是最大計(jì)數(shù)量還有一個(gè)是初始計(jì)數(shù)量。
創(chuàng)建一個(gè)SemaphoreHandler_t類(lèi)型的句柄變量用以接收返回值。
03.釋放和獲取信號(hào)量
釋放和獲取信號(hào)量和上一期二進(jìn)制信號(hào)量的釋放和獲取方式一樣。均是調(diào)用
xSemaphoreGive釋放信號(hào)量以及調(diào)用
xSemaphoreTake獲取信號(hào)量。
但是計(jì)數(shù)信號(hào)量則多了一個(gè)可以調(diào)用的函數(shù)。
調(diào)用這個(gè)函數(shù)我們就可以獲得計(jì)數(shù)值啦。
02代碼編寫(xiě)
1測(cè)試流程
我們做兩個(gè)實(shí)驗(yàn),首先是使用一個(gè)LED函數(shù),函數(shù)每翻轉(zhuǎn)一次就向計(jì)數(shù)信號(hào)量釋放一次信號(hào)。
第二個(gè)函數(shù)輪詢(xún)計(jì)數(shù)信號(hào)量,當(dāng)計(jì)數(shù)信號(hào)量的數(shù)量比一半多時(shí),使另一個(gè)LED也開(kāi)始進(jìn)行翻轉(zhuǎn)并同樣釋放信號(hào)量。當(dāng)計(jì)數(shù)信號(hào)量到達(dá)最大數(shù)時(shí),關(guān)閉第二個(gè)燈的翻轉(zhuǎn)。
2大體思路
第一個(gè)LED燈翻轉(zhuǎn),發(fā)送信號(hào)量。定義一個(gè)輪詢(xún)函數(shù)用來(lái)時(shí)刻檢測(cè)信號(hào)量狀況,當(dāng)信號(hào)量到達(dá)一定數(shù)量時(shí)恢復(fù)LED2任務(wù)的運(yùn)行,當(dāng)信號(hào)量滿(mǎn)時(shí)清空信號(hào)量列表并掛起LED2
任務(wù)的掛起與恢復(fù)可以參考這期。
3代碼編寫(xiě)
首先是任務(wù)啟動(dòng)函數(shù),在這個(gè)函數(shù)中我們要?jiǎng)?chuàng)建一個(gè)計(jì)數(shù)信號(hào)量并且啟動(dòng)其他的相關(guān)任務(wù)函數(shù)。
void Start_LED(void * pvParameters)
{
taskENTER_CRITICAL();
LED_SemaphoreHandler = xSemaphoreCreateCounting(20,0);//最大計(jì)數(shù)20,初始0
if(LED_SemaphoreHandler!=NULL)
{
printf("Semaphore Create Successfullyrn");
}
xTaskCreate((TaskFunction_t )LED_TOG,//任務(wù)函數(shù)
(char * )"LED_TOG",//任務(wù)名稱(chēng)
(configSTACK_DEPTH_TYPE) 128,//堆??臻g128Byte
(void* ) NULL,//無(wú)返回
(UBaseType_t ) 1,//優(yōu)先級(jí)1
(TaskHandle_t * )&LED_TOG_Handler);//任務(wù)函數(shù)句柄
xTaskCreate((TaskFunction_t )LED_TOG2,//任務(wù)函數(shù)
(char * )"LED_TOG2",//任務(wù)名稱(chēng)
(configSTACK_DEPTH_TYPE) 128,//堆??臻g128Byte
(void* ) NULL,//無(wú)返回
(UBaseType_t ) 2,//優(yōu)先級(jí)1
(TaskHandle_t * )&LED_TOG2_Handler);//任務(wù)函數(shù)句柄
xTaskCreate((TaskFunction_t )CountTest,//任務(wù)函數(shù)
(char * )"GetCount",//任務(wù)名稱(chēng)
(configSTACK_DEPTH_TYPE) 128,//堆棧空間128Byte
(void* ) NULL,//無(wú)返回
(UBaseType_t ) 0,//優(yōu)先級(jí)1
(TaskHandle_t * )&GetCount_Handler);//任務(wù)函數(shù)句柄
taskEXIT_CRITICAL();
vTaskSuspend(LED_TOG2_Handler);
vTaskDelete(NULL);
}
其次LED函數(shù)的內(nèi)容非常簡(jiǎn)單,檢測(cè)信號(hào)量是否創(chuàng)建(指針不為空)如果指針不為空則翻轉(zhuǎn)LED,并且釋放信號(hào)量。(注意第二個(gè)LED的函數(shù)不釋放信號(hào)量防止釋放兩次信號(hào)量)
void LED_TOG(void * pvParameters)//參數(shù)為 void * pvParameters
{
while(1)
{
if(LED_SemaphoreHandler!=NULL)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
xSemaphoreGive(LED_SemaphoreHandler);
}
vTaskDelay(500);//延遲500ms
}
}
void LED_TOG2(void * pvParameters)//參數(shù)為 void * pvParameters
{
while(1)
{
if(LED_SemaphoreHandler!=NULL)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
}
vTaskDelay(500);
}
}
在循環(huán)檢測(cè)函數(shù)中,我們定義一個(gè)count來(lái)接收計(jì)數(shù)信號(hào)量的數(shù)量。接著當(dāng)信號(hào)量大于10時(shí)我們恢復(fù)LED2函數(shù)的運(yùn)行(可以多次恢復(fù),只有一次效果)。
當(dāng)信號(hào)量為20時(shí),我們先暫停LED1函數(shù)的運(yùn)行防止我們清空信號(hào)量的時(shí)候LED1又在釋放信號(hào)量。之后通過(guò)不斷的獲取信號(hào)量來(lái)清空信號(hào)量,因?yàn)樾盘?hào)量本質(zhì)就是隊(duì)列,之后恢復(fù)他們的運(yùn)行。
void CountTest(void * pvParameters)
{
while(1)
{
BaseType_t count;
if(LED_SemaphoreHandler!=NULL)
{
count = uxSemaphoreGetCount(LED_SemaphoreHandler);
if(count >= 9 )
{
vTaskResume(LED_TOG2_Handler);//恢復(fù)函數(shù)2
}
if(count >= 20 )
{
vTaskSuspend(LED_TOG_Handler);//先掛起函數(shù)1
while(count != 0)
{
xSemaphoreTake(LED_SemaphoreHandler,10);
count = uxSemaphoreGetCount(LED_SemaphoreHandler);
}
vTaskResume(LED_TOG_Handler);//恢復(fù)函數(shù)1
vTaskSuspend(LED_TOG2_Handler);//掛起函數(shù)2
}
}
vTaskDelay(10);
}
}
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
761瀏覽量
41476 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4237瀏覽量
61969 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61726 -
信號(hào)量
+關(guān)注
關(guān)注
0文章
53瀏覽量
8282
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論