这两天在考虑多路继电器同时工作的情况,开始接触了51系统中的RTOS。目前看到较多的是Keil 提供的 RTX51 Tiny(免费版),另外的有周立功公司的 Small RTOS51,对于更大的系统,就只有考虑uCOS了。从STC15F204EA的硬件配置来看,目前只适合使用RTX51 Tiny了。
在学习过程中,有下面的疑问需要逐一验证:
在标准的时间片轮换模式下,疑问:
1. os_create_task(nTask_Id) 可以在任何时间调用?
2. os_create_task() 和 os_set_ready() 的区别?如何只创建一个任务而不启动?当一个任务处于ready时,在下一个时间片就会启动工作?
3. 可以通过 os_set_ready(nTask_Id) 和 os_send_signal(nTask_id) 启动一个任务?
4. os_delete_task(nTask_id)的任务是否可以再次激活?
5. 任务数量的多少是否会影响到程序的执行速度?如果系统中一开始有12个任务在运行,后面删除到只剩下4个,这时候
任务的运行速度是否提高了4倍?
6. 在问题5的情况下,如何保证基本驱动程序能够按照稳定的时间间隔运行?
A: 在系统初始化完成后,不要增加,删除或挂起任务,这样就可以保证时间片轮换的频率稳定。(这个做法是否正确???)
7. 如何测试系统当前的负载量和运行速度?
8. 在系统中还有其他需要用到定时的中断时,如何平衡时间的分配?如系统中有串行口通讯,或者更高精度的定时器(定时精度高于SysTick)?
9. 对于在单个任务中使用多重循环进行延时,如何保证延时时间的准确性?(函数的重入问题)假设系统中的每个时间片为50ms,同时有10个任务
在运行,如何保证其中的任务1能够连续不断的输出频率为1KHz的方波(端口的翻转频率为2KHz)?同时任务2连续输出频率200Hz的方波?按照正常
理解,系统中有10个并行任务,则每个任务的工作周期是 SysTickPeriod * nTaskCount = 50ms*10 = 500ms,其中任务1只有其中的50ms内能够
对某个GPIO进行控制,使其做2KHz的翻转(使用循环延时即可)。但是在其它任务激活的时候,该如何进行?
10.对于来自外部的中断,如触发信号输入(串口中断发生),此时处理串口工作的任务处于休眠期,是否可以通过串口中断立即激活该任务?
例如使用 os_switch_task()。但是如何能够避开其它任务,而直接执行串口工作处理的任务呢? 是否需要启动优先级的任务?
另外,通过实际测试,对SysTick的配置做了确认。 这个可以在 conf_tny.A51中做配置。说明如下:
1. INT_CLOCK EQU 24000 ; 系统时钟设置为 24.000MHz时,每个 SysTick 周期是1ms。
2. TIMESHARING EQU 1 ; 每个任务的时间片的长度,用SysTick的个数表示。
在以上配置下,每个任务的时间片长度为:FOSC/INT_CLOCK*TIMESHARING = 24.000M/24000*1 = 1ms。
另外,为了发挥 STC15系列1T单片机的优势,在HW_TIMER的初始化阶段,设置辅助寄存器 AUXR,使Timer0工作于1T定时器模式。否则默认的工作在 12T传统的8051定时器模式。
具体修改的程序段如下:
HW_TIMER: HW_TIMER_CODE
TIMERINT:
IF (LONG_USR_INTR)
PUSH ACC
MOV A,PSW
ANL A,#018H
XRL A,#?RTX_REGISTERBANK
JNZ CONT_TIMINT
; avoid recursive timer interrupt
POP ACC
RETI ; Return from Recursive Timer Interrupt
CONT_TIMINT: POP ACC
ENDIF
CALL HW_TIMER ; Enable Interrupts again.
MOV ?RTX_SAVEPSW,PSW
MOV PSW,#?RTX_REGISTERBANK
MOV saveacc,ACC ; ACC required by some Cygnal devices
; Update 8051 Interrupt Timer
CLR TR0
;****************************************************************
; 下面一行语句专门为 STC15系列单片机添加,用于1T模式计时器设置。
ORL AUXR, #80H ;对于 STC15 系列产品,使用1T时钟模式,新增加的语句。
;****************************************************************
MOV A,TL0
ADD A,#LOW (?RTX_CLOCK + 7)
MOV TL0,A
MOV A,TH0
ADDC A,#HIGH (?RTX_CLOCK + 7)
MOV TH0,A
SETB TR0
至此, Timer0的配置完成,就等待系统启动任务循环了。
总之,希望在了解了以上问题以后,就能够自如的使用这个mini的RTOS了。
|