基于uc/os-ii的嵌入式GUI研究與應用
發布時間:2008/6/16 0:00:00 訪問次數:977
1. 引言
人機界面是嵌入式系統的重要組成部分,當前比較流行的gui主要有:nano-x,microwindows,
minigui,qt/embedded,opengui等,普遍采用客戶/服務器結構,多線程概念,主要用于嵌入式linux系統中。uc/os-ii是一個簡單、高效的嵌入式實時操作系統內核,憑借其源代碼開放,系統內核可剪裁等特點,被廣泛應用到各種嵌入式系統中。但是,uc/os-ii只是一個實時多任務內核,不具有現代操作系統的線程,客戶/服務器機制,上述gui不能方便的運行在uc/os-ii上。
uc/gui是一個源代碼開放的gui,可以實現windows風格的圖形界面。微型是其最大的特點,占用很小的系統資源,易于移植,功能強大[1];可以運行在uc/os-ii操作系統中;采用了100%的ansi c編寫,可以應用于任何lcd和cpu中;加上其源代碼開放的特點,使用起來非常靈活。
2. 系統組成
系統是基于三星的s3c44b0x, 1mb的flash:sst39vf160,8mb的sdram:hy57v641620;使用了casio公司320×240象素stn偽彩色lcd,輸入使用4線電阻式觸摸屏,操作系統為uc/os-ii ,編譯器使用arm公司ads1.2;根據實際需要設計了兩路a/d轉換電路、一路d/a轉換電路。
3. uc/gui的移植
在進行移植之前首先要了解uc/gui的組織結構。uc/gui是以ansi c源碼包的形式提供的,由config和gui兩個目錄組成:
config
包含了對uc/gui進行配置的文件
gui/convertmono
使用黑白顯示設備時,所要使用的灰度轉換函數
gui/convertcolor
使用彩色顯示設備時,所要使用的彩色轉換函數
gui/core
uc/gui核心代碼
gui/font
uc/gui與字體相關的代碼文件
gui/memdev
內存設備支持文件代碼
gui/lcddriver
lcd驅動文件代碼
gui/touch
支持觸摸屏輸入的文件代碼
gui/widget
控件代碼,包括編輯框、列表框、按鈕、選擇框等
gui/wm
config目錄下包含了lcdconf.h,guitouchconf.h和guiconf.h三個文件用來對具體使用的lcd驅動程序、觸摸屏驅動程序和uc/gui進行配置。
uc/gui的移植過程主要是對config目錄下三個文件的修改,以及進行觸摸屏和lcd驅動程序的編寫[2]。
3.1觸摸屏的移植
在使用觸摸屏之前必須將config目錄下guiconf.h中的gui_support_touch設置為 1,由于項目中使用了操作系統所以同時將gui_os也設置為 1。觸摸屏觸點位置的獲得是通過調用gui/core/目錄中gui_touch_driveranalog.c文件中的 gui_touch_exec( )函數來實現的,對該函數進行修改后的偽代碼如下:
void gui_touch_exec(void)
{
讀取觸點在觸摸屏上(x, y)點實際坐標值;
進行實際坐標值到邏輯坐標的轉換;
調用gui_touch_storestate(x, y)保存邏輯坐標值;
}
系統為了實時得到觸點坐標,就要不斷調用gui_touch_exec( )函數。因此需要在uc/os-ii操作系統中建立一個單獨的任務對該函數進行調用,這樣可以保證觸摸屏任務的實時響應。實現方式如下:
void task_touch(void*id){ //建立觸摸屏任務
while(1){ gui_touch_exec(); //調用此函數
ostimedly(1); } //延時一個時鐘節拍
}
3.2 液晶屏的移植
lcd的移植與具體使用的lcd有關,并且相同的lcd可以有不同的顯示模式,這些都影響相關配置文件的修改。本系統使用的是casio公司320×240象素stn偽彩色lcd,s3c44b0x中的lcd控制器與lcd的連接方式為8位單掃描方式,顯示模式為彩色顯示。
配置的參數包含在lcdconf.h文件中,修改后的參數如下:
#define lcd_xsize 320 //x,y大小
#define lcd_ysize 240
#define lcdcolor //定義顯示模式
#define lcd_bitsperpixel 8 //每個象素點的位數
#define lcd_swap_rb 1 //是否交換藍色分量和紅色分量
#define lcd_fixedpalette 332 //調色板模式,本例使用3紅,3綠,2藍
#define lcd_max_log_colors (256) //最大的邏輯顏色數
以上是對lcd各配置參數的修改,接下來將完成lcd驅動api函數。其偽代碼如下:
u32 buffer[lcd_ysize][ lcd_xsize/4] //定義顯存, 對顯存操作直接反映到lcd上
int lcd_l0_init(void){ // lcd初始化函數
關閉lcd;
設定s3c44b0x lcd控制寄存器;
打開lcd;
return 0;
}
void lcd_setpixel(buffer, x, y, color) //畫象素點函數
buffer[(y)][(x)/4]=((buffer[(y)][(x)/4]&(~(0xff000000>>((x)%4)*8)))|( (c)<<((4-1-((x)%4))*8) ));
另外,在uc/os-ii操作系統中也需要建立一個單獨的任務對gui_exec()函數進行調用,以保證屏幕的及時刷新,給此屏幕刷新任務分配一個盡
1. 引言
人機界面是嵌入式系統的重要組成部分,當前比較流行的gui主要有:nano-x,microwindows,
minigui,qt/embedded,opengui等,普遍采用客戶/服務器結構,多線程概念,主要用于嵌入式linux系統中。uc/os-ii是一個簡單、高效的嵌入式實時操作系統內核,憑借其源代碼開放,系統內核可剪裁等特點,被廣泛應用到各種嵌入式系統中。但是,uc/os-ii只是一個實時多任務內核,不具有現代操作系統的線程,客戶/服務器機制,上述gui不能方便的運行在uc/os-ii上。
uc/gui是一個源代碼開放的gui,可以實現windows風格的圖形界面。微型是其最大的特點,占用很小的系統資源,易于移植,功能強大[1];可以運行在uc/os-ii操作系統中;采用了100%的ansi c編寫,可以應用于任何lcd和cpu中;加上其源代碼開放的特點,使用起來非常靈活。
2. 系統組成
系統是基于三星的s3c44b0x, 1mb的flash:sst39vf160,8mb的sdram:hy57v641620;使用了casio公司320×240象素stn偽彩色lcd,輸入使用4線電阻式觸摸屏,操作系統為uc/os-ii ,編譯器使用arm公司ads1.2;根據實際需要設計了兩路a/d轉換電路、一路d/a轉換電路。
3. uc/gui的移植
在進行移植之前首先要了解uc/gui的組織結構。uc/gui是以ansi c源碼包的形式提供的,由config和gui兩個目錄組成:
config
包含了對uc/gui進行配置的文件
gui/convertmono
使用黑白顯示設備時,所要使用的灰度轉換函數
gui/convertcolor
使用彩色顯示設備時,所要使用的彩色轉換函數
gui/core
uc/gui核心代碼
gui/font
uc/gui與字體相關的代碼文件
gui/memdev
內存設備支持文件代碼
gui/lcddriver
lcd驅動文件代碼
gui/touch
支持觸摸屏輸入的文件代碼
gui/widget
控件代碼,包括編輯框、列表框、按鈕、選擇框等
gui/wm
config目錄下包含了lcdconf.h,guitouchconf.h和guiconf.h三個文件用來對具體使用的lcd驅動程序、觸摸屏驅動程序和uc/gui進行配置。
uc/gui的移植過程主要是對config目錄下三個文件的修改,以及進行觸摸屏和lcd驅動程序的編寫[2]。
3.1觸摸屏的移植
在使用觸摸屏之前必須將config目錄下guiconf.h中的gui_support_touch設置為 1,由于項目中使用了操作系統所以同時將gui_os也設置為 1。觸摸屏觸點位置的獲得是通過調用gui/core/目錄中gui_touch_driveranalog.c文件中的 gui_touch_exec( )函數來實現的,對該函數進行修改后的偽代碼如下:
void gui_touch_exec(void)
{
讀取觸點在觸摸屏上(x, y)點實際坐標值;
進行實際坐標值到邏輯坐標的轉換;
調用gui_touch_storestate(x, y)保存邏輯坐標值;
}
系統為了實時得到觸點坐標,就要不斷調用gui_touch_exec( )函數。因此需要在uc/os-ii操作系統中建立一個單獨的任務對該函數進行調用,這樣可以保證觸摸屏任務的實時響應。實現方式如下:
void task_touch(void*id){ //建立觸摸屏任務
while(1){ gui_touch_exec(); //調用此函數
ostimedly(1); } //延時一個時鐘節拍
}
3.2 液晶屏的移植
lcd的移植與具體使用的lcd有關,并且相同的lcd可以有不同的顯示模式,這些都影響相關配置文件的修改。本系統使用的是casio公司320×240象素stn偽彩色lcd,s3c44b0x中的lcd控制器與lcd的連接方式為8位單掃描方式,顯示模式為彩色顯示。
配置的參數包含在lcdconf.h文件中,修改后的參數如下:
#define lcd_xsize 320 //x,y大小
#define lcd_ysize 240
#define lcdcolor //定義顯示模式
#define lcd_bitsperpixel 8 //每個象素點的位數
#define lcd_swap_rb 1 //是否交換藍色分量和紅色分量
#define lcd_fixedpalette 332 //調色板模式,本例使用3紅,3綠,2藍
#define lcd_max_log_colors (256) //最大的邏輯顏色數
以上是對lcd各配置參數的修改,接下來將完成lcd驅動api函數。其偽代碼如下:
u32 buffer[lcd_ysize][ lcd_xsize/4] //定義顯存, 對顯存操作直接反映到lcd上
int lcd_l0_init(void){ // lcd初始化函數
關閉lcd;
設定s3c44b0x lcd控制寄存器;
打開lcd;
return 0;
}
void lcd_setpixel(buffer, x, y, color) //畫象素點函數
buffer[(y)][(x)/4]=((buffer[(y)][(x)/4]&(~(0xff000000>>((x)%4)*8)))|( (c)<<((4-1-((x)%4))*8) ));
另外,在uc/os-ii操作系統中也需要建立一個單獨的任務對gui_exec()函數進行調用,以保證屏幕的及時刷新,給此屏幕刷新任務分配一個盡