1赞

24回答

0收藏

UCOS下UCGUI使用方法研究

 

#开源分享 #开源分享 9856 人阅读 | 24 人回复 | 2013-04-09

笔者亮点STM32板子下,首先将UCOS运行起来,然后创建了几个简单的例程
现在需要显示,显示要有界面,于是将UCGUI装进来
建立了几个任务:
int main(void)
{               
INT8U  os_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[APP_TASK_START_STK_SIZE - 1],    //堆栈地址
                          (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[APP_TASK_TOUCH_STK_SIZE - 1],    //堆栈地址
                          (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[APP_TASK_DISP_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_DISP_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskProc,
                          (void          * ) 0,
                          (OS_STK        * )&App_TaskProcStk[APP_TASK_PROC_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_PROC_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskTest,                             
                          (void          * ) 0,
                          (OS_STK        * )&App_TaskTestStk[APP_TASK_TEST_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_TEST_PRIO);  

OSStart();
return(0);
}
App_TaskTouch是屏幕触摸任务,获得触摸信息后调用 GUI_TOUCH_Exec()这个函数,然后一定要调用OSTimeDly(10)来阻塞自己哦,否则系统崩溃对吧?
static  void  App_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()来显示
static  void  App_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不是让你去想办法充分利用资源,而是想办法让每个任务去充分睡觉休息,让系统空闲下来,这个系统才能够充分的运行,这是才能更好的享受资源。
关注下面的标签,发现更多相似文章
嵌入式,ucos,FPGA系统书籍作者
分享到:
回复

使用道具 举报

回答|共 24 个

倒序浏览

沙发

bygood

发表于 2013-4-24 14:41:50 | 只看该作者

这么好的原创文章怎么没有顶的?
板凳

MMzhang-319191

发表于 2013-5-8 09:36:05 | 只看该作者

顶一个                                         
心中有曲自然嗨!!!
地板

阳光天蓝色

发表于 2013-9-14 12:50:39 | 只看该作者

顶一个,很难找到合适的uCGUI和uCOSII的资料和讲解
5#

fj1161

发表于 2013-9-16 16:32:18 | 只看该作者

顶一个~~~~~~~~~~~~
第五年了,这次一定要坚持到底,不留遗憾!!!
6#

看妹不醉

发表于 2014-1-4 20:50:29 | 只看该作者

顶一个!
7#

735054479_3015043

发表于 2014-1-6 08:31:48 | 只看该作者

:lol:lol:lol:lol:lol
8#

chexuan123

发表于 2014-1-7 09:03:24 | 只看该作者

好帖要顶起
9#

lixupengic

发表于 2014-1-14 13:08:21 | 只看该作者

收下!!谢谢
10#

lsg120110

发表于 2014-2-14 17:04:29 | 只看该作者

顶亮哥。我的偶像
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条