uCOS-II+ucGUI到FL2440移植

                                                                     FL2440_uCOS-II+ucGUI移植

需要的软件包:天嵌移植好的uCOS-II工程,ucgui324.zipucGUI2.rar

一:在天嵌移植好的uCOS-II基础上增加ucGUI支持:

移植前工程文件(天嵌移植好的uCOS-II工程)如下(不上图了):

 

uCos+ucGUI_移植前.rar

 

二:添加相应工程文件并除错:

1.增加工程文件夹,如下图:

 

uCos+ucGUI_1.rar

 

2.向工程文件夹添加文件,文件全部来自ucgui324.zip相应文件夹下的所有文件,除了LCDDriver文件夹下的FL2440_LCD_for_GUI.c FL2440_LCD_for_GUI.c来自ucGUI2.rar相应文件夹下。

添加后工程界面如下图:

 

uCos+ucGUI_2.rar

 

3.编绎,除错。。。。。。以下给出部分错误处理:

1).#define U32 unsigned long -> #define U32 unsigned int

2).#include "2440addr.h" -> #include "S3C2440addr.h"

3).删除gui/Core/GUI_BMP.c

4).删掉S3C2440->Source->lcd.c

5).Main.c中与S3C2440/Source/lcd.c相关去掉

6).修改:Gui/LCDDriver/LCDWin.c:

注释掉以下语句:

//#if defined(WIN32) && !defined(LCD_SIMCONTROLLER)

//#include <windows.h>

//#include "memory.h"

//#else

 // void LCDWin(void) { } /* avoid empty object files */

//#endif /* defined(WIN32) && defined(LCD_USE_WINSIM) */

 

7)将ucgui324/Sample/GUI_X ucgui324.zip解压得到ucgui324)加入工程:

 

8)修改GUI_X_uCOS.c

<1>.//#include "uCOS_Types.h"

 

<2>.void GUI_X_ExecIdle(void) {

 // OS_X_Delay(1);

}

 

<3>.增加以下内容:

void GUI_X_ErrorOut(const char *s){s = s;}

void GUI_X_Log(const char *s) { s = s; }

void GUI_X_Warn(const char *s ) {s = s;}

 

void TOUCH_X_ActivateX(void){}

void TOUCH_X_ActivateY(void){}

void TOUCH_X_Disable(void){}

int  TOUCH_X_MeasureX(void){}

int  TOUCH_X_MeasureY(void){}

 

9)修改gui/LEDDriver/LCDWin.c:添加

/**************自定义函数*****************/

int  LCDSIM_GetPixelIndex(int x, int y)

{

              U16 c;

              c=FL2440_LCD_GetPixel(x,y);

              return c;

}

 

void  LCDSIM_SetPixelIndex(int x, int y, int Index)

{

      FL2440_LCD_SetPixel(x, y, Index);    /* 这个函数是底层控制LCD在指定点画点的函数 */

}

 

void  LCDSIM_SetLUTEntry(U8 Pos, LCD_COLOR color)

{

 

}

 

 

 

/***************************************/

 

到此编译成功!

 

 

以下为编绎成功时的工程文件:

 

uCos+ucGUI_suc.rar

 

三:针对FL2440修改:

 

1.修改Main函数:在OSInit ()函数上面添加:

FL_Lcd_Init();

GUI_Init();

GUITASK_Init();

 

2.修改gui/LCDDriver/LCDWin.c

void LCD_Off          (void) {}

void LCD_On           (void) {}

改为:

void LCD_Off          (void) {FL2440_LCD_Off();}

void LCD_On           (void) {FL2440_LCD_On();}

 

void LCD_L0_ReInit       (void) {} 改为:void LCD_L0_ReInit       (void) {Lcd_Init();}

 

到此移植成功!

 

四:测试:修改Main.c以测试移植,测试函数来自ucGUI2finalexp_main.c,经测试移植成功,但屏幕闪烁较严重。

 

修改后的Main.c如下:

 

