? 如果希望使用运算单元,应禁止循环任务切换。
6、寄存器组
RTX51 Tiny分配所有的任务到寄存器0,因此,所有的函数必须用C51的默认设置
进行编译,REGISTERBANK(0)。
中断函数可以使用剩余的寄存器组。然而,RTX51 Tiny需要寄存器组区域中的6个永久性的字节,用于这些字节的寄存器组在配置文件中指定。 RTX51 Tiny 2.02 中文手册 part2
第二章 实时程序
实时程序必须对实时发生的事件快速响应。事件很少的程序不用实时操作系统也很容易实现。随着事件的增加,编程的复杂程度和难度也随之增大,这正是RTOS的用武之地。 一、单任务程序
嵌入式程序和标准C程序都是从main函数开始执行的,在嵌入式应用中,main通常是一个无限循环,可以认为是一个持续执行的单个任务,例如:
void main (void)
﹛while(1) /*永远重复*/
﹛
do_something(); /*执行 do_something“任务”*/ ﹜ ﹜
在这个例子里,do_something函数可以认为是一个单任务,由于仅有一个任务在执行,所以没有必要进行多任务处理或使用多任务操作系统。
二、多任务程序
许多C程序通过在一个循环里调用服务函数(或任务)来实现伪多任务调度。如:
void main(void) ﹛
int counter=\
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简单的建立所有其他的任务。
RTX51 Tiny 2.02 中文手册 part3
第三章 原理
RTX51 Tiny 用于管理目标系统的资源,本章讨论RTX51 Tiny如何使用这些资源。 一、定时器滴答中断
RTX51 Tiny 用标准8051的定时器0(模式1)生产一个周期性的中断。该中断就是RTX51 Tiny的定时滴答(Timer Tick)。 库函数中的超时和时间间隔就是基于该定时滴答来测量的。
默认情况下,RTX51每10000个机器周期产生一个滴答中断,因此,对于运行于12MHZ的标准8051来说,滴答的周期是0.01秒,也即频率是100HZ(12MHz/12/10000)。该值可以在CONF_TNY.A51配置文件中修改。
附注:
?可以在RTX51的定时滴答中断里追加自己的代码。参见CONF_TNY.A51 配置
文件。
?关于RTX51 Tiny如何使用中断可以参考概述中中断一节的叙述。
二、任务
RTX51 Tiny本质上是一个任务切换器,建立一个RTX51 Tiny程序,就
是建立一个或多个任务函数的应用程序。下面的信息可以帮助你快速的理解
RTX51 。
?任务用新的关键字由C语言定义,该关键字是Keic C51 所支持的。 ?RTX51 Tiny维护每个任务的正确状态(运行、就绪、等待、删除、超时)。 ?某个时刻只有一个任务处于运行态。
?任务可能处于就绪态、等待态、删除态或超时态。
?空闲任务(Idle_Task)总是处于就绪态,当定义的所有任务处于阻 塞状态时,
运行该任务。
三、任务管理 每个RTX51 Tiny 任务总是处于下述状态中的一种状态中。 状 态 描 述 正在运行的任务处于运行态。某个时刻只能有一个任务处于该状态。 运 行 os_running_task_id 函数返回当前正在运行的任务编号。 准备运行的任务处于就绪态。一旦运行的任务完成了处理,RTX51 Tiny选择一个就绪就 绪 的任务执行。一个任务可以通过用os_set_ready或os_set_ready函数设置就绪标志来使其立即就绪(即便该任务正在等待超时或信号)。 正在等待一个事件的任务处于等待态。一旦事件发生,任务切换到就绪态。Os_wait函数等 待 用于将一个任务置为等待态。 没有被启动或已被删除的任务处于删除态。Os-delete-task函数将一个已经启动(用删 除 os_create_task)的任务置为删除态。 超 时 被超时循环中断的任务处于超时态,在循环任务程序中,该状态相当于就绪态。 四、事件
在实时操作系统中,事件可用于控制任务的执行,一个任务可能等待一个事件,也可能向其他任务发送任务标志。
os_wait函数可以使一个任务等待一个或多个事件。
?超时是一个任务可以等待的公共事件。超时就是一些时钟滴答数, 当一个任务等待超时时,其他任务可以执行。一旦到达指定数量的滴答数,任务就可以继续执行。
?时间间隔(Interval)是一个超时(Timeout)的变种。时间间隔与超 时类似,不同的是时间间隔是相对于任务上次调用os_wait函数的指定数量的时钟滴答数。
?信号是任务间通信的方式。一个任务可以等待其他任务给它发信号 (用os_send_signal和isr_send_signal函数)。
?每个任务都有一个可被其它任务设置的就绪标志(用os_set_ready和
isr_set_ready函数)。一个个等待超时、时间间隔或信号的任务可以通过设置它的就绪标志来启动。
?isr_set_ready函数)。一个等待超时、时间间隔或信号的任务可以通 过设置它的就绪标志来启动。
下表是os_wait函数等待的事件: K_IVL 隔K_SIG K_TMO 等待制定的时间 等待一个信号 等待指定的超时 os-wait返回时,返回值表明发生了的事件: 返 回 值 RDY_EVENT SIG_EVENT TMO_EVENT 意 义 任务的就绪标志被置位 收到一个信号 超时完成或时间间隔到达。 os_wait可以等待下面的事件组合: ?K_SIG︱K_TMO:任务延迟直到有信号发给它或者指定数量的时钟滴答
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库RTX51_Tiny_中文手册(全文下载)(2)在线全文阅读。
相关推荐: