SDLu的uCOS II 入门学习笔记(3)信号量

SDLu的uCOS II 入门学习笔记(3)信号量

ID:40711590

大小:229.00 KB

页数:3页

时间:2019-08-06

SDLu的uCOS II 入门学习笔记(3)信号量_第1页
SDLu的uCOS II 入门学习笔记(3)信号量_第2页
SDLu的uCOS II 入门学习笔记(3)信号量_第3页
资源描述:

《SDLu的uCOS II 入门学习笔记(3)信号量》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、S.D.Lu的uC/OSII入门学习笔记(3):信号量本篇实验将在上一篇的基础上进行,仍然是运行两个任务,每个任务控制一个LED的亮灭。但是这两个任务将访问一个公共资源,所以用到了信号量进行通信。问题的提出如果两个任务共享一个公共资源,而且只有当一个任务完成访问之后,另一个任务才能访问,那么当一个任务访问该资源未完成时就发生了任务切换,而切换后运行的任务也要访问该资源,这样就发生了访问冲突。一个简单的解决方法就是,给该资源设置一个标志位,用于标识它是否正在被占用。如果被占用,那么要访问该资源的任务需要等待它被释放后才能访问。这就是引入信号量的最初目的。在上一篇实验的基础上进行修改。通过该

2、实验理解信号量的作用。假设Task_LED和Task_LED2访问同一资源,程序中Task_LED用点亮PA8口的LED表示正在占用该资源,熄灭表示Task_LED当前不占用该资源;同理,Task_LED2用PD2口的LED表示它是否正在占用该资源。程序修改如下:例3-1将app.c中的内容改为如下:其实就是定义了1个标志位,并在每个任务中增加了4条语句。3/3编译下载,LED2闪烁2次后LED1闪烁1次,如此循环,而且两路LED不会同时被点亮(刚开始上电的时候有可能同时被点亮,取决于初始化函数)。该程序模拟了,如何用一个标志位避免两个任务同时访问一个资源产生的冲突。每个任务中的LED_

3、flag=0;和LED_flag=1;两条语句中的代码,表示该任务正在访问公共资源。需要注意的是,while(!LED_flag){OSTimeDly(1);}不能写成while(!LED_flag);。因为while(!LED_flag);会一直占用CPU。OSTimeDly()是μC/OSII提供的延时函数,延时的单位是的一个Tick“心跳”周期。在此加入OSTimeDly(1);作用是让μC/OSII有机会切换到其他任务。本例实验中定义的LED_flag事实上就是一个信号量。LED_flag=1表示资源未被占用,LED_flag=0表示资源正在被占用。但是,在μC/OSII中使用事

4、件控制块来描述一个信号量,这样使用起来会更加方便。例3-2将app.c中的内容改为如下:编译下载,运行程序,结果和例3-1相同,两个例子的程序基本等价。需要注意的是,本例中用到了信号量及相关函数等,所以在os_cfg.h配置文件中必须将OS_SEM_EN置1,如下图:OSSemPend()函数的原型如下:当timeout取值为0时,表示一直等待,直到信号有效。3/3OSSemPost()函数的原型如下:下面再看一个例子,模拟一个实际应用。假设,第一个任务是负责采集数据的,第二个任务是负责刷新数据显示内容的。第一个任务完成所有数据的采集之后,发送一个信号,第二个任务接收到该信号后才进行显示

5、刷新。例3-3本例在例3-2基础上修改,app.c中的内容改为如下:编译下载,运行结果是LED2每闪烁10次之后,LED闪烁一次。程序中对信号量的操作,Task_LED2只发送信号量,Task_LED只接收信号量。深入了解信号量的相关知识,请参考任哲《嵌入式实时操作系统μCOS-II原理及应用》(第2版)第五章5.1、5.3节关于信号量的内容。作者:S.D.Lu深圳2014-5-283/3

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。