文章目录
前言
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);