29.3 多任务系统:多个任务调用emWin 这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。
29.3.1 uCOS创建三个STemWin任务这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUI
- * 功能说明: GUI任务0
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级:OS_CFG_PRIO_MAX - 6u
- *********************************************************************************************************
- */
- extern void MainTask(void);
- static void AppTask0GUI(void *p_arg)
- {
- (void)p_arg; /* 避免编译器告警 */
- while (1)
- {
- MainTask();
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUI
- * 功能说明: GUI任务1
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级:OS_CFG_PRIO_MAX - 5u
- *********************************************************************************************************
- */
- extern void Task_1(void);
- static void AppTask1GUI(void *p_arg)
- {
- (void)p_arg; /* 避免编译器告警 */
- while (1)
- {
- Task_1();
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskGUI
- * 功能说明: GUI任务2
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级:OS_CFG_PRIO_MAX - 4u
- *********************************************************************************************************
- */
- extern void Task_2(void);
- static void AppTask2GUI(void *p_arg)
- {
- (void)p_arg; /* 避免编译器告警 */
- while (1)
- {
- Task_2();
- }
- }
复制代码
29.3.2 STemWin任务建立的三个任务所在文件夹:
MainTask文件中的任务:
- #include "includes.h"
- #include "MainTask.h"
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallbackT0
- * 功能说明: 任务0的回调函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbCallbackT0(WM_MESSAGE * pMsg)
- {
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- /* Handle the paint message */
- GUI_SetBkColor(GUI_RED);
- GUI_SetColor(GUI_BLACK);
- GUI_SetFont(&GUI_FontComic24B_ASCII);
- GUI_Clear();
- GUI_DispStringAt("Task0 Moving", 0, 0);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbBackgroundWin
- * 功能说明: 背景窗口的回调函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbBackgroundWin(WM_MESSAGE* pMsg)
- {
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- /* Handle only the paint message */
- GUI_SetBkColor(0x00CC00);
- GUI_Clear();
- GUI_SetFont(&GUI_Font24_ASCII);
- GUI_DispStringHCenterAt("STemWin - multitasking demon", 159, 5);
- GUI_SetFont(&GUI_Font13_1);
- GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35);
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: Task_0
- * 功能说明: GUI任务0
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void Task_0(void)
- {
- /* Create frame window */
- FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0", NULL, WM_CF_SHOW | WM_CF_STAYONTOP, 0, 230, 200,
- 40);
- /* Create child window */
- WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
- WM_CF_SHOW | WM_CF_MEMDEV, _cbCallbackT0, 0);
- FRAMEWIN_SetActive(hFrameWin, 0);
- /* Make sure the right window is active... */
- WM_SelectWindow(hChildWin);
- /* ...and the right font is selected */
- GUI_SetFont(&GUI_FontComic24B_ASCII);
- while(1)
- {
- int i;
- int nx = 80;
- /* Move window continously */
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, 2, 0);
- GUI_Delay(50);
- }
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, -2, 0);
- GUI_Delay(50);
- }
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: MainTask
- * 功能说明: GUI任务0
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void MainTask(void)
- {
- GUI_Init();
- WM_SetCreateFlags(WM_CF_MEMDEV);
- WM_SetCallback(WM_HBKWIN, _cbBackgroundWin);
- while(1)
- {
- Task_0();
- }
- }
复制代码
App_Task1中的内容:
- #include "includes.h"
- #include "MainTask.h"
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallbackT1
- * 功能说明: 任务1的回调函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbCallbackT1(WM_MESSAGE * pMsg)
- {
- WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- /* Handle the paint message */
- GUI_SetBkColor(GUI_BLUE);
- GUI_SetColor(GUI_WHITE);
- GUI_SetFont(&GUI_FontComic24B_ASCII);
- GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
- GUI_Clear();
- GUI_DispStringHCenterAt("Task1 window...",
- WM_GetWindowSizeX(hWin) / 2,
- WM_GetWindowSizeY(hWin) / 2);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: Task_1
- * 功能说明: GUI任务0
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void Task_1(void)
- {
- /* Create frame window */
- FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP,
- 20, 170, 200, 40);
- /* Create child window */
- WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW |
- WM_CF_MEMDEV,_cbCallbackT1, 0);
- FRAMEWIN_SetActive(hFrameWin, 0);
- while(1)
- {
- int i;
- int nx = 80;
- int ny = 90;
- /* Move window continously */
- for (i = 0; i < ny; i++)
- {
- WM_MoveWindow(hFrameWin, 0, -2);
- GUI_Delay(50);
- }
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, 2, 0);
- GUI_Delay(50);
- }
- for (i = 0; i < ny; i++)
- {
- WM_MoveWindow(hFrameWin, 0, 2);
- GUI_Delay(50);
- }
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, -2, 0);
- GUI_Delay(50);
- }
- }
- }
复制代码
App_Task2中的内容:
- #include "includes.h"
- #include "MainTask.h"
-
- /*
- *********************************************************************************************************
- * 函 数 名: _cbCallbackT2
- * 功能说明: 任务2的回调函数
- * 形 参:pMsg 消息指针
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void _cbCallbackT2(WM_MESSAGE * pMsg)
- {
- switch (pMsg->MsgId)
- {
- case WM_PAINT:
- /* Handle the paint message */
- GUI_SetBkColor(GUI_YELLOW);
- GUI_SetColor(GUI_BLACK);
- GUI_SetFont(&GUI_FontComic24B_ASCII);
- GUI_Clear();
- GUI_DispStringAt("Task2 Moving", 0, 0);
- break;
- default:
- WM_DefaultProc(pMsg);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: Task_2
- * 功能说明: GUI任务0
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void Task_2(void)
- {
- /* Create frame window */
- FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 2", NULL, WM_CF_SHOW | WM_CF_STAYONTOP, 0, 190, 200, 40);
- /* Create child window */
- WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
- WM_CF_SHOW | WM_CF_MEMDEV, _cbCallbackT2, 0);
- FRAMEWIN_SetActive(hFrameWin, 0);
- /* Make sure the right window is active... */
- WM_SelectWindow(hChildWin);
- /* ...and the right font is selected */
- GUI_SetFont(&GUI_FontComic24B_ASCII);
- while(1)
- {
- int i;
- int nx = 80;
- /* Move window continously */
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, 2, 0);
- GUI_Delay(50);
- }
- for (i = 0; i < nx; i++)
- {
- WM_MoveWindow(hFrameWin, -2, 0);
- GUI_Delay(50);
- }
- }
- }
复制代码
这个例子的整体显示效果如下: |