使用tick中斷
經過許多天的努力,總算可以使用中斷了,但為了讓rtos可以使用定時中斷,那麼在s3c44b0裡有什麼樣的中斷可以實現呢?在s3c44b0裡有兩種方法可以實現這樣中斷,一種是通過定時器中斷,一種是通rtc的tick定時中斷。由於s3c44b0片內已經有提供給rtos的中斷,就應使用它作為rtos的中斷,這樣可以使時間片跟rtc時鐘是時間同步。rtos排程任務是通過設定時間片中斷實現的。當時間片到達時,就向cpu發出中斷訊號,cpu就會把當前任務狀態儲存下來,然後轉到中斷程序執行,並且在中斷裡放著的是進行優先選擇執行任務的程式,接著從中斷返回時就可以執行不同的任務了。既然這個中斷那麼重要,就需要詳細地了解tick中斷實現。
s3c44b0的內部有乙個實時日曆時鐘(rtc)單元,它只需要外接乙個32.768khz的晶振即可工作。當然要對它進行程式設計初始化才能工作的,下面就來看看是怎麼樣初始化的。
首先,通過rtccon暫存器的第0位來表示要「讀」還是「寫」rtc的暫存器。當設定第0位為1時,就允許讀寫所有暫存器。當設定第0位為0時,就只允許讀,不允許寫所有暫存器。
其次,通過ticnt暫存器來控制產生tick中斷。這個暫存器的第7位是表示是否啟用tick中斷。當啟用時,就設定為1。第0到6位表示中斷計數值,要多久才中斷,是通過下面的公式計算得到的:
時間片 = (n+1)/128 秒,
其中n是需要設定的數值,它的範圍是從1到127。
從上面的公式可以看出來,當設定n值越大時,時間片就越大,當設定為127時,就時一秒鐘中斷一次了。設定為最小值1時,就是15.625ms。
最後,下面這段程式就是設定tick中斷,這樣就要以供rtos使用了。
/////函式名稱: tickintenable
//函式功能: 開啟tick中斷。
//輸入引數: ntickcount---分頻係數。
//輸出引數:
//返 回 值:
//開發人員: 蔡軍生
//時間: 2006/02/13
//修改說明:
/////
void tickintenable(unsigned int ntickcount)
如果中斷暫存器已經設定好,那麼這個rtos的時間片中斷,就已經可以工作了。接著最重要的工作,就是怎麼樣在中斷子程式裡進行rtos的任務切換,這個比較複雜,需要很長時間去了解和實驗,並且要對arm的彙編比較好。這個時間片設定長短,也跟不同的應用有關係的,如果需要快速實時的中斷,就需要設定它短一點,這樣檢查任務切換就及時一點,但也有乙個壞處,就是浪費在任務切換上的cpu資源比較多。如果任務除錯不需要太及時,就可以設定大一點,這樣浪費在任務切換上的cpu資源就減少了。
學習ARM開發 19
使用tick中斷 經過許多天的努力,總算可以使用中斷了,但為了讓rtos可以使用定時中斷,那麼在s3c44b0裡有什麼樣的中斷可以實現呢?在s3c44b0裡有兩種方法可以實現這樣中斷,一種是通過定時器中斷,一種是通rtc的tick定時中斷。由於s3c44b0片內已經有提供給rtos的中斷,就應使用它...
學習ARM開發20 21
學習arm開發 20 os的任務切換 有了前面的tick中斷,那麼基本的任務切換條件已經是 萬事俱備,只欠東風 了。不過,這個 東風 也是很難搞得懂的,只有不斷地通過實踐才會找到合適的方法。現在我就需要去找這個東風了,就是解決不同的任務切換的問題。從簡單到複雜,這是任何事物的認識過程,也是行之有效的...
學習ARM開發 5
學習arm開發 5 蔡軍生 2005 07 16 寫於深圳 上一次說到要學習uboot的 但在看之前,首先要知道目標機器的程式設計資源,這裡的資源,是指s3c44b0所提供的執行程式的資源,對任何嵌入式軟體開發,都首先要對硬體有乙個很好的了解,這跟pc機的程式設計是大不一樣的。因為pc機都已經發展了...