基于LPC2478 的網(wǎng)絡(luò)型電能質(zhì)量監(jiān)測裝置人機交互功能研發(fā)
2. 1 μC/OS-Ⅱ的移植
μC /OS-Ⅱ嵌入式操作系統(tǒng)的移植工作包含以下幾個內(nèi)容:編寫硬件初始化啟動代碼;編寫設(shè)備驅(qū)動代碼;修改操作系統(tǒng)與硬件相關(guān)的代碼。
所謂啟動代碼,就是處理器在啟動的時候執(zhí)行的一段代碼,主要任務(wù)是定義程序入口指針;設(shè)置異常向量;初始化處理器各模式下的堆棧和寄存器;配置 CPU 時鐘源;初始化系統(tǒng)功能模塊;跳轉(zhuǎn)到C 語言主程序中等等。由于以上的操作均與處理器體系結(jié)構(gòu)和系統(tǒng)配置密切相關(guān),所以一般由匯編來編寫。在裝置中示意性的啟動代碼為:
PRESERVE8
Vectors LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PA^_Addr
LDR PC,DA^_Addr
LDR PC,IRQ_Addr
LDR PC,F(xiàn)IQ_Addr
Reset_Addr
為每一種處理器模式初始化堆棧;
地址重映射,設(shè)置MEMMAP = 1;
配置時鐘源,設(shè)置Fpclk = 72M;
初始化FLASH;
初始化SDRAM;
IMPORT __main
LDR R0,= __main
BX R0;跳轉(zhuǎn)到主程序中
設(shè)備驅(qū)動代碼是操作系統(tǒng)和硬件之間的橋梁。通過驅(qū)動代碼,用戶可以不用了解具體硬件的細節(jié),只需調(diào)用驅(qū)動層所提供的函數(shù)就能對硬件進行操作。在移植μC /OS-Ⅱ時,亦只需根據(jù)硬件環(huán)境編寫必要的硬件驅(qū)動程序即可。在此移植中,涉及到人機交互功能的硬件除微處理器LPC2478 外主要是鍵盤和液晶,液晶部分的驅(qū)動代碼包含在了μC /GUI 圖形接口的移植步驟中。而鍵盤的主要功能為接受用戶的輸入,在微處理器LPC2478 中,可以使用I /O 中斷的功能來實現(xiàn)對鍵盤輸入的監(jiān)測,驅(qū)動代碼則為鍵盤的中斷處理程序:
void Key_Handler(void)
{ DWORD key_n = 0;
key_n = IO0_INT_STAT_F; / /讀取中斷狀態(tài)
IO0_INT_EN_F & = 0xE07F8FFF; / /禁止中斷
IO0_INT_CLR | = 0xFFFFFFFF; / /清除中斷
if ((key_n&0x00800000) = = 0x00800000)
{ OSMboxPost(Keybox,(void * )1);}
if ((key_n&0x01000000) = = 0x01000000)
{ OSMboxPost(Keybox,(void * )2);}
if (key_n&0x02000000) = = 0x02000000)
{ OSMboxPost(Keybox,(void * )3);}
if ((key_n&0x08000000) = = 0x08000000)
{ OSMboxPost(Keybox,(void * )4);}
if ((key_n&0x10000000) = = 0x10000000)
{ OSMboxPost(Keybox,(void * )5);}
if ((key_n&0x00001000) = = 0x00001000)
{ OSMboxPost(Keybox,(void * )6);}
IO0_INT_EN_F | = 0x1F807000; / /開啟中斷
}
編寫完硬件初始化啟動代碼和設(shè)備驅(qū)動代碼之后,在修改操作系統(tǒng)與硬件相關(guān)的代碼之前,應(yīng)該了解μC /OS-Ⅱ的體系結(jié)構(gòu)如圖3 所示。移植μC /OS-Ⅱ,最主要的工作就是移植與硬件相關(guān)的3 個文件,即OS _CPU. H、OS _CPU_C. C 和OS _CPU_A. ASM。OS_CPU. H 中含有用#define 定義的與處理器有關(guān)的常量、宏和類型定義。通過對此處定義的修改,可以使源代碼中對數(shù)據(jù)類型的使用不依賴于具體的處理器。移植時,只要使處理器、編譯器和 μC /OS-Ⅱ三者之間數(shù)據(jù)類型統(tǒng)一即可。在此文件中還有一個μC /OS-Ⅱ?qū)Χ褩T鲩L方式的定義OS_STK_GROWTH,由于Keil 只支持遞減堆棧,因此,此處需要定義OS _ STK _GROWTH 的值為1。OS_CPU_C. C 文件中,需要進行的工作是編寫任務(wù)堆棧初始化函數(shù)OSTask-StkInit()。該函數(shù)在創(chuàng)建一個任務(wù)時被調(diào)用。根據(jù)微處理器的寄存器結(jié)構(gòu),就可以確定在本次移植中針對LPC2478 應(yīng)該使用的任務(wù)的堆棧結(jié)構(gòu),從而可以寫出堆棧初始化函數(shù)代碼。在OS_CPU_A. ASM 文件中,有4 個函數(shù)需要編寫,分別是啟動最高優(yōu)先級就緒任務(wù)函數(shù)OSStartHighRdy(),時鐘節(jié)拍中斷服務(wù)子程序OSTickISR(),任務(wù)級任務(wù)切換函數(shù)OS_TASK_SW( ) 及中斷級任務(wù)切換函數(shù)OSIntCtxSw()。
μC/OS-Ⅱ的體系結(jié)構(gòu)圖
圖3 μC/OS-Ⅱ的體系結(jié)構(gòu)圖。
評論