在ucos中如何多ucos 串口信号量编程

OSSemPost 和OSSemPend是成对出现的,在程序OSSemPost 尚未运行到的时候,在等待Sem的 OSSemPend是会把当前的任务挂起,直到另外一个任务的OSSemPost 运行完毕都得到Sem。但是可以通过改变OSSemCreate(x)里面的值x改变这种局面,当x不为0时

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。

这两天,在学习如何在ucos系统组织程序。由于对ucos的了解较为笼统,所以先以LED控制来练习使用。

练习1:使用按键中断发出信号量来控制LED

练习2:使用定时器控制LED

LED连接:GPB5678四个引脚控制四个LED1234,输出低电平点亮LED

在本练习中,只是为了示意性的了解中断如何使用信号量来控制程序的运行,所以,仅使用K3K4两个按键来控制LED3LED4

首先,要使能信号量。即

以上为设置GPF02引脚为中断方式,边沿触发,打开中断屏蔽;

在主程序中,先初始化ucos后,即可初始化中断以及创建信号量,创建信号量必须在初始化ucos之后进行。

然后在创建的任务中使用信号量

使用ucos中的延时函数会调用任务切换,也就是说在延时完设置的时间后任务管理器会根据最高优先级任务进行切换,可能延时之后不运行本任务,只是将本任务放入就绪状态。所以,如果是有具体时间要求的位置,感觉不适合使用OSTimeDly,可以使用定时器或者自编写的延时函数。

练习一的主要部分就是这样的。在刚开始写的时候,遇到了些不顺利,例如由于粗心大意而导致的对LED引脚的设置错误等,同时,由于我板子的按键粘连的问题,不能在按下后快速返回,导致过中断函数被重复触发,而使程序不能正常运行的问题,于是在中断中加入了一段时间的延时后才去清除中断标志位,这样就正常了。

刚开始写完的时候,进行测试,在软件环境下编译没有问题,然后下载到板子的内存中执行,竟然不能运行,各个任务都不执行。就先将中断部分以及涉及到信号量的部分去掉,再次运行,程序正常。反复检查被去掉的部分,没有找到明显的问题,开始一条指令一条指令的去掉注释,检查问题,发现和程序的位置有关,将相关的程序行进行了位置调整,运行正常。最主要的是建立信号量等,必须要在初始化ucos之后。

练习二:使用ucos的软件定时器控制LED

在练习一上说了,因为使用ucos里面的延时会发生程序调度,如果不想程序被调度,必须使用定时器或者自己编写的函数来处理延时问题。定时器本身可以很准确的进行定时,但是感觉不适合使用的太多,而大一些的程序往往有很多需要不同时间延时的地方,如果全部使用定时器,可能会因为建立定时器相关结构而造成太多不必要的内存浪费,本练习只是为了了解一下定时器的使用。

OS_Tmr.c的第一部分,有说明

1如使用定时器,必须定义如下宏

定时器任务堆栈大小,当时能了OS_TMR_EN之后,在ucos初始化函数中会调用定时器初始化函数,该函数建立一个定时器管理任务,这个任务使用的栈是由此宏定义的。默认为128

2必须调用OSTmrSignal()函数。将该函数放到OSTimeTickHook()中,后者是在OS_CPU_C.C中定义的一个用户钩子函数,默认情况下为空函数,只需要添加OSTmrSignal()这个调用即可。这是我最初没有注意到的地方,因为这个原因,我的定时器一直没有被激发。

定时器的简单实用并不复杂,开始程序部分就写出来了,但是在RAM中调试,怎么也调用不了后面写的两个定时器任务函数,在网上查找原因,有的说没有打开操作系统时钟,也有说其它的,能够找到的资料也不是很多,就这样耗费了一些时间。很无奈,决定查看一下定时器的创建、运行是否成功,就写代码在串口上显示定时器建立时的返回值,发现返回值不是空值,也就是说定时器创建成功了,接着查看定时器状态,返回值是3,也就是RUNING状态,运行态,正常,然后在串口显示定时器的剩余时间值,发现该值一直就没有改变,也就是剩余时间就是开始设置的时间,为什么没有减少呢?是不是在ucos系统时钟里面没有去减去这个运行了的时间呢?它该怎么减去这个时间呢?终于找到一个博客上面写的,需要在时钟中断的时候去发出一个信号给定时器管理任务才能更新时间,而这个信号可以在TimeTick中调用OSTimeTickHook()函数来发出给定时器管理任务。按此修改,程序正常。

以上是为了熟悉ucos而在2440开发板上做的简单的实验,虽然很简单,却通过此了解了ucos中通过信号量来进行任务之间通信与同步的过程,以及ucos中定时器的使用,ucos延时函数的作用以及哪些地方可能不适合使用这类函数等。学习ucos也已经快一个半月了,算是有个小小的前进吧。

加载中,请稍候......

我要回帖

更多关于 ucos 串口信号量 的文章

 

随机推荐