ucos在51单片机上的移植,版本为2.51,为一个简单的门禁控制器,只有其框架,4个任务,时间显示,密码验证,任务调度,菜单。主体框架运行良好
是在以前发过的一个状态机改过来的,因发现全部都要改,而目前更想学ucos,故只写了主体框架,即待机界面和菜单。刚学两天,只用了任务管理,想到信号量发现用不上:(。
RAM需求较大,用的是STC89C54RD+,1K的RAM,目前跑4个任务没问题。
电路10简单,就不上传了,也因核心是ucos而不是电路,NOKIA 5110LCD,DS1302,4*4 Keyboard,因时间问题,也未加注释,但编程风格良好。
点击此处下载
ourdev_556873.rar(文件大小:264K) (原文件名:uCOS_C51 V3.0.rar)
但是有几个疑问,请各位也注意一下:
1、reentrant函数的使用。
楼主的有些函数,需要定义为reentrant,比如DisplayString,这个函数被不同的task调用,Task_ReadKey和Task_KeyFunc,如果在执行的时候,可能会被打断,导致不可重入。
同样的,delay函数要小心用,不要导致重入问题。
重入函数在编译的时候,编译器会把参数、局部变量放到模拟栈中,如果没有定义成reentrant,会按照默认的分配规则,可能会导致内存覆盖的问题。因为多task,编译器对函数调用树可能没有正确建立。
2、OS_ENTER_CRITICAL的使用。
在Task_ShowTime的for(;;)调用不妥,因为这个会关系统中断,知道调用OS_EXIT_CRITICAL,才有可能执行其他的。这两条语句中的过程很多,可能会开中断。
OS_ENTER_CRITICAL,最好只用在非得关中断的地方。一般是驱动操作,对时序有要求的。
3、栈大小的设置。
MaxStkSize,是如何确定的呢?这几个都用到了同样的大小,能否解释一下?谢谢
一周热门 更多>