一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

freeRTOS中最常用到的信號(hào)量有哪些

汽車電子技術(shù) ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 11:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

操作系統(tǒng)系統(tǒng)中,信號(hào)量通常用于控制對(duì)共享資源的訪問和任務(wù)之間進(jìn)行同步,信號(hào)量在操作系統(tǒng)中是很常用的,也是學(xué)習(xí)freeRTOS操作系統(tǒng)必須要掌握的。

freeRTOS中最常用到的信號(hào)量有:二值信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量。

有關(guān)這幾個(gè)信號(hào)量分別如下:

1、二值信號(hào)量

1.1、二值信號(hào)量

二值信號(hào)量是指所創(chuàng)建的信號(hào)量只有兩個(gè)值(0 和 1),通常用于互斥訪問或者同步。

二值信號(hào)量在某處被占有使用之后,其他地方想要申請(qǐng)這個(gè)二值信號(hào)量是無法成功申請(qǐng)的,只有當(dāng)這個(gè)被占有的二值信號(hào)量被使用完畢并釋放之后,才能被再次申請(qǐng)占有使用!

總而言之,二值信號(hào)量被使用之后會(huì)變?yōu)闊o效狀態(tài),需要被重新釋放才能進(jìn)入有效狀態(tài)。

在freeRTOS中,二值信號(hào)量的創(chuàng)建和使用的API管理函數(shù)分別如下:

1.2、創(chuàng)建二值信號(hào)量

函數(shù)原型:SemaphoreHandle_t xSemaphoreCreateBinary(void)

函數(shù)描述:

函數(shù)** xSemaphoreCreateBinary** 用于創(chuàng)建二值信號(hào)量。

返回值: 如果創(chuàng)建成功會(huì)返回二值信號(hào)量的句柄,創(chuàng)建失敗會(huì)返回 NULL。

1.3、等待二值信號(hào)量

在freeRTOS中,信號(hào)量的獲取是進(jìn)行了區(qū)分的,在任務(wù)或者函數(shù)中獲取與在中斷中是不一樣的,freeRTOS中給出了不同API函數(shù)。

1)在任務(wù)代碼中等待信號(hào)量

函數(shù)原型:xSemaphoreTake( SemaphoreHandle_t xSemaphore,  /* 信號(hào)量句柄 */           TickType_t xTicksToWait );     /* 等待信號(hào)量可用的最大等待時(shí)間 */

函數(shù)描述:

函數(shù) xSemaphoreTake 用于在任務(wù)代碼中獲取信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

第 2 個(gè)參數(shù)是沒有信號(hào)量可用時(shí),等待信號(hào)量可用的最大等待時(shí)間,單位系統(tǒng)時(shí)鐘節(jié)拍。

返回值:如果創(chuàng)建成功會(huì)獲取信號(hào)量返回 pdTRUE,否則返回 pdFALSE。

使用這個(gè)函數(shù)要注意以下問題:

此函數(shù)是用于任務(wù)代碼中調(diào)用的,不可以在中斷服務(wù)程序中調(diào)用此函數(shù),中斷服務(wù)程序使用的是xSemaphoreTakeFromISR。

2)在中斷中等待信號(hào)量

xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )

函數(shù)描述:

函數(shù)xSemaphoreTakeFromISR用于在中斷中獲取信號(hào)量。

第 1 個(gè)參數(shù)是要獲取的信號(hào)量的句柄。這是創(chuàng)建信號(hào)量時(shí)返回的句柄。

第 2 個(gè)參數(shù)是如果采用信號(hào)量導(dǎo)致任務(wù)取消阻止,并且未阻止的任務(wù)的優(yōu)先級(jí)高于當(dāng)前運(yùn)行的任務(wù),則xSemaphoreTakeFromISR()會(huì)將pxHigherPriorityTaskWoken設(shè)置為pdTRUE。

如果xSemaphoreTakeFromISR()將此值設(shè)置為pdTRUE,則應(yīng)在退出中斷之前請(qǐng)求上下文切換。

返回值:如果創(chuàng)建成功會(huì)獲取信號(hào)量返回 pdTRUE,否則返回 pdFALSE。

