移植FreeRTOS到ATmega128單片機

嵌入式系統上使用RTOS能有效的處理複雜的多任務應用。互聯網上有許多開源的RTOS可資使用。uCOS是推廣的較早開源RTOS,有資質的教育機構可以免費用於教育目的,商業應用則需要得到付費的商業許可證。FreeRTOS則是一個遵循GPL許可的開源RTOS。
開源RTOS一般由一個處理器無關的公共內核代碼和少量處理器相關的代碼組成。爲了在特定的處理器上使用RTOS,需要獲得與該處理器相關的部分代碼。處理器相關的代碼主要包括寄存器上下文切換,時鐘節拍相關的定時器初始化,將定時器中斷掛接到Tick中斷例程上。網絡上一般比較容易找到特定的處理器(MPU)下的移植代碼,但是這個代碼一般針對的是該系列處理器的官方評估板,其MPU型號和系統資源與我們的目標板一般不可能完全一致。項目開發中要做的工作一般是將官方評估板上移植好的RTOS修改到可以在我們的應用目標板上運行。
由於類似架構處理器的處理器寄存器上下文切換代碼一般相同,故在這種情況下,需要做的主要是RTOS時鐘節拍(Tick)的建立。具體的工作有,選擇一個用於發生時鐘節拍的定時器,在初始化程序中根據處理器的主頻和Tick值確定定時器的計數值,將TickISR掛到所選用的定時器的中斷,使能中斷。
我們的目標板是基於ATmega128單片機,工作採用的RTOS是FreeRTOSv7.2.0。FreeRTOS官網上有ATmega323的移植代碼。官網上的示例代碼包括有LED閃爍任務和一個串口通信任務,移植目標是在ATmega128目標板運行此示例代碼。ATmega323與ATmega128A的差異很小,主要在於內部的Flash和SRAM的大小和外設的數目。
進行的修改有以下內容:
1. 原始程序使用了16位定時器1,8MHz主頻。改爲使用八位定時器0,目標板的主頻爲16MHz,對定時器0使用1024分頻,設置比較計數值爲125,得到結果是16000000/1024/125=125Hz的節拍,節拍時間爲1s/125=8ms。
2. 原始程序運行的ATmega323單片機只有一個串口,串口程序所用的寄存器,中斷向量均改到ATmega128的USART1對應的各寄存器。由於寄存器內部的結構相同,故此修改很簡單,在寄存器名稱中插入1即可。
把makefile中的處理器設置行改爲 MCU = atmega128後,重新編譯的程序即在目標板上得到的正確運行。
出現過的問題:
在修改串口部分代碼時,對編譯器提示未定義的寄存器名稱逐個處理後,得到的程序在目標板上反覆復位。註釋掉串口任務即可正常閃燈,檢查發現是串口中斷服務程序的定義處未修改,編譯器並不報錯,改正到USART1對應的中斷向量後復位問題得到解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章