(49)consoleInit() *打印初始化*【FREERTOS信号量】

it2024-10-19  40

 

文章目录

 

 


前言

consoleInit() /*打印初始化*/

一、void consoleInit()

void consoleInit() {     if (isInit) return;     messageToPrint.msgID = UP_PRINTF; // UP_PRINTF  = 0x51     messageToPrint.dataLen = 0;     vSemaphoreCreateBinary(synch);     isInit = true; }

二、vSemaphoreCreateBinary(synch);

2.1信号量简介

信号量在操作系统中极其重要,一般用于进行资源管理和任务同步。

信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。

信号量其实就是一个Flag,那么为什么要使用信号量呢:

在编写中断服务程序的过程中,我们知道中断服务程序里面不能放太多的代码,否则影响代码运行的实时性。裸机的中断服务函数一般就是Flag置位,然后在其他地方进行处理。在RTOS系统中就是在中断中释放信号量,在某一个任务中获取信号量,如果获取到信号量就说明中断发生了,那么就开始进行中断服务函数的处理。

二值信号其实就是一个只有一个队列项的队列,因此要么是满的要么是空的。使用这个队列不用在乎队列中存的是什么消息,只需要知道这个队列是满的还是空的。

和队列一样,信号量API函数允许设置一个阻塞时间,如果多个任务同时阻塞在同一个信号量上的话,当信号有效时,高优先级的任务就会解除阻塞状态。

二值信号量的工作过程:

二值信号量无效→中断释放信号量→任务获取信号量成功→任务再次进入阻态

2.2 创建二值信号量

     参数: 创建成功的二值信号量的句柄

     返回值: NULL创建失败  其他值 创建成功 

     无参数

     返回值:NULL创建失败 其他值 创建成功的二值信号量的句柄

v版本的创建函数 创建后立即释放信号量 即信号是有效的

x版本的创建函数 创建后信号是无效的

通过队列结构体成员变量 uxMessagesWaiting 来判断队列是否为空。

2.3 释放信号量

 

 



                      

                                            

2.3获取信号量

数据读取完成后要将uxMessagesWaiting减一,然后解除某些因为入队而阻塞的任务。

2.4实践举例

   串口发送指令控制开发板上的LED1 和BEEP 开关的实验。

    开发板使用中断接受,当接收到数据以后就释放二值信号量。

总结

二值信号的 : 

创建:    vSemaphoreCreateBinary(xSemaphore);

释放:    xSemaphoreGive(xSemaphore);

获取: xSemaphoreTake(xSemaphore,xBlockTime);

 

最新回复(0)