RTX51 Tiny中容易混淆的问题
| RTX51 Tiny是 Keil uVision中自帶的一個小型嵌入式RTOS,具有小巧、速度快、系統開銷小、使用方便等優點。使用RTX51 Tiny能夠提高系統的穩定性,優化程序的性能;而且它是為51單片機專門定制的,所以在51單片機上的運行效率比其它一些通用的RTOS性能也要好一些。 但是,由于RTX51 Tiny的相關資料和書籍比較少,大部分只是對程序自帶幫助文件的簡單翻譯,很少進行深入探討。下面就RTX51 Tiny使用中經常遇到的一些問題進行探討。 1 ?關于時間片的問題 RTX51 Tiny使用的是無優先級時間片輪詢法,每個任務使用相同大小的時間片,但是時間片是怎樣確定的呢? RTX51 Tiny的配置參數(Conf_tny.a51文件中)中有INT_CLOCK和TIMESHARING兩個參數。這兩個參數決定了每個任務使用時間片的大小:INT_CLOCK是時鐘中斷使用的周期數,也就是基本時間片;TIMESHARING是每個任務一次使用的時間片數目。兩者決定了一個任務一次使用的最大時間片。如假設一個系統中INT_CLOCK設置為10000,即10ms,那么TIMESHARING=1時,一個任務使用的最大時間片是10ms;TIMESHARING=2時,任務使用最大的時間片是20ms;TIMESHARING=5時,任務使用最大的時間片是50ms;當TIMESHARING設置為0時,系統就不會進行自動任務切換了,這時需要用os_switch_task函數進行任務切換。這部分功能是RTX51 Tiny 2.0中新增加的。 2? 關于os_wait延時的問題 os_wait 是RTX51 Tiny中的基本函數之一。它的功能是將當前任務掛起來,等待一個啟動信號(K_SIG)或超時信號(K_TMO)或周期信號(K_IVL)或者是它們之間的組合。雖然os_wait很簡單,但是因為涉及到多任務的操作方式,很容易產生誤解。 2.1 ?關于K_TMO的延時時間 在RTX51 Tiny中,如果一個任務中使用了os_wait(K_TMO,1,0),那么它的延時時間是多少呢? 這就是說,最后的效果是延時時間加上正在運行的任務執行時間,而這個時間是與任務數和任務運行情況相關的。如果其它任務執行的時間短,那么延時可能只是一個時間片;如果其它任務執行的時間長,那么就需要多個時間片了。用os_wait做時鐘是不準確的。 關于延時時間還有一個很容易理解錯的地方,那就是os_wait中無論使用K_TMO還是K_IVL參數,延時的時間都只與INT_CLOCK有關,而與TIMESHARING無關。或者說,os_wait函數一次只使用一個基本時間片,而不是任務的時間片。 2.2 ?關于K_TMO和K_IVL參數的區別 在os_wait中有三個參數:K_TMO、K_IVL和K_SIG。其中,K_TMO與K_IVL是最容易讓人混淆的,特別是搞不清楚K_IVL到底是什么含義,好像使用起來與K_TMO效果差不多。一般的書上和Keil自帶的RTX51 Tiny的幫助中,也沒有清楚解釋K_IVL的含義。 K_IVL與K_TMO有很大區別,但是在一定環境下最終產生的效果卻差不多。 K_TMO是指等待一個超時信號,只有時間到了,才會產生一個信號。它產生的信號是不會累計的。產生信號后,任務進入就緒狀態。K_IVL是指周期信號,每隔一個指定的周期,就會產生一次信號,產生的信號是可以累計的。這里累計的意思是,如果在指定的時間內沒有對信號進行響應,信號的次數會迭加,以后進行信號處理時就不會漏掉信號。比如說,在系統中有幾個任務,其中一個任務使用K_TMO方式延時,另外一個任務使用K_IVL延時,延時的時間相同。如果系統的任務很輕,兩個任務都可以及時響應,那么這兩種延時的效果是一樣的。如果系統的負擔比較重,任務響應比較慢,不能及時響應所有的信號,那么使用K_TMO方式的任務就有可能丟失一部分沒有及時響應的信號,而使用K_IVL方式的任務就不會丟失信號。只是信號的響應方式會變成這樣:在一段時間內不響應信號,然后一次把所有累計的信號都處理完。 下面的一個例子可以將上面兩個關于os_wait的問題解釋清楚。 在x1++和x2++這兩個地方加上斷點,進行仿真,觀察執行到斷點的時間。然后,去掉任務job4中的語句“//os_wait(K_TMO,1,0);”這一行前面的注釋符號,再次仿真。比較一下運行的結果,就可以清楚地知道它們的細微差別了。 軟件環境:Keil uVision 7.08 其它參數使用默認設置。(需要自己建立一個工程文件,再將下面的文件添加到工程文件中。) 當job4中os_wait(K_TMO,1,0)的注釋不取消時,job0每執行一次,job1就連續執行5次,x2是x1的5倍。因為job1中的os_wait(K_IVL,1,0)產生了5次信號,并累計下來;而job0中的os_wait(K_TMO,1,0)雖然也產生了5次信號,但是沒有累計,只有最后一次是真正有效的。 當job4中os_wait(K_TMO,1,0)的注釋取消時,job0和job1的執行次數是一樣的,x1=x2。 |
本文引用通告地址:http://tvb2058.spaces.eepw.com.cn/articles/trackback/item/15060
P.S. 關于 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
轉載于:https://www.cnblogs.com/techstone/archive/2012/04/26/2661243.html
總結
以上是生活随笔為你收集整理的RTX51 Tiny中容易混淆的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: COJ1005(Binary Searc
- 下一篇: 准备换工作