RTX51 Tiny可以被每个应用初始化。
RTX51 Tiny必须被创建的每一个应用初始化。所有配置设置可以在CONF_TNY.A51文件中找到,文件位于\KEIL\C51\RTXTINY2\文件夹。CONF_TNY.A51的配置选项允许以下操作:
- 指定定时器滴答中断(Timer Tick Interrupt)寄存器区。
- 指定定时器滴答间隔(Timer Tick Interval)(基于8051机器周期)。
- 指定定时器滴答中断(Timer Tick Interrupt)中执行的用户代码。
- 指定Round-Robin超时。
- 使能或禁用Round-Robin任务切换。
- 指定应用中包含的长时间中断。
- 指定是否使用代码块。
- 定义RTX51 Tiny堆栈的顶部。
- 指定需求的最小堆栈空间。
- 指定堆栈错误事件要执行的代码。
- 定义Idle任务的操作。
CONF_TNY.A51的默认配置被包含在RTX51 Tiny库中。但是,为了保证配置能用于应用,必须将CONF_TNY.A51文件复制到项目文件中,并添加到项目中。
自定义RTX51 Tiny配置,必须更改CONF_TNY.A51指定的设置。
注意:
- 如果不在工程中包含配置文件(CONF_TNY.A51),库中的默认配置文件会被自动包含。对存储在库中的配置文件的后续更改可能会对应用程序的操作产生不利影响。
以下EQUates指定如何配置RTX51 Tiny硬件定时器。
- INT_REGBANK 指定RTX51 Tiny定时器中断使用的寄存器bank。默认设置为1(寄存器bank 1).
- INT_CLOCK 指定定时器产生中断前的需要进过的时钟周期数。取值范围位1000-65535。数值越小中断越快。这个数值用于计算定时器的重载值(65535- INT_CLOCK)。默认设置为10000。
- HW_TIMER_CODE 是一个宏,指定RTX51 Tiny定时器滴答中断末尾执行的代码。这个宏的默认设置是从中断(REFI)返回,例如:
HW_TIMER_CODE MACRO ; Empty Macro by default
RETI
ENDM
Round-Robin(循环)
默认情况,Round-Robin任务切换是使能的。以下EQUate允许配置Round-Robin任务切换时间或彻底禁用Round-Robin。
- TIMESHARING 指定Round-Robin任务切换前每个任务执行RTX51 Tiny定时器时钟数量。写0禁用Round-Robin任务切换。默认设置为5个定时器时钟。
通常,中断服务程序(ISRs)被设计的快速执行。在一些情况下,ISRs可能执行很长时间。如果高优先级的ISR执行时间比RTX51定时器滴答间隔(timer tick interval)长,RTX51定时器中断可以被中断(被用户中断)也可以被重入(后面的RTX51定时器中断)。
如果使用高优先级中断执行很长周期,应该考虑减少ISR执行周期的数量,更改RTX51定时器滴答速率使其减慢,或使用以下配置选项。
- LONG_USR_INTR 指定应用是否有中断(除了RTX51 Tiny定时器滴答中断)执行的时间比定时器滴答间隔(timer tick interval)长。当这个配置选项设置为1,RTX51 Tiny包含保护RTX51 Tiny定时器滴答时钟可重入的代码。默认设置为0,用于fast中断。
Code banking(代码空间)
以下配置选项允许指定RTX51 Tiny用于是否使用code banking。
- CODE_BANKING 指定用于是否使用code banking。如果code banking被使用,这个选项必须设置为1。如果不使用code banking,这个选项要设置为0。默认设置为0,不使用code banking。
注意:
- 使用code banking 的RTX51 Tiny程序需要L51_BANK.A51的2.12版本或更高的版本。
有几个选项对堆栈配置有效。以下EQUates定义用于堆栈空间的内部RAM的大小,以及堆栈的最小自由空间。一个宏允许指定在CPU堆栈没有足够自由堆栈的时候执行的代码。
- RAMTOP 指定片上堆栈的顶部地址。除非在堆栈上有IDATA变量,否则不应该更改它。默认设置为0xFF。
- FREE_STACK 指定堆栈的最小有效字节数。当切换任务时,如果RTX51 Tiny检测到实际值小于指定值,STACK_ERROR宏将会执行。0值禁止堆栈检查。默认值设置为20 bytes。
- STACK_ERROR 是一个宏,指定在堆栈错误事件(少于FREE_STACK字节有效值)发生时需要执行的指令。默认的宏禁用中断并进入一个死循环。例如:
STACK_ERROR MACRO
CLR EA ; disable interrupts
SJMP $ ; endless loop if stack space is exhausted
ENDM
Idle任务
当没有ready状态的任务时,RTX51 Tiny执行一个Idle任务。Idle任务是一个不做任何事情的简单循环——仅仅是等待RTX51 Tiny定时器滴答中断切换到一个ready状态的任务。以下EQUates允许配置RTX51 Tiny Idle任务的不同方面。
- CPU_IDLE 是一个宏,指定Idle任务执行的代码。默认的指令设置PCON寄存器的Idle Mode位(对多数8051设备有效)。通过停止程序执行可以降低功耗,直到中断发生。例如:
CPU_IDLE MACRO
ORL PCON,#1 ; set 8051 CPU to IDLE
ENDM
- CPU_IDLE_CODE 指定Idle任务是否执行CPU_IDLE宏。默认设置为0,因此CPU_IDLE宏不会包含在Idle任务中。
RTX51 Tiny包含两个库文件:
- RTX51TNY.LIB用于non-banking RTX51 Tiny程序。
- RTX51BT.LIB用于code-banking RTX51 Tiny程序。
RTXTINY2.PRJ工程可以在\KEIL\C51\RTXTINY2\SOURCECODE\文件夹下找到,用于创建这两个库。
注意:
- 不用在应用中明确的包含RTX51 Tiny库。在使用µVision IDE或使用command-line linker时会自动完成。
- 当创建RTX51 Tiny库时,默认配置文件(CONF_TNY.A51))会包含在库中。如果在工程中不明确包含配置文件(CONF_TNY.A51),默认的会在库中包含。随后对存储在哭中的配置文件的更改会对应用造成不利的影响。
可以做一些事情来优化RTX51 Tiny程序。
- 如果可能,请禁用Round-Robin任务切换。Round-Robin需要13字节堆栈空间存储任务状态和所有寄存器。如果通过调用一个RTX51 Tiny库程序(如os_wait或os_switch_task)触发任务切换则不需要这些空间。
- 使用os_wait程序替代Round-Robin来切换任务。这可以改进系统反应时间和任务响应时间。
- 避免设置定时器滴答中断速度太快。将计时器的超时设置为一个小的数值可以增加每秒的滴答数,但减少了任务的可用时间(因为定时器滴答中断使用100-200周期执行)。设置超时值设置的足够高来最小化定时器滴答中断操作的影响。
- 为了减少RTX51 Tiny对存储器的需求,将任务按顺序从0开始。