/************************************************** ** 文件名:main.c ** 版本号:V 1.0 ** 版权说明:本源码由天嵌科技编写并维护。 ** 文件说明:自定义的主函数,当汇编部分执行完成后, ** 跳转到本文件的main函数中,完成对uCOS-II的任务初始化等, ** 最后调用任务管理器,并开始任务调用。 ***************************************************/ #include "config.h" #include "GUI.h" //extern void Lcd_Display(void); void Task_LCD(void *p); /*****************【任务相关自定义变量】*****************/ OS_STK MainTaskStk[MainTaskStkLengh]; OS_STK Task0Stk [Task0StkLengh]; // Define the Task0 stack OS_STK Task1Stk [Task1StkLengh]; // Define the Task1 stack OS_STK Task2Stk [Task2StkLengh]; // Define the Task2 stack OS_EVENT *Semp; //Creat semp U8 err; int rYear, rMonth,rDay,rDayOfWeek,rHour,rMinute,rSecond; //建立一个任务用变量,实现该任务第一次运行时,就需要初始化,之后再运行该任务时则不需要进行初始化 int user_task0_firstboot = 1; int user_task1_firstboot = 1; int user_task2_firstboot = 1; OS_EVENT *Cls; #define TaskStkLeath 1024 // Define the Task0 stack length OS_STK Task_Text_Stk[TaskStkLeath]; OS_STK Task_Title_Stk[TaskStkLeath]; OS_STK Task_SideText_Stk[TaskStkLeath]; OS_STK Task_Uart_Stk[TaskStkLeath]; OS_STK TaskStartSTK[TaskStkLeath]; OS_STK Task_Info_Stk[TaskStkLeath]; OS_STK Task_Bmp_Stk[TaskStkLeath]; void Task_Text(void *pdata); // Task_Text void Task_Uart(void *pdata); // Task_Uart void Task_SideText(void *pdata); // Task_SideText void Task_Title(void *pdata); void Task_Info(void *pdata); void Task_Bmp(void *pdata); int Main(int argc, char **argv) { //初始化目标板 TargetInit(); FL_Lcd_Init(); GUI_Init(); GUITASK_Init(); //初始化uCOS-II OSInit (); //初始化系统时基 OSTimeSet(0); //创建系统初始任务 OSTaskCreate (MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio); //开始任务 OSStart (); return 0; } void MainTask(void *pdata) //Main Task create taks0 and task1 { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); Timer0Init(); //initial timer0 for ucos time tick ISRInit(); //initial interrupt prio or enable or disable OS_EXIT_CRITICAL(); OSPrintfInit(); //use task to print massage to Uart OSStatInit(); //OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], Task0Prio); //OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], Task1Prio); //OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkLengh - 1], Task2Prio); //OSTaskCreate(Task_Text,0, &Task_Text_Stk[TaskStkLeath - 1], NormalTaskPrio + 3); OSTaskCreate(Task_SideText, 0, &Task_SideText_Stk[TaskStkLeath - 1], NormalTaskPrio+3); OSTaskCreate(Task_Info, 0, &Task_Info_Stk[TaskStkLeath - 1], NormalTaskPrio+5); // OSTaskCreate(Task_Title, 0, &Task_Title_Stk[TaskStkLeath - 1], NormalTaskPrio+6); // OSTaskCreate(Task_Uart, 0, &Task_Uart_Stk[TaskStkLeath - 1], NormalTaskPrio+8); OSTaskCreate(Task_Bmp, 0, &Task_Bmp_Stk[TaskStkLeath - 1], NormalTaskPrio+7); while(1) { //OSPrintf("/nEnter Main Task/n"); OSTimeDly(OS_TICKS_PER_SEC); } } void Task0(void *pdata) //任务0,打印CPU占用率 { while (1) { OSPrintf("/nEnter Task0/n"); OSPrintf("CPU Usage: %d%%/n",OSCPUUsage); //打印CPU占用率,调用系统变量实现 OSTimeDly(OS_TICKS_PER_SEC); } } void Task1(void *pdata) //任务1,控制LED灯亮,开启蜂鸣器同时鸣叫 { U16 task1Cnt=0; if(user_task1_firstboot == 1) { // RTC初始化 Rtc_Init(); user_task1_firstboot = 0; } while (1) { task1Cnt++; OSPrintf("/nEnter Task1/n"); OSPrintf("uC/OS Version:V%4.2f/n",(float)OSVersion()*0.01);//打印uC/OS的版本号 //实现流水灯 if((task1Cnt%5) == 0) rGPBDAT = 0x1E0; //全灭 else rGPBDAT = rGPBDAT - (0x10<<(task1Cnt%5)); //流水灯 //蜂鸣器鸣叫 /* Beep(3000, 60); Beep(2500, 60); Beep(2000, 60); Beep(1500, 60); Beep(1000, 60); Beep(900, 60);*/ OSTimeDly(OS_TICKS_PER_SEC*5); } } void Task2(void *pdata) { unsigned int i, x, m, n, k, y; int tmp,key; int width = 10; int height = 100; if(user_task2_firstboot == 1) { //LCD 初始化 //Lcd_Display(); user_task2_firstboot = 0; } while(1) { i++; if(i>99)i=0; if(rBCDYEAR == 0x99) rYear = 1999; else rYear = (2000 + rBCDYEAR); rMonth = FROM_BCD(rBCDMON & 0x1f); rDay = FROM_BCD(rBCDDAY & 0x03f); rDayOfWeek = rBCDDATE - 1; rHour = FROM_BCD(rBCDHOUR & 0x3f); rMinute = FROM_BCD(rBCDMIN & 0x7f); rSecond = FROM_BCD(rBCDSEC & 0x7f); OSTimeDly( 5 ); OSPrintf("/nEnter Task2/n"); OSPrintf("LCD display Test!/n/n"); //在LCD上打印日期,星期,时间 /* Lcd_printf(0,65,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),0,"时间:%4d-%02d-%02d 星期%d %02d:%02d:%02d/n", rYear, rMonth, rDay,rDayOfWeek, rHour, rMinute, rSecond); Lcd_printf(84,92,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),1," uC/OS2任务演示"); Lcd_printf(89,122,RGB( 0xFF,0xFF,0xFF),RGB( 0x00,0x00,0x00),0,"任务 计数中:%02d" , i);*/ OSTimeDly(OS_TICKS_PER_SEC/5); } } #define REBX 5 #define REBY 3 #define WIDTH 96 #define HIGH 72 #define TEXT_SIZE_Y 100 #define TEXT_SIZE_X 200 #define TEXT_X 100 #define TEXT_Y 40 //#define CH_WIDTH 10 //一个汉字的宽度 //#define CH_HIGH 10 //一个汉字的高度 void Task_Text (void *pdata) { U8 err; GUI_MEMDEV_Handle text_mem; text_mem=GUI_MEMDEV_Create(TEXT_X,TEXT_Y,TEXT_SIZE_X+10,TEXT_SIZE_Y+10); GUI_MEMDEV_Select(text_mem); while(1){ OSSemPend(Cls,0,&err); //Uart_Printf("CLS/n"); OSPrintf("CLS/n"); //OS_ENTER_CRITICAL(); //GUI_ClearRect(TEXT_X,TEXT_Y,TEXT_X+TEXT_SIZE_X,TEXT_Y+TEXT_SIZE_Y); GUI_Clear(); GUI_DrawHLine(TEXT_Y,TEXT_X,TEXT_X+TEXT_SIZE_X); GUI_DrawHLine(TEXT_Y+TEXT_SIZE_Y,TEXT_X,TEXT_X+TEXT_SIZE_X); GUI_DrawVLine(TEXT_X,TEXT_Y,TEXT_Y+TEXT_SIZE_Y); GUI_DrawVLine(TEXT_X+TEXT_SIZE_X,TEXT_Y,TEXT_Y+TEXT_SIZE_Y); //GUI_DrawBitmap(&bmslamdunk1_tiny,i,j); //OS_EXIT_CRITICAL(); //GUI_Delay(500); GUI_MEMDEV_CopyToLCD(text_mem); //OSSemPost(Disp); OSTimeDlyHMSM(0,0,0,200); } } void Task_Uart (void *pdata) { U8 c=0; S16 char_x,char_y; S16 ch_width,ch_high; ch_width=GUI_GetCharDistX('a'); ch_high=GUI_GetFontDistY(); char_x=TEXT_X+ch_width; char_y=TEXT_Y+ch_high; //Uart_Printf("begin i,j=%d,%d/n",char_x,char_y); while(1){ //while((c=Uart_Getch())!='/r') //Uart_Printf("in while i,j=%d,%d/n",char_x,char_y); c=Uart_GetKey(); //GUI_DispCharAt(c,i,j); if(c=='/r'){ Uart_Printf("x,y=%d,%d/n",char_x,char_y); char_x=TEXT_X+ch_width; char_y=char_y+ch_high; if(char_y>=(TEXT_Y+TEXT_SIZE_Y)){ char_y=TEXT_Y+ch_high; OSSemPost(Cls); //OSTimeDlyHMSM(0,0,0,10); //Uart_Printf("post 2.j=%d/n",char_x); } } else if(c!='/r' && c!=0) { //Uart_Printf("else i,j=%d,%d/n",char_x,char_y); //GUI_X_Lock(); GUI_DispCharAt(c,char_x,char_y); //GUI_X_Unlock(); char_x=char_x+ch_width; if(char_x>=(TEXT_X+TEXT_SIZE_X)){ char_x=TEXT_X+ch_width; char_y=char_y+ch_high; } if(char_y>=(TEXT_Y+TEXT_SIZE_Y-ch_high)){ char_y=TEXT_Y+ch_high;; OSSemPost(Cls); //OSTimeDlyHMSM(0,0,0,10); //Uart_Printf("post 1.j=%d/n",char_y); } } OSTimeDlyHMSM(0,0,0,100); } } //侧边文本框原点及大小 #define SIDE_X 0 #define SIDE_Y 30 #define SIDE_SIZE_X 96 #define SIDE_SIZE_Y 170 #define SIDE_TEXT_STEP 10 #define SIDE_TEXT_STEP_ZOOM 5 #define TEXT_SPEED 300 void Task_SideText(void *pdata) { S16 i=SIDE_Y+SIDE_SIZE_Y; S16 uCOS_Version; const GUI_FONT *oldfont; GUI_MEMDEV_Handle side_mem; side_mem=GUI_MEMDEV_Create(SIDE_X,SIDE_Y,SIDE_SIZE_X,SIDE_SIZE_Y); GUI_MEMDEV_Select(side_mem); uCOS_Version=OSVersion(); //Uart_Printf("version=%d/n",uCOS_Version); while(1){ //GUI_ClearRect(SIDE_X,SIDE_Y,SIDE_X+SIDE_SIZE_X,SIDE_Y+SIDE_SIZE_Y); //GUI_DrawBitmap(&bmslamdunk1_tiny,0,0); //GUI_DrawBitmap(&bmslamdunk1_tiny,0,i); //GUI_X_Lock(); GUI_Clear(); oldfont=GUI_SetFont(&GUI_Font8x8); GUI_DispStringAt("uc/OS_II",SIDE_X,i); GUI_DispStringAt("uc/GUI",SIDE_X,i+SIDE_TEXT_STEP); GUI_DispStringAt("Version:",SIDE_X,i+SIDE_TEXT_STEP*2); //GUI_DispDecMin(OSCPUUsage); GUI_DispDecMin(uCOS_Version); i=(S16)(i-SIDE_TEXT_STEP/SIDE_TEXT_STEP_ZOOM); //Uart_Printf("i=%d/n",i); if(i<=10){ i=SIDE_Y+SIDE_SIZE_Y; //Uart_Printf("Caution ! i=200/n"); } GUI_MEMDEV_CopyToLCD(side_mem); //GUI_MEMDEV_Select(0); //GUI_X_Unlock(); //GUI_MEMDEV_Delete(hMem); OSTimeDlyHMSM(0,0,0,TEXT_SPEED); } } #define TITLE_X 100 #define TITLE_Y 20 #define TITLE_SIZE_X 200 #define TITLE_SIZE_Y 10 #define TITLE_TEXT_STEP 5 #define TITLE_SPEED 200 void Task_Title(void *pdata) { GUI_MEMDEV_Handle title_mem; S16 i=TITLE_X+TITLE_SIZE_X; title_mem=GUI_MEMDEV_Create(TITLE_X,TITLE_Y,TITLE_SIZE_X,TITLE_SIZE_Y); GUI_MEMDEV_Select(title_mem); while(1){ //Uart_Printf("Task_Title/n"); //GUI_ClearRect(TITLE_X,TITLE_Y,TITLE_X+TITLE_SIZE_X,TITLE_Y+TITLE_SIZE_Y); //GUI_X_Lock(); GUI_Clear(); GUI_DispStringAt("Uart Test,Please Input Characters!",i,20); i=i-TITLE_TEXT_STEP; if(i<=0) i=TITLE_X+TITLE_SIZE_X; GUI_MEMDEV_CopyToLCD(title_mem); //GUI_X_Unlock(); //GUI_MEMDEV_Delete(title_mem); OSTimeDlyHMSM(0,0,0,TITLE_SPEED); } } #define INFO_X 100 #define INFO_Y 150 #define INFO_SIZE_X 200 #define INFO_SIZE_Y 90 #define INFO_STEP 10 void Task_Info(void *pdata) { GUI_MEMDEV_Handle info_mem; S32 Time,Seconds,Minutes,Hours; info_mem=GUI_MEMDEV_Create(INFO_X,INFO_Y,INFO_SIZE_X,INFO_SIZE_Y); GUI_MEMDEV_Select(info_mem); while(1){ //Uart_Printf("Information!/n"); GUI_Clear(); //GUI_ClearRect(INFO_X,INFO_Y,INFO_X+INFO_SIZE_X,INFO_Y+INFO_SIZE_Y); GUI_DispStringAt("Static informaion:",INFO_X,INFO_Y); GUI_DispStringAt("CPU Usage:",INFO_X,INFO_Y+INFO_STEP); GUI_DispDecMin(OSCPUUsage); GUI_DispString("%"); GUI_DispStringAt("Task Switch Times:",INFO_X,INFO_Y+INFO_STEP*2); GUI_DispDecMin(OSTaskCtr); GUI_DispString("/s"); GUI_DispStringAt("System Time:",INFO_X,INFO_Y+INFO_STEP*3); Time=OSTimeGet()/OS_TICKS_PER_SEC; Hours=(Time/3600)%60; Minutes=(Time/60)%60; Seconds=Time % 60; GUI_DispDec(Hours,2); GUI_DispString(":"); GUI_DispDec(Minutes,2); GUI_DispString(":"); GUI_DispDec(Seconds,2); //GUI_DispString(); GUI_MEMDEV_CopyToLCD(info_mem); OSTimeDlyHMSM(0,0,1,0); } } #define BMP_SIZE_X 2 #define BMP_SIZE_Y 2 #define BMP_MEM_SIZE_X 198 #define BMP_MEM_SIZE_Y 98 #define BMP_MEM_X 102 #define BMP_MEM_Y 42 #define BMP_STEP_X 5 #define BMP_STEP_Y 3 void Task_Bmp(void *pdata) { S16 bmp_x,bmp_y; int reb_x=BMP_STEP_X,reb_y=BMP_STEP_Y; GUI_MEMDEV_Handle bmp_mem; bmp_mem=GUI_MEMDEV_Create(BMP_MEM_X,BMP_MEM_Y,BMP_MEM_SIZE_X,BMP_MEM_SIZE_Y); GUI_MEMDEV_Select(bmp_mem); bmp_x=BMP_MEM_X+1; bmp_y=BMP_MEM_Y+1; while(1){ //Uart_Printf("reb_x=%d",reb_x); GUI_Clear(); //GUI_DrawBitmap(&bmslamdunk1_tiny,bmp_x,bmp_y); GUI_FillCircle(bmp_x,bmp_y,2); bmp_x+=reb_x; bmp_y+=reb_y; Uart_Printf("x=%d/t",bmp_x); Uart_Printf("reb_x=%d/t",reb_x); Uart_Printf("y=%d/t",bmp_y); Uart_Printf("reb_y=%d/n",reb_y); if((bmp_x+BMP_SIZE_X)>=(BMP_MEM_X+BMP_MEM_SIZE_X)){ reb_x=-BMP_STEP_X; bmp_x+=reb_x; bmp_x+=reb_x; Uart_Printf("reb_x=%d/n",reb_x); } if(bmp_x<=BMP_MEM_X){ reb_x=BMP_STEP_X; bmp_x+=reb_x; bmp_x+=reb_x; } if((bmp_y+BMP_SIZE_Y)>=(BMP_MEM_Y+BMP_MEM_SIZE_Y)){ reb_y=-BMP_STEP_Y; bmp_y+=reb_y; bmp_y+=reb_y; Uart_Printf("reb_y=%d/n",reb_y); } if(bmp_y<=BMP_MEM_Y){ reb_y=BMP_STEP_Y; bmp_y+=reb_y; bmp_y+=reb_y; } GUI_MEMDEV_CopyToLCD(bmp_mem); OSTimeDlyHMSM(0,0,0,100); } }

你可能感兴趣的:(user,OS,测试,delete,任务,delay)