到达。
?K_SIG︱K_IVL:任务延迟直到有信号到来或者指定的时间间隔到达。 附 注:
?K_IVL和K_TMO事件不能组合
五、任务调度程序:
任务调度程序给任务分配处理器,RTX51 Tiny调度程序用下列规则确定 哪个任务要被运行:
当前任务被中断如果:
1、任务调用了os_switch_task且另一个任务正准备运行。 2、任务调用了os_wait且指定的事件没有发生。 3、任务执行了比轮转时间片更长的时间。
另一个任务启动如果:
1、无其它任务运行。
2、要启动的任务处于就绪态或超时态。
六、循环任务切换
RTX51 Tiny可以配置为用循环法进行多任务处理(任务切换)。循环法允许 并行的执行若干任务。任务并非真的同时执行,而是分时间片执行的(CPU时间分 成时间片,RTX51 Tiny给每个任务分配一个时间片)。由于时间片很短(几毫秒), 看起来好象任务在同时执行。
任务在它的时间片内持续执行(除非任务的时间片用完)。然后,RTX51 Tin g切换到下一个就绪的任务运运行。时间片的持续时间可以通过RTX51 Ting配置 定义。
下面是一个RTX51 Tiny程序的例子,用循环法多任务处理,程序中的两个任务 是计数器循环。RTX51 Tiny在启动时执行函数名为job0的任务0,该函数建立了另
一个任务job1,在job0执行完它的时间片后, RTX51 Tiny切换到job1。在job1执 行完它的时间片后,RTX51 Ting又切换到job0,该过程无限重复。
#include int counter0; int counter1;
void job0(void) _task_ 0 ﹛
os_create(1); /*标记任务1为就绪*/ while(1)
﹛ /*无限循环*/
counter0++; /*更新记数器*/ } }
void job1(void) _task_1 ﹛ while(1)
﹛ /*无限循环*/
counter++; /*更新记数器*/
} }
附 注:
?可以用os_wait 或os_switch_task让RTX51 Tiny切换到另一个任务而不是 等待任务的时间片用完。 os_wait函数挂起当前的任务(使之变为等待态)直 到指定的事件发生(接着任务变为就绪态)。在此期间,任意数量的其他任务 可以运行。 七、协作任务切换
如果禁止了循环任务处理,就必须让任务以协作的方式运作,在每个任务 里调用os_wait或os_switch_task,以通知RTX51 Tingy切换到另一个任务。
os_wait与os_switch_task的不同是,os_wait是让任务等待一个事件,而 os_switch_task是立即切换到另一个就绪的任务。 八、空闲任务
没有任务准备运行时,RTX51 Ting执行一个空闲任务。空闲任务就是一个
无限循环。如:
SJMP$
有些8051兼容的芯片提供一种降低功耗的空闲模式,该模式停止程序的执
行,直到有中断产生。在该模式下,所有的外设包括中断系统仍在运行。
RTX51 Tiny允许在空闲任务中启动空闲模式(在没有任务准备执行时)。当
RTX51 Tiny的定时滴答中断(或其它中断)产生时,微控制器恢复程序的执行。 空闲任务执行的代码在CONF_TNY.A51配置文件中允许和配置。 九、栈管理
RTX51 Tiny为每个任务在8051的内部RAM区(IDATA)维护一个栈。任务
运行时,将得到可能得到的最大数量的栈空间。任务切换时,先前的任务栈被 压缩并重置,当前任务的栈被扩展和重置。 下图表明一个三任务应用的内部存储器的布局。 图略…… :-)
?STACK表示栈的起始地址。该例中,位于栈下方的对象包括全局变量、寄存器和位寻址存储器,剩余的存储器用于任务栈。存储器的顶部可在配置中指定。
RTX51 Tiny 2.02 中文手册 part4
第四章RTX51 Tiny配置
RTX51 Tiny可根据应用的不同定制。
一、配置
建立了嵌入式应用后,RTX51 Tiny必须要配置。所有的配置设置都在CONF_TNY.A51文件中,该文件位于\目录下。在CONF_TNY.A51中的配置选项允许:
? 指定滴答中断寄存器组。
? 指定滴答间隔(以8051机器周期为单位)。 ? 指定在滴答中断中执行的代理。 ? 指定循环超时。
? 允许或禁止循环任务切换。 ? 指定应用程序占用长时间的中断。 ? 指定是否使用code banking。 ? 定义RTX51 Tiny的栈项。 ? 指定最小的栈空间需求。
? 指定栈错误发生时要执行的代码。 ? 定义栈错误发生时要执行的代码。 ? 定义空闲任务操作。
CONF_TNY.A51的默认配置包含在RTX51 Tiny库中。但是,为了保证配置的有效和正确,须得将CONF_TNY.A51文件拷贝到工程目录下并将其加入列工程中。
通过改变CONF_TNY.A51中的设置来定制RTX51 Tiny的配置。 附注:
? 如果在工程中没有包含配置文件(CONF_TNY.A51),库中的默认配置
将自动加载,后续的改变将存储在库中,这样可能会对以后的应用起到不良影响。
1、硬件定时器
下面的常数指定RTX51 Tiny的硬件定时器如何配置。
? INT_REGBANK指定用于定时器中断的寄存器组,默认为1(寄存 器组1)。
? INT_CLOCK指定定时器产生中断前的指令周期数。该值用于计算定时器的重
装值(65536_INT_CLOCK)。默认该值为10000。
? HW_TIMER_CODE是一个宏,它指出在RTX51 Tiny定时器中断结尾处要执
行的代码。该宏默认是中断返回,如:
HW_TIMER_CODE MACRO RETI ENDM 2、循环
默认情况下,循环任务切换是使能的。下面的常数允许你配置循环任
务切换的时间或完全禁止循环切换。
? TIMESHARING指定每个任务在循环任务切换前运行的滴答数。设为0时禁止循环
任务切换。默认值为5个滴答数。 3、长中断
一般情况下,中断服务程序设计为快速执行的程序,在某些情况下,中断
服务程序可能执行较长的时间。如果一个高优先级的中断服务程序执行的时间比RTX51 Tiny滴答的时间间隔长,RTX51 Tiny定时器中断可能被中断并可能重入(被后继的RTX51 定时器中断)。
如果要使用执行时间较长的高优先级中断,应该考虑减少ISR中执行的作
业的数量,改变RTX51 定时器的滴答率使其低一些,或者使用下面的配置选项。
? LONG_USR_ISR指示器是否有执行时间长于滴答时间间隔的中断(滴答中断除外)。
当该选项设为1,RTX51 Tiny就会包括保护再入滴答中断的代码。该值默认为0,即认为中断是快速的。 4、Code Banking
以下配置选项允许你指定RTX51 Tiny应用是否使用code banking。
CODE_BANKING指定是否使用code banking。使用code banking时该选项必须设为1,未使用code banking时,该选项须设为0,默认的值为0。 附注
? L51_BANK.A51 2.12及其以上的需要RTX51 Tiny程序使用code banking。 5、栈
一些选项用于栈配置。下面的常数定义用于栈区域的内部RAM的大小和 栈的最小自由空间。一个宏允许指定当没有足够的自由栈时执行的代码。
? RAM TOP指定片上栈顶部的地址。除所有位于栈之上的IDATA变量,否则不应修
改该值。该值默认为OXFF。
? FREE_STACK指定栈允许的最小字节数。切换任务时,如果RTX51 Tiny检测到低
于该值时,STACK_ERROR宏将被执行。设为0禁止栈检查,默认设置是20字节。 ? STACK_ERROR是一个指定发生栈错误(少于FREE_STACK字节数)时要执行的
指令的宏。该宏默认是禁止中断并进入无限循环: STACK_ERROR MACRO CLR EA SJMP$ ENDM 6、空闲任务
当没有任务准备运行时,RTX51 Tiny执行一个空闲任务。空闲任务只是