UCOSIII操作系统
UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
【UCOSIII操作系统】任务篇(1)创建任务
【UCOSIII操作系统】任务篇(2)相关API函数
【UCOSIII操作系统】系统初始化篇(1)系统初始化
【UCOSIII操作系统】系统初始化篇(2)CPU,SysTick,内存初始化
【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
【UCOSIII操作系统】消息队列篇(1)消息队列
【UCOSIII操作系统】消息队列篇(2)任务消息队列
【UCOSIII操作系统】信号量与互斥量篇(1)信号量
【UCOSIII操作系统】信号量与互斥量篇(2)互斥量
【UCOSIII操作系统】事件篇
【UCOSIII操作系统】中断管理篇
【UCOSIII操作系统】临界段篇
【UCOSIII操作系统】软件定时器篇
【UCOSIII操作系统】内存管理篇
已完结
说在前面:
这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。
这篇文章是个人学习整理,如有错误请指正
UCOSIII操作系统——信号量与互斥量篇(1)任务信号量
前面我们使用信号量时都需要先创建一一个信号量,不过在UCOSIII中每个任务都有自己的内嵌的信号量,这种功能不仅能够简化代码,而且比使用独立的信号量更有效。
- 专业讲解
- 相对于前面使用uCOS 内核通信的资源,必须创建二进制信号量、计数信号量等情况,使用任务信号量显然更灵活。因为使用任务信号量比通过内核对象信号量通信方式解除阻塞的任务的速度要快,并且更加节省RAM内存空间,任务信号量的使用无需单独创建信号量。
- 通过对任务信号量的合理使用,可以在一定场合下替代uCOS的信号量,用户只需向任务内部的信号量发送–个信号而不用通过外部的信号量进行发送,这样子处理就会很方便并且更加高效,当然,凡事都有利弊,不然的话uCOS还要内核的IPC通信机制干嘛,任务信号量虽然处理更快,RAM开销更小,但也有限制:只能有一个任务接收任务信号.量,因为必须指定接收信号量的任务,才能正确发送信号量;而内核对象的信号量则没有这个限制,用户在释放信号量,可以采用广播的方式,让所有等待信号量的任务都获取到信号量。
- 在实际任务间的通信中,一个或多个任务发送–个信号量给另一个任务是非常常见的,而一个任务给多个任务发送信号量的情况相对比较少。这种情况就很适合采用任务信号量进行传递信号,如果任务信号量可以满足设计需求,那么尽量不要使用普通信号量,这样子设计的系统会更加高效。
- 任务信号量的运作机制与普通信号量一样,没什么差别。
- 任务内信号量不需要创建,在创建任务的时候就自动创建了,直接使用API函数就行
任务信号量的API函数
函数 | 描述 |
---|---|
OSTaskSemPend() | 等待任务信号量(常用) |
OSTaskSemPost() | 发布任务信号量(常用) |
OSTaskSemPendAbort() | 取消等待任务信号量 |
OSTaskSemSet() | 强行设置任务信号量计数 |
等待任务信号量->OSTaskSemPend()
- 函数原型
OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, //等待超时时间
OS_OPT opt, //选项
CPU_TS *p_ts, //返回时间戳
OS_ERR *p_err) //返回错误类型
timeout: 如果在指定的节拍数内没有收到信号量任务就会因为等待超时而恢复运行,如果timeout为0的话任务就会-一直等待,直到收到信号量。
opt: 用于选择是否使用阻塞模式。
OS_OPT_PEND_BLOCKING指定互斥信号量被占用时,任务挂起等待该互斥信号量。
OS_OPT_PEND_NON_BLOCKING指定当互斥信号量被占用时,直接返回任务。
注意!当设置为OS_ OPT_ PEND_ NON _BLOCKING,是timeout参数就没有意义了,应该设置为0。
- 应用实例
OSTaskSemPend ((OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待
(CPU_TS *)&ts, //获取信号量被发布的时间戳
(OS_ERR *)&err); //返回错误类型
发布任务信号量->OSTaskSemPost()
与OSTaskSemPost(任务信号量释放函数相对应,OSTaskSemPend()函 数用于获取一-个任务信号量,参数中没有指定某个任务去获取信号量,实际上就是当前运行任务获取它自己拥有的任务信号量。
- 函数原型
OS_SEM_CTR OSTaskSemPost (OS_TCB *p_tcb, //目标任务
OS_OPT opt, //选项
OS_ERR *p_err) //返回错误类型
opt: 用来指定是否进行任务调度操作
OS_OPT_POST_NONE 不指定特定的选项
OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度操作。
- 应用实例
OSTaskSemPost((OS_TCB *)&AppTaskPendTCB, //目标任务
(OS_OPT )OS_OPT_POST_NONE, //没选项要求
(OS_ERR *)&err); //返回错误类型
详细代码可以参考正点原子
例10-6 UCOSIII任务内嵌信号量