laoliang-67665 发表于 2013-4-9 22:38:39

UCOS下UCGUI使用方法研究

笔者亮点STM32板子下,首先将UCOS运行起来,然后创建了几个简单的例程
现在需要显示,显示要有界面,于是将UCGUI装进来
建立了几个任务:
int main(void)
{               
INT8Uos_err;
pput=USART1_BUF;
pget=USART1_BUF;
BUFEXCEED=USART1_BUF+RECEBUFSIZE;
bpboard_init();//初始化硬件 增加执行屏幕位置校准
   //bp_selfcheck(1);
GUI_Init();
OSInit(); //初始化UCOS
    GUI_SetBkColor(GUI_WHITE);//设置背景颜色为白色
GUI_FillRect(0,0,480,272);//清屏
os_err = OSTaskCreate((void (*)(void *)) App_TaskStart,// 创建启动任务
                        (void          * ) 0,   
                        (OS_STK      * )&App_TaskStartStk,    //堆栈地址
                        (INT8U         ) APP_TASK_START_PRIO); //优先级3,最高
if (OS_ERR_NONE!=os_err)
{
beep_run(100);
printf("err OSTaskCreate prio:%d result:%d\r\n",APP_TASK_START_PRIO,os_err);
}
os_err = OSTaskCreate((void (*)(void *)) App_TaskTouch,// 创建触摸屏检测任务
                        (void          * ) 0,   
                        (OS_STK      * )&App_TaskTouchStk,    //堆栈地址
                        (INT8U         ) APP_TASK_TOUCH_PRIO); //优先级4
if (OS_ERR_NONE!=os_err)
{
beep_run(100);
printf("err OSTaskCreate prio:%d result:%d\r\n",APP_TASK_TOUCH_PRIO,os_err);
}
os_err = OSTaskCreate((void (*)(void *)) App_TaskDisp,
                        (void          * ) 0,
                        (OS_STK      * )&App_TaskDispStk,
                        (INT8U         ) APP_TASK_DISP_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskProc,
                        (void          * ) 0,
                        (OS_STK      * )&App_TaskProcStk,
                        (INT8U         ) APP_TASK_PROC_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskTest,                           
                        (void          * ) 0,
                        (OS_STK      * )&App_TaskTestStk,
                        (INT8U         ) APP_TASK_TEST_PRIO);

OSStart();
return(0);
}
App_TaskTouch是屏幕触摸任务,获得触摸信息后调用 GUI_TOUCH_Exec()这个函数,然后一定要调用OSTimeDly(10)来阻塞自己哦,否则系统崩溃对吧?
staticvoidApp_TaskTouch(void *p_arg)
{
//OSTimeDly(100);
    while (1)
    {
      //RA8875_WAITSTATUS();
   //if(ISDEBUG)printf("task touch!\r\n");
tft_gettouchpoint(&TouchX,&TouchY);
      GUI_TOUCH_Exec();
clear_TP_interrupt();//清除RA8875中断标志
      OSTimeDly(10);
    }
}
//任务App_TaskTest调用BP_UCGUI_Task()来显示
staticvoidApp_TaskTest(void *p_arg)
{
    (void)p_arg;
   BP_UCGUI_Task();
    while(1);
}

void BP_UCGUI_Task(void) {

WM_HWIN hMainFrame, hClientWindow;
GUI_RECT Rect;
GUI_Init();//GUI 初始化,最先被调用
GUI_CURSOR_Show();//GUI函数,显示游标
//GUI_SetFont(&GUI_FontHZ_SimSun_16); //设置字体

#if GUI_SUPPORT_MEMDEV //使用内存设备
    WM_SetCreateFlags(WM_CF_MEMDEV);
    WM_EnableMemdev(WM_HBKWIN);
#endif

WM_SetDesktopColor(GUI_BLACK); //设置背景颜色 黑在GUI.H中定义

//在背景之上,创建并执行第一个对话框
GUI_ExecDialogBox(_aIntro, GUI_COUNTOF(_aIntro), _cbIntro, WM_HBKWIN, 0, 0);
//GUI_ExecDialogBox(_MainDialogCreate, GUI_COUNTOF(_MainDialogCreate), _MainCallback, WM_HBKWIN, 0, 0);
//按START之后,该窗口关闭
//Showain();



hMainFrame = FRAMEWIN_CreateEx(0, 0, LCD_XSIZE, LCD_YSIZE,
                                 WM_HBKWIN, WM_CF_SHOW, 0, 0, "", 0);
FRAMEWIN_SetTextAlign(hMainFrame, GUI_TA_HCENTER);
hClientWindow = WM_GetClientWindow(hMainFrame);
WM_GetClientRectEx(hClientWindow, &Rect);      
hClientWindow=WM_HBKWIN;

_hDialogMain=
GUI_CreateDialogBox(_MainDialogCreate, GUI_COUNTOF(_MainDialogCreate), _MainCallback, hClientWindow, 0, 0);
_hDialogControl=
GUI_CreateDialogBox(_ControlDialogCreate, GUI_COUNTOF(_ControlDialogCreate), _ControlCallback, hClientWindow, Rect.x1 - 60, 0);
_hDialogPower=
GUI_CreateDialogBox(_PowerDialogCreate, GUI_COUNTOF(_ControlDialogCreate), _PowerCallback, hClientWindow, 0, 0);
//WM_ShowWindow(_hDialogMain);
WM_HideWindow(_hDialogPower);
while(1) {
    WM_Exec(); //这里开始消息循环
    GUI_X_WAIT_EVENT();
}
}
注意:WM_Exec()开始消息循环,然后还是要OSTimeDly来阻塞自己
这里会GUI_X_WAIT_EVENT()会调用OSTimeDly(50)!;

总结一下:无论什么任务,除非是优先级最低的,都不要无限制的利用资源
RTOS不是让你去想办法充分利用资源,而是想办法让每个任务去充分睡觉休息,让系统空闲下来,这个系统才能够充分的运行,这是才能更好的享受资源。

liguohong327 发表于 2015-1-24 09:42:35

顶一个,非常好的东西

one棉花糖one 发表于 2014-12-7 18:53:46

我是来赚铜板的:lol

广-402457 发表于 2014-10-26 21:52:05

顶一个~~~~~~~~~~~~~~~~

sky-Hawk where 发表于 2014-9-8 18:15:51

顶一下,这个需要学习,一直想搞ucos

szp人贩子 发表于 2014-8-21 21:17:05

:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol

franki 发表于 2014-8-14 11:01:50

顶一个      学习啦   

weijintiger 发表于 2014-6-17 05:56:38

好东西谢谢啦!

feel-123 发表于 2014-6-12 06:34:43

谢谢楼主分享

feel-123 发表于 2014-6-12 06:34:16

谢谢楼主分享
页: [1] 2 3
查看完整版本: UCOS下UCGUI使用方法研究

Baidu
map