freertos从入门到精通(freeRTOS使用方法)
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。
信号量通常在操作系统中用于控制对共享资源的访问和同步任务。它们也是学习freeRTOS操作系统时必须掌握的。
0
这些信号量如下:
1、二值信号量
(1)二进制信号量
二进制信号量是仅由两个值(0和1)创建的信号量,通常用于互斥访问或同步。
当二进制信号量在一个地方被使用后,其他地方想申请该二进制信号量是无法成功申请的,只有当占用的二进制信号量被使用并释放后,才可以再次使用!
总之,二进制信号量在使用后会失效,需要重新释放才能进入有效状态。
就像十字路口的交通灯一样,二进制信号量只有两种状态:可通过和不可通过。在freeRTOS中,答案是“是”和“不是”。下面是一个例子:
在freeRTOS中,二进制信号量是创建的,使用的API管理函数如下:
(2)创建二进制信号量
函数原型:
SemaphoreHandle_t xSemaphoreCreateBinary(void)函数说明:xSemaphoreCreateBinary函数用于创建二进制信号量。
返回值:如果创建成功则返回二进制信号量的句柄,如果创建失败则返回NULL。
(3)等待二进制信号
在freeRTOS中,信号量获取是有区别的。在任务或函数中获取信号量与在中断中获取信号量是不一样的。freeRTOS提供了不同的API函数。
1)等待任务码中的信号量
函数原型:
xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);函数描述:
xSemaphoreTake函数用于在任务代码中获取信号量。第一个参数是信号量句柄。第二个参数是在没有信号量可用时等待信号量可用的最大时间(以系统时钟节拍为单位)。返回值:如果创建成功则返回pdTRUE,如果创建失败则返回pdFALSE。使用此函数时请注意以下事项:
该函数用于在任务代码中调用,不能在中断服务例程中调用,中断服务例程使用xSemaphoreTakeFromISR。
2)等待中断中的信号量
XSemaphoreTakeFromISR (xSemaphore, pxHigherPriorityTaskWoken)函数描述:该函数获取中断的信号量XSemaphoreTakeFromISR。
第一个参数是要获取的信号量的句柄。这是创建信号量时返回的句柄。第二个参数是如果信号量导致任务取消阻止,且未停止的任务优先级高于当前正在运行的任务,则xSemaphoreTakeFromISR()将pxHigherPriorityTaskWoken设置为pdTRUE。如果xSemaphoreTakeFromISR()将此值设置为pdTRUE,则应该在退出中断之前请求上下文切换。返回值:如果创建成功则返回pdTRUE,如果创建失败则返回pdFALSE。(4)释放二进制信号量
1)用于释放任务代码中的二进制信号量
函数原型:
xSemaphoreGive(SemaphoreHandle_t);函数描述:释放信号量。xSemaphoreGive函数用于释放任务代码中的信号量。
是信号量句柄。如果信号量成功释放,则返回pdTRUE,否则返回pdFALSE,因为信号量的实现是基于消息队列的。返回失败的主要原因是消息队列已满。注意:此函数用于在任务代码中调用,不能在中断服务例程中调用。
2)用于中断时释放二进制信号量
函数原型:
XSemaphoreGiveFromISR (SemaphoreHandle_t xSemaphore, signed BaseType_t * pxHigherPriorityTaskWoken)函数描述:XSemaphoreGiveFromISR函数用于在中断服务例程中释放信号量。
是信号量句柄。PxHigherPriorityTaskWoken:如果有高优先级任务,则准备保持。如果函数执行后该参数的值为pdTRUE,则表示有高优先级的任务要执行。否则,没有任务可执行。返回值:如果信号量释放成功,则返回pdTRUE,否则返回errQUEUE_FULL。
2、计数信号量
count信号量是一个长度大于1的队列,用于任务间同步和共享资源保护。
计数信号量和二进制信号量的区别在于二进制信号量只能在一个地方申请使用,并且只能在应用程序释放时申请在其他地方使用。计数信号量可以创建一定数量的信号量,但多个地方可以同时申请使用,直到达到计数信号量的最大阈值。
计数信号量相关的API函数:
(1)创建计数信号量
SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);
uxMaxCount:设置该计数信号量支持的最大计数值。uxInitialCount:设置计数信号量的初始值。返回值:如果创建成功则返回消息队列的句柄,如果创建失败则返回NULL。(2)获取信号量
1)在任务代码中获取信号量
xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);注:xSemaphoreTake函数用于在任务代码中获取信号量。
是信号量句柄。xTicksToWait:当没有信号量可用时,信号量变为可用的最大等待时间(以系统时钟节拍为单位)。返回值:如果成功获取信号量,则返回pdTRUE,否则返回pdFALSE。2)在中断中获取信号量
XSemaphoreTakeFromISR (xSemaphore, pxHigherPriorityTaskWoken)函数描述:该函数获取中断的信号量XSemaphoreTakeFromISR。
xSemaphore:要获取的信号量的句柄。这是创建信号量时返回的句柄。PxHigherPriorityTaskWoken:如果信号量正在导致任务取消阻止,并且没有停止任务优先级高于当前正在运行的任务,则xSemaphoreTakeFromISR()将PxHigherPriorityTaskWoken设置为pdTRUE。如果xSemaphoreTakeFromISR()将此值设置为pdTRUE,则应该在退出中断之前请求上下文切换。返回值:如果创建成功则返回pdTRUE,如果创建失败则返回pdFALSE。(3)释放信号
1)释放任务代码中的信号量
xSemaphoreGive(SemaphoreHandle_t);函数xSemaphoreGive用于在任务代码中释放信号量。
是信号量句柄。返回值:如果信号量释放成功,则返回pdTRUE,如果未释放,则返回pdFALSE,因为计数信号量的实现是基于消息队列的,返回失败的主要原因是消息队列已满。2)释放中断中的信号量
xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,signed pxHigherPriorityTaskWoken BaseType_t *TickType_t xTicksToWait);函数说明:xSemaphoreTake函数用于获取任务代码中的信号量。
是信号量句柄。xTicksToWait:当没有信号量可用时,信号量变为可用的最大等待时间(以系统时钟节拍为单位)。返回值:如果创建成功则返回pdTRUE,如果创建失败则返回pdFALSE。(3)释放互斥信号量
函数原型:
xSemaphoreGive(SemaphoreHandle_t);函数描述:xSemaphoreGive函数用于释放任务代码中的信号量。
是信号量句柄。返回值:如果信号量释放成功,则返回pdTRUE,如果未释放,则返回pdFALSE,因为信号量的实现是基于消息队列的,所以返回失败的主要原因是消息队列已满。使用二进制信号量和计数信号量的思路如下:
1)通过任务start_task创建两个任务led0_task和led2_task,一个二进制信号量binary_sem和一个计数信号量count_sem。
2)信号量创建成功后,检查led0_task任务中的信号量,如果可以获得,则翻转LED2的状态。
3)周期翻转led2_task任务中LED3的状态,表示系统正在运行。
4)通过外部中断获取按键按下,更新信号量值。
注意:本例程使用GD32E103进行演示,并通过一个键更新信号量来改变LED灯的状态。
(1)创建任务和二进制信号量和计数信号量
void start_task(void *pvParameters)(2)任务函数
void led0_task(void *pvParameters)}*/if(count_sem !=NULL)} vTaskDelay(100);}}void led2_task(void *pvParameters)}(3)中断处理函数
void EXTI10_15_IRQHandler(void)*/if(count_sem !=NULL) }}
本文主要介绍了关于freertos从入门到精通(freeRTOS使用方法)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://seotea.com/article/1467305.html