TA的每日心情 | 开心 2018-1-8 15:51 |
---|
签到天数: 22 天 连续签到: 1 天 [LV.4]偶尔看看III
|
笔者亮点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不是让你去想办法充分利用资源,而是想办法让每个任务去充分睡觉休息,让系统空闲下来,这个系统才能够充分的运行,这是才能更好的享受资源。
|
|