RTX51 Tiny中容易混淆的问题
| RTX51 Tiny是 Keil uVision中自帶的一個小型嵌入式RTOS,具有小巧、速度快、系統(tǒng)開銷小、使用方便等優(yōu)點。使用RTX51 Tiny能夠提高系統(tǒng)的穩(wěn)定性,優(yōu)化程序的性能;而且它是為51單片機專門定制的,所以在51單片機上的運行效率比其它一些通用的RTOS性能也要好一些。 但是,由于RTX51 Tiny的相關(guān)資料和書籍比較少,大部分只是對程序自帶幫助文件的簡單翻譯,很少進(jìn)行深入探討。下面就RTX51 Tiny使用中經(jīng)常遇到的一些問題進(jìn)行探討。 1 ?關(guān)于時間片的問題 RTX51 Tiny使用的是無優(yōu)先級時間片輪詢法,每個任務(wù)使用相同大小的時間片,但是時間片是怎樣確定的呢? RTX51 Tiny的配置參數(shù)(Conf_tny.a51文件中)中有INT_CLOCK和TIMESHARING兩個參數(shù)。這兩個參數(shù)決定了每個任務(wù)使用時間片的大小:INT_CLOCK是時鐘中斷使用的周期數(shù),也就是基本時間片;TIMESHARING是每個任務(wù)一次使用的時間片數(shù)目。兩者決定了一個任務(wù)一次使用的最大時間片。如假設(shè)一個系統(tǒng)中INT_CLOCK設(shè)置為10000,即10ms,那么TIMESHARING=1時,一個任務(wù)使用的最大時間片是10ms;TIMESHARING=2時,任務(wù)使用最大的時間片是20ms;TIMESHARING=5時,任務(wù)使用最大的時間片是50ms;當(dāng)TIMESHARING設(shè)置為0時,系統(tǒng)就不會進(jìn)行自動任務(wù)切換了,這時需要用os_switch_task函數(shù)進(jìn)行任務(wù)切換。這部分功能是RTX51 Tiny 2.0中新增加的。 2? 關(guān)于os_wait延時的問題 os_wait 是RTX51 Tiny中的基本函數(shù)之一。它的功能是將當(dāng)前任務(wù)掛起來,等待一個啟動信號(K_SIG)或超時信號(K_TMO)或周期信號(K_IVL)或者是它們之間的組合。雖然os_wait很簡單,但是因為涉及到多任務(wù)的操作方式,很容易產(chǎn)生誤解。 2.1 ?關(guān)于K_TMO的延時時間 在RTX51 Tiny中,如果一個任務(wù)中使用了os_wait(K_TMO,1,0),那么它的延時時間是多少呢? 這就是說,最后的效果是延時時間加上正在運行的任務(wù)執(zhí)行時間,而這個時間是與任務(wù)數(shù)和任務(wù)運行情況相關(guān)的。如果其它任務(wù)執(zhí)行的時間短,那么延時可能只是一個時間片;如果其它任務(wù)執(zhí)行的時間長,那么就需要多個時間片了。用os_wait做時鐘是不準(zhǔn)確的。 關(guān)于延時時間還有一個很容易理解錯的地方,那就是os_wait中無論使用K_TMO還是K_IVL參數(shù),延時的時間都只與INT_CLOCK有關(guān),而與TIMESHARING無關(guān)。或者說,os_wait函數(shù)一次只使用一個基本時間片,而不是任務(wù)的時間片。 2.2 ?關(guān)于K_TMO和K_IVL參數(shù)的區(qū)別 在os_wait中有三個參數(shù):K_TMO、K_IVL和K_SIG。其中,K_TMO與K_IVL是最容易讓人混淆的,特別是搞不清楚K_IVL到底是什么含義,好像使用起來與K_TMO效果差不多。一般的書上和Keil自帶的RTX51 Tiny的幫助中,也沒有清楚解釋K_IVL的含義。 K_IVL與K_TMO有很大區(qū)別,但是在一定環(huán)境下最終產(chǎn)生的效果卻差不多。 K_TMO是指等待一個超時信號,只有時間到了,才會產(chǎn)生一個信號。它產(chǎn)生的信號是不會累計的。產(chǎn)生信號后,任務(wù)進(jìn)入就緒狀態(tài)。K_IVL是指周期信號,每隔一個指定的周期,就會產(chǎn)生一次信號,產(chǎn)生的信號是可以累計的。這里累計的意思是,如果在指定的時間內(nèi)沒有對信號進(jìn)行響應(yīng),信號的次數(shù)會迭加,以后進(jìn)行信號處理時就不會漏掉信號。比如說,在系統(tǒng)中有幾個任務(wù),其中一個任務(wù)使用K_TMO方式延時,另外一個任務(wù)使用K_IVL延時,延時的時間相同。如果系統(tǒng)的任務(wù)很輕,兩個任務(wù)都可以及時響應(yīng),那么這兩種延時的效果是一樣的。如果系統(tǒng)的負(fù)擔(dān)比較重,任務(wù)響應(yīng)比較慢,不能及時響應(yīng)所有的信號,那么使用K_TMO方式的任務(wù)就有可能丟失一部分沒有及時響應(yīng)的信號,而使用K_IVL方式的任務(wù)就不會丟失信號。只是信號的響應(yīng)方式會變成這樣:在一段時間內(nèi)不響應(yīng)信號,然后一次把所有累計的信號都處理完。 下面的一個例子可以將上面兩個關(guān)于os_wait的問題解釋清楚。 在x1++和x2++這兩個地方加上斷點,進(jìn)行仿真,觀察執(zhí)行到斷點的時間。然后,去掉任務(wù)job4中的語句“//os_wait(K_TMO,1,0);”這一行前面的注釋符號,再次仿真。比較一下運行的結(jié)果,就可以清楚地知道它們的細(xì)微差別了。 軟件環(huán)境:Keil uVision 7.08 其它參數(shù)使用默認(rèn)設(shè)置。(需要自己建立一個工程文件,再將下面的文件添加到工程文件中。) 當(dāng)job4中os_wait(K_TMO,1,0)的注釋不取消時,job0每執(zhí)行一次,job1就連續(xù)執(zhí)行5次,x2是x1的5倍。因為job1中的os_wait(K_IVL,1,0)產(chǎn)生了5次信號,并累計下來;而job0中的os_wait(K_TMO,1,0)雖然也產(chǎn)生了5次信號,但是沒有累計,只有最后一次是真正有效的。 當(dāng)job4中os_wait(K_TMO,1,0)的注釋取消時,job0和job1的執(zhí)行次數(shù)是一樣的,x1=x2。 |
本文引用通告地址:http://tvb2058.spaces.eepw.com.cn/articles/trackback/item/15060
P.S. 關(guān)于 K_TMO 和 K_IVT 官方說明如下文:
http://www.keil.com/support/docs/451.htm
RTX51: DIFFERENCES BETWEEN K_IVL AND K_TMO
QUESTION
What's the difference between the K_IVL and K_TMO events in the os_wait function call? The documentation is not clear about these two events.
ANSWER
The K_TMO event lets you specify a number of OS ticks to delay a task. The K_IVL event lets you specify an interval to perform a task.
Here are examples to illustrate the differences between these two. Let's assume that the RTX51 tick is set for a period of 1 msec.
The K_TMO event delays for at least the number of OS ticks you specify. For example, if you have a task that loops through code that takes 5 msec to execute, calls os_wait(K_TMO...) with a tick count of 10, and repeats; the whole loop executes in 15 msec (5 msec for the code and 10 msec for the K_TMO).
The K_IVL event delays for a period of time that is at least the time that you specify minus the number of ticks that have elapsed since the last K_IVL event. For example, if you have a task that loops through code that takes 6 msec to execute, calls os_wait(K_IVL...) with a tick count of 10, and repeats; the whole loop executes in 10 msec (6 msec for the code and 4 msec for the K_IVL).
Use the K_TMO event when you need/want to delay a task for a few milliseconds. Use the K_IVL event when you need a task to execute on a specific periodic basis.
Remember that the number of ticks passed to the os_wait function MUST be an unsigned character and, therefore, must have a value of 255 or less.
Last Reviewed: Monday, June 07, 2004
轉(zhuǎn)載于:https://www.cnblogs.com/techstone/archive/2012/04/26/2661243.html
總結(jié)
以上是生活随笔為你收集整理的RTX51 Tiny中容易混淆的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: COJ1005(Binary Searc
- 下一篇: 准备换工作