基于ARM7支持觸摸屏和實時操作系統的開發與應用
摘要:本文介紹了μC/OS-II嵌入式實時操作系統和μC/GUI在ARM7處理器上的移植方法,以及如何利用嵌入式操作系統進行應用程序的開發和管理各種任務。重點討論了μC/OS-II實時操作系統的移植方法和μC/GUI的移植技術,并提供了一種簡單有效的去除觸摸屏抖動的方法;最后通過應用實例對任務的劃分和界面的操作進行了說明。
本文引用地址:http://www.j9360.com/article/112971.htm概述
隨著信息技術的發展,支持圖形界面的觸摸操作和實時操作系統相結合的應用系統已經越來越廣泛地應用到航空航天、軍事、消費類電子、通訊設備等領域。mC/OS-II操作系統是一種占先式、實時操作系統(RTOS),由于其內核可拆減、可剝離性,使得它在實時控制領域中有著廣泛的應用。它不僅減小了因為系統硬件設計缺陷帶來的不可靠因素,而且增強了系統的控制實時性,從軟件方面進一步增強了ARM控制系統的性能。另外,新版本的mC/OS-II已經通過了FAA認證,很適合應用于對實時性要求很高的嵌入式工業控制領域,如目前應用較廣泛的軍用戰斗機、攻擊機和火控系統等。
支持圖形界面操作(mC/GUI)是一種較為流行的人機交互系統,它能夠提供了友好的人機交互平臺,使得微處理器成為大多數人都能夠使用和接受的工具。與PC機不同,由于mC/OS-II基本為“黑盒”式操作系統,對人機界面的控制與開發需比較復雜的編程技術和時序控制技術。ARM7嵌入式實時控制系統對mC/GUI的要求更高,包括輕型、占用資源少、高性能、高可靠性及可配置等。因此,如何將ARM7、mC/GUI、mC/OS-II、觸摸屏驅動和應用程序有機的結合起來,在ARM7上進行運行并完成用戶想實現的任務,成為在嵌入式操作系統開發中的一項關鍵技術。
mC/OS-II嵌入式操作系統的移植
mC/OS-II作為操作系統的內核,主要的任務就是完成多任務之間的調度和同步,協調各個硬件源不會沖突。與其它嵌入式操作系統相比,它具有系統透明、可拆減、接口簡單的特點。下面就如何在S3C44B0進行操作系統移植和修改作簡要的描述:
(1)重新修改OS_CPU.H文件
a)定義數據類型:mC/OS-Ⅱ不使用C語言中的short、int、long等與處理器類型有關的數據類型,而代之以移植性強的數據類型,這樣既直觀又便于移植;
b)定義堆棧增長類型和ARM運行的模式:雖然ARM處理器對堆棧向上與向下的兩種增長方式都予以支持,但由于編譯器ADS僅支持堆棧從上往下,并且必須是滿遞減堆棧,所以在文件中用來定義堆棧增長方式的常量OS_STK_GROWTH 的值為1;
c)需對外部函數聲明:如在mC/OS-II.h頭文件中,有些要移植的函數已經聲明,包括:OSTaskStkInit()、OSIntCtxSw(void)、OSStartHighRdy(void) 。
(2)修改OS_CPU_C.C文件
a)任務堆棧初始化函數OSTaskStkInit():在編寫任務堆棧初始化函數OSTaskStkInit()之前,必須先根據處理器的結構和特點確定任務的堆棧結構;
b)鉤子函數:mC/OS-II為了用戶在系統函數中書寫自己的代碼而預置了一些鉤子函數(如OSTimeTickHook),這些函數在移植時可全為空函數,可根據用戶的需要添加。
(3)重點編寫OS_CPU_A.S文件a)開/關中斷函數:在ARM7處理器核中可利用改變程序狀態寄存器CPSR中的相應控制位實現;
b)OSStartHighRdy(void):OSStart()函數調用OSStartHighRdy()來使就緒態任務中優先級最高的任務開始執行;
c)OS_TASK_SW(void):μC/OS-II通過調用OSSched()函數來完成任務調度的,OSSched()先將最高優先級任務的地址裝載到OSTCBHighRdy,再通過調用OS_TASK_SW()執行任務級的任務切換,OS_TASK_SW主要完成保護現場,完成用于的任務,恢復現場;
d)OSIntCtxSw(void):OSIntExit()通過調用OSIntCtxSw(),在中斷服務程序中執行任務切換功能。
e)時鐘節拍函數:在本移植中,只使用了ARM的IRQ中斷。由于不同的ARM芯片的中斷系統并不完全一樣,因此不可能編寫出對所有使用ARM核的處理器通用的中斷及節拍移植代碼,但是這是后續任務管理中重點需要操作系統進行處理的,OSTickISR的實現代碼見程序清單。
程序清單 OSTickISR()
OSTickISR
STMFD SP!, {R0-R3,R12,LR}
BL OSIntEnter
BL user_function ;調用用戶
處理的中斷處理程序
BL OSIntExit
LDMFD SP!,{R0-R3,R12,LR}
S3C44B0觸摸屏驅動程序編制
本文采用固定參考電壓模式,在驅動程序開發過程中,需要關注時鐘端、輸入端和輸出端的時序特性。首先檢測PENIRQ是否為低電平,只有觸摸屏有接觸時此位才會為低電平。利用軟件模擬DIN、DOUT和DCLK上的三線串行傳輸時序,將讀取的X或Y坐標數值的控制字串行送人ADS7843,然后再從對應的函數讀出該坐標值,獲取坐標值的源程序如下:
int TOUCH_X_MeasureX(void)
{
X=ReadTouchXY(CHX);
return X;
}
int TOUCH_X_MeasureY(void)
{
Y=ReadTouchXY(CHY);
return Y;
}
c語言相關文章:c語言教程
模數轉換器相關文章:模數轉換器工作原理
評論