1.4、釋放二值信號(hào)量

1)用于在任務(wù)代碼中釋放二值信號(hào)量

函數(shù)原型:

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號(hào)量句柄 */

函數(shù)描述:釋放信號(hào)量

函數(shù) xSemaphoreGive 用于在任務(wù)代碼中釋放信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

返回值,如果信號(hào)量釋放成功返回 pdTRUE,否則返回 pdFALSE,因?yàn)樾盘?hào)量的實(shí)現(xiàn)是基于消息隊(duì)列,返回失敗的主要原因是消息隊(duì)列已經(jīng)滿了。

注意:此函數(shù)是用于任務(wù)代碼中調(diào)用的,不可以在中斷服務(wù)程序中調(diào)用此函數(shù)。

2)用于在中斷中釋放二值信號(hào)量

函數(shù)原型:

xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore, signed BaseType_t *pxHigherPriorityTaskWoken)

函數(shù)描述:

函數(shù) xSemaphoreGiveFromISR 用于中斷服務(wù)程序中釋放信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

第2個(gè)參數(shù)用于保存是否有高優(yōu)先級(jí)任務(wù)準(zhǔn)備就緒。如果函數(shù)執(zhí)行完畢后,此參數(shù)的數(shù)值是pdTRUE,說明有高優(yōu)先級(jí)任務(wù)要執(zhí)行,否則沒有。

返回值:如果信號(hào)量釋放成功返回 pdTRUE,否則返回 errQUEUE_FULL。

2、計(jì)數(shù)信號(hào)量

計(jì)數(shù)信號(hào)量是一個(gè)相當(dāng)于長(zhǎng)度大于1的隊(duì)列,用于任務(wù)之間的同步和共享資源的保護(hù)。

計(jì)數(shù)信號(hào)量與二值信號(hào)量的不同在于,二值信號(hào)量只能被一個(gè)地方申請(qǐng)使用,只有在這個(gè)申請(qǐng)使用的地方了釋放了才能被其他處申請(qǐng)使用。而計(jì)數(shù)信號(hào)量是可以創(chuàng)建一定數(shù)量的信號(hào)量的,多個(gè)地方可以同時(shí)申請(qǐng)使用,直到達(dá)到最大的計(jì)數(shù)信號(hào)量的閾值。

計(jì)數(shù)信號(hào)量相關(guān)的API函數(shù):

2.1、創(chuàng)建計(jì)數(shù)信號(hào)量

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,   /* 支持的最大計(jì)數(shù)值 */               UBaseType_t uxInitialCount);    /* 初始計(jì)數(shù)值 */

第 1 個(gè)參數(shù):設(shè)置此計(jì)數(shù)信號(hào)量支持的 最大計(jì)數(shù)值

第 2 個(gè)參數(shù):設(shè)置計(jì)數(shù)信號(hào)量的 初始值 。(為0則不起作用)

返回值:如果創(chuàng)建成功會(huì)返回消息隊(duì)列的句柄,創(chuàng)建失敗會(huì)返回 NULL。

2.2、獲取信號(hào)量

1)在任務(wù)代碼中獲取信號(hào)量

xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信號(hào)量句柄 */           TickType_t xTicksToWait ); /* 等待信號(hào)量可用的最大等待時(shí)間 */

函數(shù) xSemaphoreTake 用于在任務(wù)代碼中獲取信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

第 2 個(gè)參數(shù)是沒有信號(hào)量可用時(shí),等待信號(hào)量可用的最大等待時(shí)間,單位系統(tǒng)時(shí)鐘節(jié)拍。

返回值:如果信號(hào)量獲取成功會(huì)返回 pdTRUE,否則返回 pdFALSE。

2)在中斷中獲取信號(hào)量

xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )

函數(shù)描述:

函數(shù) **xSemaphoreTakeFromISR **用于在中斷中獲取信號(hào)量。

第 1 個(gè)參數(shù)是要獲取的信號(hào)量的句柄。這是創(chuàng)建信號(hào)量時(shí)返回的句柄。

