(4/9)consoleInit() /*打印初始化*/【FREERTOS信号量】

 

文章目录

 

 


前言

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值