|
這兩天在考慮多路繼電器同時工作的情況,開始接觸了51系統(tǒng)中的RTOS。目前看到較多的是Keil 提供的 RTX51 Tiny(免費(fèi)版),另外的有周立功公司的 Small RTOS51,對于更大的系統(tǒng),就只有考慮uCOS了。從STC15F204EA的硬件配置來看,目前只適合使用RTX51 Tiny了。
在學(xué)習(xí)過程中,有下面的疑問需要逐一驗證:
在標(biāo)準(zhǔn)的時間片輪換模式下,疑問:
1. os_create_task(nTask_Id) 可以在任何時間調(diào)用?
2. os_create_task() 和 os_set_ready() 的區(qū)別?如何只創(chuàng)建一個任務(wù)而不啟動?當(dāng)一個任務(wù)處于ready時,在下一個時間片就會啟動工作?
3. 可以通過 os_set_ready(nTask_Id) 和 os_send_signal(nTask_id) 啟動一個任務(wù)?
4. os_delete_task(nTask_id)的任務(wù)是否可以再次激活?
5. 任務(wù)數(shù)量的多少是否會影響到程序的執(zhí)行速度?如果系統(tǒng)中一開始有12個任務(wù)在運(yùn)行,后面刪除到只剩下4個,這時候
任務(wù)的運(yùn)行速度是否提高了4倍?
6. 在問題5的情況下,如何保證基本驅(qū)動程序能夠按照穩(wěn)定的時間間隔運(yùn)行?
A: 在系統(tǒng)初始化完成后,不要增加,刪除或掛起任務(wù),這樣就可以保證時間片輪換的頻率穩(wěn)定。(這個做法是否正確???)
7. 如何測試系統(tǒng)當(dāng)前的負(fù)載量和運(yùn)行速度?
8. 在系統(tǒng)中還有其他需要用到定時的中斷時,如何平衡時間的分配?如系統(tǒng)中有串行口通訊,或者更高精度的定時器(定時精度高于SysTick)?
9. 對于在單個任務(wù)中使用多重循環(huán)進(jìn)行延時,如何保證延時時間的準(zhǔn)確性?(函數(shù)的重入問題)假設(shè)系統(tǒng)中的每個時間片為50ms,同時有10個任務(wù)
在運(yùn)行,如何保證其中的任務(wù)1能夠連續(xù)不斷的輸出頻率為1KHz的方波(端口的翻轉(zhuǎn)頻率為2KHz)?同時任務(wù)2連續(xù)輸出頻率200Hz的方波?按照正常
理解,系統(tǒng)中有10個并行任務(wù),則每個任務(wù)的工作周期是 SysTickPeriod * nTaskCount = 50ms*10 = 500ms,其中任務(wù)1只有其中的50ms內(nèi)能夠
對某個GPIO進(jìn)行控制,使其做2KHz的翻轉(zhuǎn)(使用循環(huán)延時即可)。但是在其它任務(wù)激活的時候,該如何進(jìn)行?
10.對于來自外部的中斷,如觸發(fā)信號輸入(串口中斷發(fā)生),此時處理串口工作的任務(wù)處于休眠期,是否可以通過串口中斷立即激活該任務(wù)?
例如使用 os_switch_task()。但是如何能夠避開其它任務(wù),而直接執(zhí)行串口工作處理的任務(wù)呢? 是否需要啟動優(yōu)先級的任務(wù)?
另外,通過實(shí)際測試,對SysTick的配置做了確認(rèn)。 這個可以在 conf_tny.A51中做配置。說明如下:
1. INT_CLOCK EQU 24000 ; 系統(tǒng)時鐘設(shè)置為 24.000MHz時,每個 SysTick 周期是1ms。
2. TIMESHARING EQU 1 ; 每個任務(wù)的時間片的長度,用SysTick的個數(shù)表示。
在以上配置下,每個任務(wù)的時間片長度為:FOSC/INT_CLOCK*TIMESHARING = 24.000M/24000*1 = 1ms。
另外,為了發(fā)揮 STC15系列1T單片機(jī)的優(yōu)勢,在HW_TIMER的初始化階段,設(shè)置輔助寄存器 AUXR,使Timer0工作于1T定時器模式。否則默認(rèn)的工作在 12T傳統(tǒng)的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系列單片機(jī)添加,用于1T模式計時器設(shè)置。
ORL AUXR, #80H ;對于 STC15 系列產(chǎn)品,使用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的配置完成,就等待系統(tǒng)啟動任務(wù)循環(huán)了。
總之,希望在了解了以上問題以后,就能夠自如的使用這個mini的RTOS了。
|
|