第 2 個(gè)參數(shù)是如果采用信號(hào)量導(dǎo)致任務(wù)取消阻止,并且未阻止的任務(wù)的優(yōu)先級(jí)高于當(dāng)前運(yùn)行的任務(wù),則xSemaphoreTakeFromISR()會(huì)將pxHigherPriorityTaskWoken設(shè)置為pdTRUE。如果xSemaphoreTakeFromISR()將此值設(shè)置為pdTRUE,則應(yīng)在退出中斷之前請(qǐng)求上下文切換。

返回值,如果創(chuàng)建成功會(huì)獲取信號(hào)量返回 pdTRUE,否則返回 pdFALSE。

2.3、釋放信號(hào)量

1)在任務(wù)代碼中釋放信號(hào)量

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號(hào)量句柄 */

函數(shù) xSemaphoreGive 用于在任務(wù)代碼中釋放信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

返回值,如果信號(hào)量釋放成功返回 pdTRUE,否則返回 pdFALSE,因?yàn)橛?jì)數(shù)信號(hào)量的實(shí)現(xiàn)是基于消息隊(duì)列,返回失敗的主要原因是消息隊(duì)列已經(jīng)滿了。

2)在中斷中釋放信號(hào)量

xSemaphoreGiveFromISR(          SemaphoreHandle_t xSemaphore, /* 信號(hào)量句柄 */          signed BaseType_t *pxHigherPriorityTaskWoken /* 高優(yōu)先級(jí)任務(wù)是否被喚醒的狀態(tài)保存 */          )

第 1 個(gè)參數(shù)是信號(hào)量句柄。

第2個(gè)參數(shù)用于保存是否有高優(yōu)先級(jí)任務(wù)準(zhǔn)備就緒。如果函數(shù)執(zhí)行完畢后,此參數(shù)的數(shù)值是pdTRUE,說明有高優(yōu)先級(jí)任務(wù)要執(zhí)行,否則沒有。

返回值:如果信號(hào)量釋放成功返回 pdTRUE,否則返回 errQUEUE_FULL。

3、優(yōu)先級(jí)反轉(zhuǎn) & 互斥信號(hào)量

在實(shí)時(shí)操作系統(tǒng)中,優(yōu)先級(jí)反轉(zhuǎn)的問題是不容忽視的,程序設(shè)計(jì)的過程中,也是要充分考慮這個(gè)問題的。

那優(yōu)先級(jí)反轉(zhuǎn)到底是什么呢?

優(yōu)先反轉(zhuǎn)是指:假如一個(gè)系統(tǒng)中有高(H)、中(M)、低(L)三個(gè)優(yōu)先級(jí)的任務(wù),并有一個(gè)二值信號(hào)量。在某一個(gè)時(shí)刻二值信號(hào)量被低(L)優(yōu)先級(jí)的任務(wù)使用了,并在運(yùn)行過程中,高優(yōu)先級(jí)任務(wù)(H)搶占了低優(yōu)先級(jí)(L)的CPU使用權(quán),但是也想要獲取二值信號(hào)量被低優(yōu)先(L)的任務(wù)占有著,高優(yōu)先級(jí)任務(wù)(H)由此被掛起等待了,中優(yōu)先級(jí)任務(wù)(M)因?yàn)椴恍枰敌盘?hào)量,會(huì)搶占低優(yōu)先級(jí)(L)任務(wù)的執(zhí)行而得到運(yùn)行,而高優(yōu)先級(jí)任務(wù)(H)依然只能等到低優(yōu)先級(jí)任務(wù)(L)釋放二值信號(hào)量才能得到執(zhí)行。

由此造成了高優(yōu)先級(jí)任務(wù)得不到及時(shí)的執(zhí)行,而低優(yōu)先級(jí)任務(wù)卻能比高優(yōu)先級(jí)任務(wù)更多的得到執(zhí)行。

優(yōu)先級(jí)互斥的示意圖如下:

圖片

解決優(yōu)先級(jí)反轉(zhuǎn)的問題最好的辦法是使用互斥信號(hào)量。

