当前位置:网站首页>[FreeRTOS] 07 binary semaphore and count semaphore
[FreeRTOS] 07 binary semaphore and count semaphore
2022-06-24 00:02:00 【xiaobaibai_ two thousand and twenty-one】
This section begins with freeRTOS The amount of signal , Let's start with the most basic binary semaphore , Counting semaphores will be explained later , Finally, the difference between semaphore and critical section protection .
1) What is semaphore
Semaphore is a method used to solve resource sharing and process synchronization in operating system .
Give two examples to illustrate .
Resource sharing : Suppose we have a serial port in our system , Each task sends data through it , This serial port can be regarded as a shared resource ; If you let the task access the serial port at will without control , It is likely that a task will send part of the data , Serial port resources are preempted by other tasks , New data sent ; This causes a shared resource error . We hope that when a task accesses the serial port , Other tasks that need to access the serial port are waiting , Until the task of occupying the serial port is used up, and the serial port resources are released , Then it's the next task to visit .
Semaphores are used to deal with such problems , We can make an agreement , Before accessing serial port resources , Each task competes to obtain semaphore first , The task that obtains the semaphore can access the serial port , Other tasks are ( Semaphore ) Blocking ; Wait until the first task is visited , It releases semaphores , Let the blocked tasks compete again , It's the same after that , The task of obtaining the semaphore can obtain the right to use the serial port . In this way, we can solve the problem of resource sharing through semaphores .
Synchronization tasks : Semaphores are simple for task synchronization , If there is a sequence requirement between multiple tasks , Required tasks A Completed the event a, To perform a task B The function in b, So we can be in the event a Then release a semaphore , And in the b Wait for this semaphore before executing , Then the task is guaranteed A、B Events in are executed synchronously .
Semaphores act a bit like global identifiers , We can also use global variables to share resources and synchronize tasks , Only the semaphore also has the function of blocking tasks , It is more convenient to use in the operating system .
2) Binary semaphore
Binary semaphore just as the name suggests , It has only two states , Being occupied can be seen as 0 state , Being unoccupied can be regarded as 1 state .
freeRTOS Provided binary semaphore , It is mainly operated by the following functions :
Create a binary semaphore :
SemaphoreHandle_t xSemaphoreCreateBinary(void); // Create a binary semaphore
SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer ); // Create binary semaphores statically , You need to specify the address space of the semaphore
Release semaphore :
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore ); // Release semaphore
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, signed BaseType_t *pxHigherPriorityTaskWoken); // Release semaphores from interrupts , The return value of the latter parameter indicates whether a high priority task is ready , If there is , You need to switch tasks
Acquisition semaphore :
BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait ); // Acquisition semaphore , The latter parameter is the blocking timeout
BaseType_t xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken); // Get semaphore in interrupt
We use an example to illustrate how to use binary semaphores :
Task02 Used to create semaphores , And every 1s Send a semaphore

Task03 Wait for the semaphore , Once you get , Then print the prompt :

The running results of this example are as follows , It can be found from the time stamp printed ,Task02 Once the semaphore is sent ,Task03 A printout is made immediately , Same as the expected operation results :

If you want to send a semaphore in an interrupt , You can write the code as follows :

The two selected lines are the transmitted semaphores , And deal with situations where high priority tasks are ready .
3) Count the semaphore
freeRTOS Count semaphores provided in , It is different from binary semaphore , It can record the number of times the semaphore is sent , That is to say, the state of the semaphore can be more than 0 and 1, It can be a natural number , That is, it can indicate that the number of resources is greater than 1 The situation of .
such as , We have a memory space , share 10 Bytes , Then we can use an initial value of 10 Count semaphores to manage , Every space used , The semaphore is reduced 1; Every time you release a space , Semaphore plus 1; The semaphore is greater than 0, It means there is space available ; The semaphore is reduced to 0, It means there is no space available .
It can be said that binary semaphore is a special case of counting semaphore , Binary semaphore is the maximum count value 1 Count semaphore .
freeRTOS Count semaphore provided , It is mainly operated by the following functions :
Create a count semaphore :
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount ); // Create a count semaphore , The two parameters are : Maximum count 、 Initial value
SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t * pxSemaphoreBuffer );// Create count semaphores in static form , You need to specify the address space of the semaphore
Release semaphore 、 Get the function of semaphore , Same as binary semaphore , I won't repeat it here .
When using count semaphores , To change the following macro definition to 1:
#define configUSE_COUNTING_SEMAPHORES 1
We also use an example to illustrate how to use counting semaphores :
stay Task02 Count semaphores are defined in , And initialize to 5, After every 1s Send a semaphore :

Task03 Waiting for semaphores in the , And delay for a short time , For easy observation of printed information :

The code runs as follows :
You can see , stay Task02 The semaphore is created and initialized to 5 after ,Task03 Yes 5 Time ; After every 1 second Task02 Send a semaphore ,Task03 Do it once :

4) Relationship between semaphore and critical segment
In the use of semaphores to protect shared resources , We found that , Shared resources protected by semaphores , It is similar to the critical section mentioned in the previous section , The purpose is to protect a piece of code from accidental access .
The difference is , The protection of critical zone is more strict , Once it is protected , Other interrupts 、 No task will be performed , You cannot exit until the current task is completed ; The protection of semaphores is not so strict , It limits only those tasks that wait for this semaphore , Tasks or interrupts that are not related to this semaphore , It is unaffected .
Okay , That's all for this section . In the next section, we will continue to explain semaphores , Discuss a classical problem related to it —— Priority reversal .
If you find it useful, you can pay attention to the author's wechat “ Xiaobai learns Electronics ”, You can find the code and data download address in the official account :

边栏推荐
- SAVE: 软件分析验证和测试平台
- Gbase observation: extended analytical database
- 并发和并行有什么区别?
- Batch renaming of images by MATLAB
- matlab实现对图像批量重命名
- Some common tool functions in work
- Notepad++实用功能分享(正则行尾行首替换常用方法、文本比对功能等)
- Wechat applet picture verification code display
- Don't miss | Huawei's internal data - Successful Project Management PPT (page 123)
- docker 部署redis
猜你喜欢

Don't miss | Huawei's internal data - Successful Project Management PPT (page 123)

Taylor formula and common expansion

Complete open source project poetry bar app

Dot and cross product

物联网卡设备接入EasyCVR,如何查看拉流IP以及拉流时间?

不容错过 | 华为内部资料--成功的项目管理PPT(123页)

跟着CTF-wiki学pwn——ret2text

I was cheated by my colleagues to work overtime on weekends. I haven't seen redis used like this...

AI技术在医学领域有什么用?

docker 部署redis
随机推荐
2. camera calibration
==What is the difference between and equals?
Tiktok practice ~ password retrieval
[technical grass planting] use the shared image function to realize the offline switching from CVM to LH
Detailed explanation of index invalidation caused by MySQL
Six complete open source projects, learning enough at a time
docker redis集群配置
测试 - 用例篇 - 细节狂魔
被同事坑到周末加班, 没见过把Redis用成这个鬼样子的。。。
1. < tag dynamic programming and path combination problem > lt.62 Different paths + lt.63 Different paths II
How to use data warehouse to create time series
List<? Extensions T > and list <? Super T > difference
跟着CTF-wiki学pwn——ret2text
What is the same origin policy?
Smart doc + Torna compatible version
CPU取指到发出控制、微程序控制原理详细过程
What are the good solutions for industrial control safety of production line
What is medical treatment? AI medical concept analysis AI
== 和 equals 的区别是什么?
Visual explanation of clockwise inner curve in Green's formula hole digging method