课后练习二十二之 UCOS 简单信号量
1.信号量(摘自任哲老师的书)
信号量是一类事件。使用信号量最初目的,是为了给共享资源设立一个标志,该标志表示该共享资源被占用情况。这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从中而在了解资源被占用的情况之后,再来决定自己的行为
2. 信号量系统服务
(1)“创建信号量”函数 :在使用一个信号量之前,必须首先调用“创建信号量”函数来创建这个信号量。
OS_EVENT *OSSemCreate(INT16U cnt);
cnt:信号量的初始值。
创建一个信号量,并对信号量的初始计数值赋值,该初始值为0到65,535之间的一个数;
例: OS_EVENT *Sem;
(2)“发送信号量”函数:控制方通过调用“发送信号量”函数使信号量数值加1.如果信号量原来为0,则调用“发送信号量”函数后变成1
OSSemPost (OS_EVENT *pevent);
例:OSSemPost(Sem);
(3)“等待信号量”函数:又称“请求信号量”函数或者“接收信号量”函数。被控制方通过调用“等待信号量”函数来获取信号量。如果当前信号量为0,则调用“等待信号量”函数后就会被系统挂起(进入等待状态),等待控制方发送信号量;如果当前信号量不为0,则调用“等待信号量”函数后就会将信号量减1,然后继续运行。
COSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);
信号量在多任务系统中的功能
(1) 实现对共享资源的互斥访问(包括单个共享资源或多个相同的资源)
(2) 实现任务之间的行为同步
必须在OS_CFG.H中将OS_SEM_EN开关常量置为1,这样μC/OS才能支持信号量。
4.
1. 应用
在中断里发送信号量,按下KEY,灯亮。复位之后,按下KEY,灯亮。
(本人也是菜鸟,采用最简单的方法)
5. 部分程序(user.c)