互斥信號(hào)量和二值信號(hào)量比較相似,不同之處在于互斥信號(hào)量具有優(yōu)先級(jí)繼承的特性,如果一個(gè)互斥信號(hào)量正在被一個(gè)低優(yōu)先級(jí)的任務(wù)使用,而此時(shí)這個(gè)高優(yōu)先級(jí)的任務(wù)也希望獲取這個(gè)互斥信號(hào)量的話就會(huì)被阻塞。

使用互斥信號(hào)量時(shí),高優(yōu)先級(jí)的任務(wù)會(huì)把低優(yōu)先級(jí)的任務(wù)的優(yōu)先級(jí)先提高到和自己相同的優(yōu)先級(jí),保證低優(yōu)先級(jí)的任務(wù)能夠繼續(xù)運(yùn)行至結(jié)束這樣極大減少了因?yàn)楦邇?yōu)先級(jí)獲取不到信號(hào)量被阻塞過長(zhǎng)時(shí)間的問題。

互斥信號(hào)量的API函數(shù):

1)創(chuàng)建互斥信號(hào)量

函數(shù)原型:

SemaphoreHandle_t xSemaphoreCreateMutex(void)

函數(shù)描述:

函數(shù) xSemaphoreCreateMutex 用于創(chuàng)建互斥信號(hào)量。

返回值:如果創(chuàng)建成功會(huì)返回互斥信號(hào)量的句柄,失敗會(huì)返回 NULL。

2)獲取互斥信號(hào)量

函數(shù)原型:

xSemaphoreTake( SemaphoreHandle_t xSemaphore, /* 信號(hào)量句柄 */           TickType_t xTicksToWait ); /* 等待信號(hào)量可用的最大等待時(shí)間 */

函數(shù)描述:

函數(shù) xSemaphoreTake 用于在任務(wù)代碼中獲取信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

第 2 個(gè)參數(shù)是沒有信號(hào)量可用時(shí),等待信號(hào)量可用的最大等待時(shí)間,單位系統(tǒng)時(shí)鐘節(jié)拍。

返回值:如果創(chuàng)建成功會(huì)獲取信號(hào)量返回 pdTRUE,否則返回 pdFALSE。

(2)釋放互斥信號(hào)量

函數(shù)原型:

xSemaphoreGive( SemaphoreHandle_t xSemaphore ); /* 信號(hào)量句柄 */

函數(shù)描述:

函數(shù) xSemaphoreGive 用于在任務(wù)代碼中釋放信號(hào)量。

第 1 個(gè)參數(shù)是信號(hào)量句柄。

