单片机实时系统RTX51入门教学研究
2016-09-22梁兆福
梁兆福
摘 要:当学生学习单片机编程达到一定水平后,使用多任务实时系统编程是一种非常有益编程方法。文章以从初识RTX51到由流水灯实验产生学习RTX51兴趣,再到由简单任务入门为顺序开了RTX51教学研究。
关键词:单片机;RTX51;流水灯;教学研究
中图分类号:G712 文献标志码:A 文章编号:1008-3561(2016)23-0082-02
目前在8051系列单片机上使用多任务实时操作系统(RTOS),主要有德国Keil公司开发单片机IDE软件μVision自带的RTX51和陈明计编写的Small RTOS。RTX51有2个版本:RTX51 Tiny和RTX51 Full。RTX51 Tiny自身占用单片机硬件资源非常少,可以运行在没有外部扩展存储器的8051单片机系统上。很少在中职学生中开展RTX51教学的原因是:首先,RTX51教学中文资料和实例很少。其次,要求学习对象具备很好的编程能力。最后,没有使用实时系统编程的习惯。目前编写大型、分工的程序通常是在RTOS上编程的,其原因是单片机资源越来越丰富和价格越来越低。另外,在RTOS基础上编程,优点非常明显。顺应单片机技术的快速发展态势,中职学生有必要接触ROTS,从而掌握一些基本知识和使用技巧。选择一些编程能力比较强的中职学生为教学对象,进行了单片机实时系统RTX51教学研究。
一、 初识多任务实时系统
为了帮助学生能对多任务实时系统形成一些初步认识,可以通过编写下面的程序,再通过调试程序观察变量变化情况,来分析变化原因。
01 #include
02 #include "RTX51TNY.h"
03 long int counter1=0;
04 long int counter2=0;
05 void job_a (void) _task_ 0
06 {
07 os_create_task(1);
08 while(1)
09 {
10 counter1++;
11 }
12 }
13 void job_b (void) _task_ 1
14 {
15 while(1)
16 {
17 counter2++;
18 }
19 }
要运行上面程序,必须将Conf_tny.A51文件(在 Keil\C51\RtxTiny2\SourceCode文件夹里面)加进工程中,接着要在设置工程选项中的Operating条目选择RTX-51 Tiny。最后,在程序中将RT51TNY.h文件包含进来(如图1第2行程序)。
程序讲解:使用演示教学法进行教学。演示1:程序全速执行,提醒学生观察变量counter1和counter2变化。现象是:两个变量都在增加。演示2:单步执行,提醒学生观察变量counter1,counter2变化,同时观察程序如何执行。现象是:程序在第8至11行连续执行一段时间,每执行一次循环体counter1增加1。当执行一段时间后,程序跑到第15至18行程序运行,并且连续运行一段时间,每执行一次循环体counter2增加1。当运行一段时间后,程序在第8至11行连续执行,如此重复。
现象解析:此程序使用了RTX51,在此系统上编写用户程序,用户程序有两个任务job_a和job_b,用关键词_task_定义。每个任务都是一个死循环体,或者执行后使用系统函数os_delete_task删除。在实时系统运行的每个用户任务是轮循或抢占(RTX51是轮循)执行一个时间片的(由数个时间“滴答”构成),所以在单步调试运行过程中,会观察程序在第8至11行连续执行一段时间,然后程序跑到第15至18行程序运行,并且连续运行一段时间。如果用户任务运行时间片比较小的时候,程序全速执行,就会发现两个用户任务程序同时执行,也就是看到counter1、counter2同时增加的现象。
疑问解析:main函数去哪里了?任务时间片大小怎么确定?学生会提出上述两个问题。main函数在RTX51系统使用了,在RTX51中执行main函数后自动跳转到由_task_ 0定义的用户任务中。任务时间片大小由Conf_tny.A51文件中宏INT_CLOCK和TIMESHARING确定,其中INT_CLOC称为系统时钟“滴答”。
通过上述程序演示和讲解,有编程基础的学生基本上能了解多任务实时系统概念和用户程序运行过程。
二、 由流水灯实验产生学习RTX51兴趣
单片机经典入门实验就是流水灯了,犹如许多学习计算机编程语言的第一个程序“Hello world!”。在RTOS上编写流水灯程序和非使用RTOS编写的程序思路非常不同。为了使得学生对RTOS产生学习兴趣,教师准备了图1流水灯电路(该电路省去单片机复位、时钟电路)和下面程序。
01 #include
02 #include "rtx51tny.h"
03 void job_a(void) _task_ 0
04 {
05 unsigned char i,dt;
06 os_create_task(1);
07 while(1){
08 dt=0x1;
09 for(i=0;i<8;i++){
10 P0=~dt;
11 dt=dt << 1;
12 os_wait(K_TMO,100,0);
13 }
14 }
15 }
16 void job_b(void) _task_ 1
17 {
18 unsigned char i,dt;
19 while(1){
20 dt=0x80;
21 for(i=0;i<8;i++){
22 P3=~dt;
23 dt=dt>>1;
24 os_wait(K_TMO,50,0);
25 }
26 }
27 }
为体现在RTOS上所编写流水灯程序与初学单片机编写程序在思路上的不同,在电路上设计P0和P3端口分别控制8只LED。功能要求P0端口控制的LED每隔1秒钟从右边到左边循环流动显示,P3端口控制的LED每隔0.5秒钟从左边到右边循环流动显示。讲解程序时,先向学生介绍使用RTOS编写的用户程序思路,然后讲解具体实现的方式,最后让学生体会使用RTOS和不使用RTOS编写流水灯程序的难易程度和扩展性能。
程序思路:建立两个用户任务job_a和job_b,job_a任务控制P0端口的8只LED,job_b任务控制P3端口的8只LED。由于每个用户任务只需要考虑自身该干的活而不需要考虑其他任务,所以在每个任务中的程序编写就变得非常简单。
程序讲解:在RTX51初始化后切换到任务job_a中运行,内核os_create_task(1)函数调用,准备好任务job_b运行所需要的各种数据结构(如堆栈顶部位置)。执行第7~10行程序,在P0输出0xfe数据使得只有D8亮。第11行程序为下次在P0端口输出正确数据做好准备。第12行程序调用RTX51系统函数os_wait,os_wait函数使用非常频繁,其功能是主动放弃该任务占用CPU时间,然后等待特定时间,时间间隔或者信号到来后重新在os_wait函数的下一行程序继续执行程序。在初识别多任务实时系统时候已经介绍过用户任务运行“任务时间片”后被RTX51切换到其他任务中执行,但是很多时候,用户任务往往不需要执行整个任务时间片,可以主动提前释放占用CPU时间,这样可以提高RTX51的实时性和效率。os_wait(K_TMO,100,0)函数中的参数K_TMO,表示任务job_a放弃CPU后,等待超时时间,这个超时时间是由第二个参数“100”确定,表示是等待100个系统“滴答”时间。当执行系统函数os_wait后RTX51切换到下一个任务job_b,过程几乎和job_a一样。
用与不用RTX51编写程序差异体会:学生在初学单片机时,一定是不使用RTOS编写流水灯程序的。现在通过两者的差异对比,学生会感受到使用RTX51编程的思路、难易和扩展性有所不同。对于扩展性,如在电路中增加按键识别,按键控制不同流水灯花样,使用RTX51只需要增加一个按键识别和处理任务。通过流水灯实验,观察学生的学习态度和状态,可以确认学生对RTX51非常感兴趣,因为RTX51为他们打开编程的第二扇门,门里有许多值得他们惊喜的知识。
三、 由简单任务入门RTX51
学生要学习RTX51,必须有一些经典且简单的任务练习才能入门。在教学中可以发现,学生初学单片机时学习过并且做过的任务,可以在RTX51基础上重新编写程序完成。这样做好处比较多,首先学生已经明白任务要求;其次通过RTX51编写用户程序实现相同功能,能深刻体会使用RTX51的方便和简单;再次用不同的编程思路实现相同功能,反而进一步巩固已经学习的单片机编程知识;最后学生学会取舍是否用RTOS编程。以YL236单片机实验设备作为实验硬件平台,在此平台上实现时钟、温度计、数字电压表(AD转换)、机械手控制等简单的RTX51入门任务。学生在完成任务过程中会遇到很多问题,如在做时钟任务过程中,学生将时钟任务分解为数码管显示、按键识别、按键处理、时间调整这四个用户任务,任务之间需要通信的,如何解决?这可以调用RTX51系统函数发信号,也可以自己定义消息,并实现消息发送和接收功能,还可以用全局变量协调。又如多个用户任务中需要使用共同资源,怎样实现资源保护?学生通过不同的尝试,最终找到解决问题的方法;通过多个简单任务练习后,最终掌握RTX51的使用。
四、 结束语
通过简单的演示程序,学生初识RTX51并了解任务实时系统的相关概念和用户程序运行过程;由在RTX51上实现经典的流水灯实验,学生对RTX51产生兴趣;使用RTX51实现多个简单的任务,学生最终入门RTOS。通过RTX51教学研究,学生是有能力使用RTOS进行程序编写的。虽然以功能很弱的RTX51入门,但是学生熟练掌握RTX51使用方法后,很容易将知识迁移到其他功能比较强大的RTOS,如陈明计编写的Small RTOS(该RTOS内核主要用C语言编写,抢占式切换任务)。
参考文献:
[1]陈明计,周立功.嵌入式实时操作系统small RTOS51原理及应用[M].北京:北京航空航天大学出版社,2004.
[2]李建忠.单片机原理及应用[M].西安:西安电子科技大学出版社,2002
[3]艾云峰,姚郑,覃力.“嵌入式实时操作系统”课程的教学研究[J].电气电子教学学报,2013(01).
[4]沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社,2005.