使用操作系统编写应用程序

如何使用操作系统编写应用程序
胡水涛
2009-7-5
湖北黄石 158238644@qq
前言
在应用程序设计中,合理的使用操作系统可以使程序编写难度大大降低。但操作系统本身需要占用一定的内存和CPU处理时间,所以操作系统一般用在功能强劲的CPU如80x86、ARM中,在8051单片机中应用较少。
如何在8051单片机中使用操作系统?近年来,不少网友公布了其操作系统代码,其中比较著名的有杨屹移植的ucos/ii和陈明计的small rtos51(已经有出版书籍)。在keil集成开发环境中,也包含了一个名为RTX-51的操作系统,有两个版本,其中tiny版本可以在没有外部存储器的情况下运行,使用较上面两种系统要简单,适合入门学习。当我们有一定的操作系统程序编写经验后,转到学习其它操作系统就会容易很多。
第一步运行一个例子
在keil安装目录C:\Keil\C51文件夹下面包含了RtxTiny2文件夹,这里面有RTX-51操作系统tiny版本的源代码和演示程序。编译Ex1工程,点击Debug,并点击菜单栏peripherals 中的RTX-Tiny Task list,运行,结果如图1所示。
图1 Ex1工程截图
在Tasklist中。我们可以看见job0~job3交替运行。大致阅读代码,我们会发现,程序中包含三个死循环,如果你没有任何操作系统(嵌入式操作系统)的使用经验,会觉得这段代码难以理解。没关系,请继续看下去。
第二步解释一个例子
仔细分析上述代码,我们会发现下面几个问题:
(1)程序没有main函数
(2)程序中包含了一个新的关键字_task_,并且函数写法与普通函数写法有些不同;(3)os_create_task ()函数是一个陌生的非标准库函数。
细心的读者可能还会想到,既然三个函数都是死循环,那么只要一个函数被执行了,其它两个不就永远得不到执行?
理解这几个问题,读者要了解程序设计中的多任务的概念。它是指用户在同一时间内运行多个应用程序,每个应用程序被称作一个任务(不是严格的学术定义)。例如,在Windows 下,我们可以同时运行打字、画图和聊天等多个程序,而每个程序在使用者看来,它是并行运行的。
在Ex1例子当中,有三个死循环子程序,也就是说,有三个死循环的任务,由于操作系统的作用,它们可以“并行”执行。“并行”执行?当然不能!三个任务其实是分时运行的,CPU在操作系统的协调下,轮流运行这三个任务,当任务切换的频率较高时,在宏观上,三个任务就是并行运行的。
这里所介绍的是最简单的一种任务调度方法,即每个任务运行相同的时间,然后再运行其它任务,这在操作系统的术语中称为“时间片轮转调度”法,RTX-51操作系统支持这种调度方法。每个任务运行的时间长短称为时间片的长短。
以Ex1工程为例,假设每个任务的时间片相同,时间片长度为20ms,那么操作系统任务切换的频率为50次/s.上述例子包含3个任务,那么每个任务执行的实际时间为333ms/s.任务在时间上执行序列如图2所示。
图2 任务执行序列
我们再来看上面提出的几个问题。在C语言程序设计中,一般以main函数作为程序的入口,换作其它
函数在理论上也是可行的,这只是一个约定。例如,使用RTX51编写程序,程序实际是从任务0开始运行。关键字_task_就是用来定义任务ID号的。例如,下面的代码表明job1()任务的ID号为1。
job1 () _task_ 1{
while (1) { /* endless loop */提银机>汽车镀铬
counter1++; /* increment counter 1 */
}
}
使用RTX51编写程序的步骤是:
(1)建立任务
(2)编写任务函数
全自动粉皮机(3)配置操作系统
操作系统默认只建立任务0,操作系统要运行其它任务,必须先使用os_create_task ()函数来建立任务。例如,Ex1工程就是这样完成任务建立的:
job0 () _task_ 0 {
os_create_task (1); /* start task 1 */
os_create_task (2); /* start task 2 */
while (1) { /* endless loop */
counter0++; /* increment counter 0 */
}
}
操作系统从任务0开始运行,在任务0中建立两个任务,任务1和任务2。此后,任务0、任务1和任务2就在操作系统的协调下轮流运行。关于操作系统的配置,在后面将会讲到。
第三步如何编写应用程序
在51单片机的P1口上接上8个LED,LED0~LED7分别对应P1.0~P1.7。现在需要P1.0上面的灯闪烁频率为1Hz,P1.7上面的灯闪烁频率为2Hz(只要求大致精确即可)。想想,你用什么方法来实现?如果是三个灯,你是不是又要重新设计?你可以编写试试!
然而使用RTX51后,一切变得简单起来。由于ms或者s相对CPU的us甚至ns级的指令执行时间来说,是一个漫长的过程,采用任务方式编写程序,每个任务之间都像是独立的,并行的运行。如下面的代码所示:
job0 () _task_ 0 {番荔枝种植
os_create_task (1); /* start task 1 */
while (1) { /* endless loop */
led0 = !led0; // 改变led0的状态
delay_500ms(); // 延时500ms
}
}
job1 () _task_ 1{
while (1) { /* endless loop */
led1 = !led1; // 改变led1的状态
delay_500ms(); // 延时500ms
delay_500ms();
}
}
大家可以在Ex1工程中进行修改,并且自己编写延时函数来完成上述的代码,然后下载到目标板进行测试。
思考:上述代码有什么不妥的地方?假设delay_500ms()函数是精确的延时500ms,在两个任务运行后,最终结果会是怎样?(大家可以用示波器精确的测量出实际运行时间)。
上面的例子是运用了操作系统的时间片调度功能,任务0的时间片结束后,操作系统将剥夺任务0的CP
U使用权,开始运行任务1,当任务1的时间片结束后,再运行任务0,如
此反复。从上面例子的代码可以知道,每个任务真正影响输出结果的代码只有一行,执行这行代码所要的时间仅仅只需要一个机器周期(CPL P1.0),假设时间片为50ms,下一个任务得到运行的最快时间也是在50ms以后,绝大多数时间被白白耗费在了delay_500ms()函数的执行上(事实上,即使是51单片机,CPU在大多数时候也是空转,真正任务所需要的时间很短)。如果系统有更多的任务,那么这种浪费将使其它任务运行缓慢。RXT51提供一组时间管理函数,它可以让任务主动放弃CPU的使用权。将上述代码中的delay_500ms()换成os_wait (K_TMO, 50, 0)即可。当任务函数调用os_wait()后,任务将主动放弃CPU使用权,而不是像上面那样是等到时间片结束后,操作系统剥夺了任务的CPU使用权。待等待的时间结束后,该任务可以继续运行。其中函数的第二个参数就是控制等待的时间的长短。等待时间的节拍长短是可以通过操作系统的配置文件来进行设定。
在上面工程的目录下面可以看到Conf_tny.A51文件,这个文件是用来配置操作系统的各项参数。如果大家需要自己建立工程,那么必须将此文件copy到新工程的目录下,并且在option选项中按图3进行设置。
图3 keil工程设置
Conf_tny.A51包含多个设置项,其中我们只需要设置其中几项即可。
表1 Conf_tny.A51设置项
INT_CLOCK 定时节拍的长短,单位是机器周期
TIMESHARING 时间片的长短,单位为定时节拍。若设为0,则关闭时间片调度RAMTOP 内部RAM顶端。51设为0FFH,52设为1FFH
体内振动出去吃饭默认设置为INT_CLOCK = 10000,TIMESHARING = 5,RAMTOP = 0FFH。假设系统晶振为12M,那么定时节拍为10000×1us=10ms,时间片为10ms×5=50ms。
第三步应用技巧
技巧是建立在熟练的基础之上的。RTX51的tiny版本提供给用户使用的API函数不多,但是如果能充分利用,一样可以写出很好的代码。Tiny版本一共提供12个API函数,关于这些函数的功能,在keil的help文件中(如图4所示)有比较详细的描述,不过要理解这些,需要了解一些操作系统的基本术语。我也会尽快整理出一些可以仿真或者在mini51板上实物运行的例子,通过实际运行、模仿这些例子的编写思路,相信大家可以很快掌握这些函数的使用方法。
双接头结语
我想这篇文章的主要读者也是师院电工中心的同学,如果大家有什么疑问,可以一起讨论。希望大家能够尽快掌握嵌入式操作系统的应用程序编写方法,提高自己的编程能力,为我院电子竞赛作出一点努力!
图4 keil帮助手册

本文发布于:2024-09-22 07:08:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/154787.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   时间   运行   函数   代码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议