返回值:如果信號(hào)量釋放成功返回 pdTRUE,否則返回 pdFALSE,因?yàn)樾盘?hào)量的實(shí)現(xiàn)是基于消息隊(duì)列,返回失敗的主要原因是消息隊(duì)列已經(jīng)滿了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7122

    瀏覽量

    125258
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    492

    瀏覽量

    64021
  • 信號(hào)量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8532
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    實(shí)時(shí)操作系統(tǒng)FreeRTOS信號(hào)量應(yīng)用

    二值信號(hào)量常用于互斥訪問或同步,二值信號(hào)量和互斥信號(hào)量非常相似,但還是細(xì)微差別,互斥信號(hào)量
    的頭像 發(fā)表于 06-08 09:24 ?4064次閱讀
    實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>應(yīng)用

    FreeRTOS串口中斷接收不定長(zhǎng)的數(shù)據(jù)與二值信號(hào)量的使用

    FreeRTOS例程,使用串口中斷接收不定長(zhǎng)的數(shù)據(jù),以及二值信號(hào)量的使用
    的頭像 發(fā)表于 09-26 09:02 ?5131次閱讀
    <b class='flag-5'>FreeRTOS</b>串口中斷接收不定長(zhǎng)的數(shù)據(jù)與二值<b class='flag-5'>信號(hào)量</b>的使用

    FreeRTOS信號(hào)量使用教程

    信號(hào)量是操作系統(tǒng)中重要的一部分,信號(hào)量一般用來進(jìn)行資源管理和任務(wù)同步, FreeRTOS信號(hào)量又分為二值信號(hào)量、 計(jì)數(shù)型
    的頭像 發(fā)表于 12-19 09:22 ?3791次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>使用教程

    FreeRTOS信號(hào)量的使用與實(shí)例

    在嵌入式系統(tǒng)中,任務(wù)管理是一個(gè)重要的部分,它涉及到任務(wù)之間的通信和同步,信號(hào)量,隊(duì)列,互斥鎖和事件標(biāo)志組等概念。本文將以 FreeRTOS 為例,詳細(xì)講解這些內(nèi)容。
    的頭像 發(fā)表于 12-12 15:25 ?3407次閱讀

    轉(zhuǎn):freeRTOS信號(hào)量學(xué)習(xí)

    信號(hào)量同樣是RTOS學(xué)習(xí)中很重要的一節(jié),信號(hào)量可以用在共享資源或者同步任務(wù)中,對(duì)執(zhí)行權(quán)的控制,誰擁有信號(hào)量誰擁有執(zhí)行權(quán),在freeRTOS信號(hào)量
    發(fā)表于 08-12 18:29

    freertos信號(hào)量同步的時(shí)候多任務(wù)運(yùn)行老是崩潰的原因?

    freertos信號(hào)量同步的時(shí)候,多任務(wù)運(yùn)行,老是崩潰,各位沒遇到過目前移植了,freertos 系統(tǒng),所以需要用到,線程同步,然后使
    發(fā)表于 06-18 09:00

    FreeRTOS信號(hào)量介紹

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)閱讀建議:一定操作系統(tǒng)基礎(chǔ)知識(shí)。FreeRTOS信號(hào)量1. 二值
    發(fā)表于 01-27 07:28

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)閱讀建議:一定操作系統(tǒng)基礎(chǔ)知識(shí)。FreeRTOS信號(hào)量1. 二值
    發(fā)表于 12-03 18:06 ?1次下載
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b> & ESP32實(shí)戰(zhàn)

    FreeRTOS 隊(duì)列 信號(hào)量 互斥

    文章目錄前言Queue 隊(duì)列semaphore 信號(hào)量Mutex 互斥微信公眾號(hào)前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX生成帶
    發(fā)表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊(duì)列 <b class='flag-5'>信號(hào)量</b> 互斥<b class='flag-5'>量</b>

    FreeRTOS高級(jí)篇6---FreeRTOS信號(hào)量分析

    FreeRTOS信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:39 ?7次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇6---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>分析

    FreeRTOS系列第20篇---FreeRTOS信號(hào)量API函數(shù)

    FreeRTOS信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:44 ?4次下載
    <b class='flag-5'>FreeRTOS</b>系列第20篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>API函數(shù)

    在Arduino IDE中使用FreeRTOS信號(hào)量

    電子發(fā)燒友網(wǎng)站提供《在Arduino IDE中使用FreeRTOS信號(hào)量.zip》資料免費(fèi)下載
    發(fā)表于 01-04 10:18 ?0次下載
    在Arduino IDE中使用<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>

    FreeRTOS的二值信號(hào)量

    FreeRTOS中的信號(hào)量是一種任務(wù)間通信的方式,信號(hào)量包括:二值信號(hào)量、互斥信號(hào)量、計(jì)數(shù)信號(hào)量
    的頭像 發(fā)表于 02-10 15:07 ?1732次閱讀

    使用Linux信號(hào)量實(shí)現(xiàn)互斥點(diǎn)燈

    信號(hào)量常用于控制對(duì)共享資源的訪問,計(jì)數(shù)型信號(hào)量和二值信號(hào)量之分。初始化時(shí)信號(hào)量值大于1的,就是
    的頭像 發(fā)表于 04-13 15:12 ?1035次閱讀
    使用Linux<b class='flag-5'>信號(hào)量</b>實(shí)現(xiàn)互斥點(diǎn)燈

    FreeRTOS四種信號(hào)量詳細(xì)介紹

    1、二值信號(hào)量 二值信號(hào)量常用于互斥訪問或同步,二值信號(hào)量和互斥信號(hào)量非常類似,但是還是一些
    的頭像 發(fā)表于 07-06 17:14 ?3165次閱讀