第二章 实时程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
实时程序必须对实时发生的事件快速响应。事件很少的程序不用实时操作系统也很容易实现。随着事件的增加,编程的复杂程度和难度也随之增大,这正是RTOS的用武之地。
一、单任务程序
嵌入式程序和标准C程序都是从main函数开始执行的,在嵌入式应用中,main通常是一个无限循环,可以认为是一个持续执行的单个任务,例如:
void main (void)
﹛while(1) /*永远重复*/
﹛
do_something(); /*执行 do_something“任务”*/
﹜
﹜
在这个例子里,do_something函数可以认为是一个单任务,由于仅有一个任务在执行,所以没有必要进行多任务处理或使用多任务操作系统。
二、多任务程序
许多C程序通过在一个循环里调用服务函数(或任务)来实现伪多任务调度。如:
void main(void)
﹛
int counter="0";
while(1) /*一直重复执行*/
﹛
check_serial_io(); /*检查串行输入*/
process_serial_cmds() ; /*处理串行输入*/
check_kbd_io(); /*检查键盘输入*/
process_kbd_cmds(); /*处理键盘输入*/
adjust|ctrlr_parms(); /*调整控制器*/
counter++; /*增加计数器*/
﹜
﹜
该例中,每个函数执行一个单独的操作或任务,函数(或任务)按次序依次执行。
当任务越来越多,调度问题就被自然而然的提出来了。例如,如果process_kbd_cmds函数执行时间较长,主循环就可能需要较长的时间才能返回来执行check_sericd_io函数,导致串行数据可能被丢失。当然,可以在主循环中更
频繁的调用check_serial_io函数以纠正这个问题,但最终这个方法还是会失效
三、RTX51 Tiny 程序
当使用Rtx51Tiny时,为每个任务建立独立的任务函数,例如:
void check_serial_io_task(void) _task_ 1
﹛/*该任务检测串行I/0*/﹜
void process_serial_cmds_task(void) _task_ 2
﹛/*该任务处理串行命令*/﹜
void check_kbd_io_task(void) _task_ 3
﹛/*该任务检测键盘I/O*/﹜
void process_kbd_cmds_task(void) _task_ 4
﹛/*处理键盘命令*/﹜
void startup-_task(void) _task_ 0
﹛
os_create_task(1); /*建立串行I/O任务*/
os_create_task(2); /*建立串行命令任务*/
os_create_task(3); /*建立键盘I/O任务*/
os_create_task(4); /*建立键盘命令任务*/
os_delete_task(0); /*删除启动任务*/
﹜
该例中,每个函数定义为一个RTX51 Tiny任务。RTX51 Tiny程序不需要main函数,取而代之,RTX51 Tiny从任务0开始执行。在典型的应用中,任务0简单的建立所有其他的任务。
文章评论(0条评论)
登录后参与讨论