开启辅助访问 切换到窄版

打印 上一主题 下一主题

UCOSIII的任务内嵌信号量(含API函数实验)

[复制链接]
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
根据前面知识的铺垫,知道要使用信号量的时候需要先创建一个信号量,但在UCOSIII中每个任务都有自己的内嵌信号量,这个特性比使用专门独立的信号量更加有效。任务信号量是直接内嵌在UCOSIII中的,下面我们列出内嵌信号量相关的函数:
OSTaskSemPend() 等待任务信号量
OSTaskSemPendAbort() 取消等待任务信号量
OSTaskSemPost() 发布任务信号量
OSTaskSemSet() 强行设置任务信号量计数

1.等待任务信号量
等待任务内嵌信号量使用函数OSTaskSemPend()OSTaskSemPend()允许一个任务等待由其他任务或者ISR直接发送的信号,使用过程基本与独立信号量相同,
OSTaskSemPend()函数原型如下:

参数解释:
Timeout:在指定的节拍数内没有收到信号量任务就会因为等待超时而恢复运行
Timeout0,则表示任务一直等待信号量。
Opt: 选项是否选择阻塞模式
   OS_OPT_PEND_BLOCKING 指定互斥信号量被占用时,任务挂起等待互斥信号量。
   OS_OPT_PEND_NON_BLOCKING 指定互斥信号量被占用时,直接返回任务。
p_ts: 指向一个时间戳。
p_err: 调用此函数后返回的错误码。

2.发布任务信号量
OSTaskSemPost()可以通过一个任务的内置信号量向某一个任务发送信号量,函数原型如下:

参数解释:
p_tcb: 指向要用信号通知的任务的TCB,当设置为NULL时,可以向自己发送信号量。
Opt: 用来指定是否进行任务调度操作
    OS_OPT_POST_NONE 不指定特定选项。
    OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度操作。
p_err: 调用此函数后返回的错误码。



任务内嵌信号量实验
实验目标:
创建3个任务,任务start_task用于创建其他两个任务,任务task1_task主要用于扫描按键,当检测到keywy_up按下后就向任务task2_task发送一个任务信号量。任务task2_task请求任务信号量,当请求到任务信号量的时候就更新一次屏幕指定区域的背景颜色,要满足以上要求,就要在task1_task任务和task2_task任务之间使用task2_task任务内嵌的信号量来做同步。
当然,使用任务内嵌的信号量不需要创建信号量。


代码编译完成下载,一开始由于任务task2_task内嵌信号量初始值为0,因此开机以后任务task2_task会由于请求不到信号量而堵塞,此时LCD屏显示Task_Sem Value = 0
当按下KEY_up键后就会发送信号量,task2_task任务内嵌信号量的值就会变化,譬如,我们按下12次,LCD显示Task_Sem Value = 12说明task2_task任务可以请求12次任务内嵌信号量,任务task2_task每隔1s就会请求一次内嵌信号量,直到任务内嵌信号量值为0此后,task2_task就请求不到信号量了,因此会堵塞,此时LCD屏显示Task_Sem Value = 0.




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表