硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5772|回复: 0
收起左侧

[emWin教程入门篇] 【STemWin教程】第29章 STemWin多任务(uCOS-III)

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-2-11 14:56:51 | 显示全部楼层 |阅读模式
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第29章 STemWin多任务(uCOS-III)

    本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
     29. 1  单任务系统(超级循环)
     29. 2 多任务系统:一个任务调用emWin
     29. 3 多任务系统:多个任务调用emWin
     29. 4 总结

29.1 单任务系统(超级循环)
    工程代码的结构如下:
29.1.png

    关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。

29.1.1 内核接口
    内核接口文件GUI_X.C内容如下:
  1. ----------------------------------------------------------------------
  2. File        : GUI_X.C
  3. Purpose     : Config / System dependent externals for GUI
  4. ---------------------------END-OF-HEADER------------------------------
  5. */
  6. #include "GUI.h"
  7. #include "stm32f4xx.h"
  8. /*********************************************************************
  9. *
  10. *      Timing:
  11. *                 GUI_X_GetTime()
  12. *                 GUI_X_Delay(int)
  13.   Some timing dependent routines require a GetTime
  14.   and delay function. Default time unit (tick), normally is
  15.   1 ms.
  16. */
  17. extern __IO int32_t g_iRunTime;(1)
  18. int GUI_X_GetTime(void)(2)
  19. {
  20. return g_iRunTime;
  21. }
  22. void GUI_X_Delay(int ms)(3)
  23. {
  24. int tEnd = g_iRunTime + ms;
  25. while ((tEnd - g_iRunTime) > 0);
  26. }
  27. /*********************************************************************
  28. *
  29. *       GUI_X_Init()
  30. *
  31. * Note:
  32. *     GUI_X_Init() is called from GUI_Init is a possibility to init
  33. *     some hardware which needs to be up and running before the GUI.
  34. *     If not required, leave this routine blank.
  35. */
  36. void GUI_X_Init(void) {}
  37. /*********************************************************************
  38. *
  39. *       GUI_X_ExecIdle
  40. *
  41. * Note:
  42. *  Called if WM is in idle state
  43. */
  44. void GUI_X_ExecIdle(void) {}
  45. /*********************************************************************
  46. *
  47. *      Logging: OS dependent
  48. Note:
  49.   Logging is used in higher debug levels only. The typical target
  50.   build does not use logging and does therefor not require any of
  51.   the logging routines below. For a release build without logging
  52.   the routines below may be eliminated to save some space.
  53.   (If the linker is not function aware and eliminates unreferenced
  54.   functions automatically)
  55. */
  56. void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }
  57. void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
  58. void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
复制代码
1. 时间基准全局变量,这个变量在bsp_timer.c文件里面进行了定义,由嘀嗒定时器中断进行调用,每1ms调用一次。
  1. /*
  2. 全局运行时间,单位1ms
  3. 最长可以表示 24.85天,如果你的产品连续运行时间超过这个数,则必须考虑溢出问题
  4. */
  5. __IO int32_t g_iRunTime = 0;
  6. /*
  7. *********************************************************************************************************
  8. *    函 数 名: SysTick_ISR
  9. *    功能说明: SysTick中断服务程序,每隔1ms进入1次
  10. *    形    参:  无
  11. *    返 回 值: 无
  12. *********************************************************************************************************
  13. */
  14. void SysTick_ISR(void)
  15. {
  16. static uint8_t s_count = 0;
  17. uint8_t i;
  18. /* 每隔1ms进来1次 (仅用于 bsp_DelayMS) */
  19. if (s_uiDelayCount > 0)
  20. {
  21. if (--s_uiDelayCount == 0)
  22. {
  23. s_ucTimeOutFlag = 1;
  24. }
  25. }
  26. /* 每隔1ms,对软件定时器的计数器进行减一操作 */
  27. for (i = 0; i < TMR_COUNT; i++)
  28. {
  29. bsp_SoftTimerDec(&s_tTmr[i]);
  30. }
  31. /* 全局运行时间每1ms增1 */
  32. g_iRunTime++;
  33. if (g_iRunTime == 0x7FFFFFFF)    /* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF */
  34. {
  35. g_iRunTime = 0;
  36. }
  37. bsp_RunPer1ms();     /* 每隔1ms调用一次此函数,此函数在 bsp.c */
  38. if (++s_count >= 10)
  39. {
  40. s_count = 0;
  41. bsp_RunPer10ms();    /* 每隔10ms调用一次此函数,此函数在 bsp.c */
  42. }
  43. }
复制代码

2. 供STemWin调用的接口函数,用于获取系统时钟基准。
3. 供STemWin调用的接口函数,用于延迟时间设置。
4. 主要设置上面两个函数即可,其余函数根据需要进行配置。

29.1.2 触摸接口
    触摸部分由嘀嗒定时器中周期性的调用:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_RunPer10ms
  4. *    功能说明: 该函数每隔10ms被调用1次。在bsp_timer.c的定时中断调用。主要用于硬件事件检测
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. extern __IO uint8_t s_ucRA8875BusyNow;
  10. void bsp_RunPer10ms(void)
  11. {
  12. /* RA8875 触摸*/
  13. if (g_ChipID == IC_8875)
  14. {
  15.     /* 资源共享标志 */
  16. if(s_ucRA8875BusyNow == 0)
  17. {
  18. GUI_TOUCH_Exec();
  19. }
  20. }
  21. /* XPT2046 */
  22. else
  23. {
  24. GUI_TOUCH_Exec();
  25. }
  26. }
复制代码

29.1.3 主程序
在文件main.c
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: c程序入口
  5. *    形    参:无
  6. *    返 回 值: 错误代码(无需处理)
  7. *********************************************************************************************************
  8. */
  9. int main(void)
  10. {
  11. bsp_Init();    /* 为了是main函数看起来更简洁些,我们将硬件初始化的代码封装到这个函数 */
  12. MainTask();
  13. }
复制代码
在文件MainTask.c
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: c程序入口
  5. *    形    参:无
  6. *    返 回 值: 错误代码(无需处理)
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11. int xPos;
  12. int yPos;
  13. int xSize;
  14. int i;
  15. i = 0;
  16. /* 初始化 */
  17. GUI_Init();
  18. /* 获取要显示的X,Y坐标 */
  19. xPos = LCD_GetXSize() / 2;
  20. yPos = LCD_GetYSize() / 3;
  21. /* 设置文本显示模式 */
  22. GUI_SetTextMode(GUI_TM_REV);
  23. /* 设置显示字体 */
  24. GUI_SetFont(GUI_FONT_20F_ASCII);
  25. GUI_DispStringHCenterAt("Hello world!", xPos, yPos);
  26. /* 设置显示数字字体 */
  27. GUI_SetFont(GUI_FONT_D24X32);
  28. /* 获取显示0000,在字体GUI_FONT_D24X32下的显示情况 */
  29. xSize = GUI_GetStringDistX("0000");
  30. /* 设置显示位置 */
  31. xPos -= xSize / 2;
  32. yPos += 24 + 10;
  33. while (1)
  34. {
  35. GUI_DispDecAt( i++, xPos, yPos, 4);
  36. if (i > 9999)
  37. {
  38. i = 0;
  39. }
  40. }
  41. }
复制代码
功能比较简单,实现效果如下:
29.2.png


29.2 多任务系统:一个任务调用emWin
    前面几期教程配套的例子都是采用的这种方式,实现这种方式也是分为三部分

29.2.1 内核接口
    内核接口文件GUI_X.C内容如下:
  1. #include <app_cfg.h>
  2. #include <includes.h>
  3. #include "GUI_Private.H"
  4. #include "stdio.H"
  5. /*
  6. *********************************************************************************************************
  7. *                                         GLOBAL VARIABLES
  8. *********************************************************************************************************
  9. */
  10. static  OS_SEM  DispSem;
  11. static  OS_SEM  EventSem;
  12. static  OS_SEM  KeySem;
  13. static  int     KeyPressed;
  14. static  char    KeyIsInited;
  15. /*
  16. *********************************************************************************************************
  17. *                                        TIMING FUNCTIONS
  18. *
  19. * Notes: Some timing dependent routines of uC/GUI require a GetTime and delay funtion.
  20. *        Default time unit (tick), normally is 1 ms.
  21. *********************************************************************************************************
  22. */
  23. int  GUI_X_GetTime (void) (1)
  24. {
  25.     OS_ERR      err;
  26. return OSTimeGet(&err);
  27. }
  28. void  GUI_X_Delay (int period) (2)
  29. {
  30.   OS_ERR      err;
  31.   OSTimeDly(period, OS_OPT_TIME_DLY, &err);
  32. }
  33. /*
  34. *********************************************************************************************************
  35. *                                          GUI_X_ExecIdle()
  36. *********************************************************************************************************
  37. */
  38. void GUI_X_ExecIdle (void) (3)
  39. {
  40.     GUI_X_Delay(1);
  41. }
  42. /*
  43. *********************************************************************************************************
  44. *                                    MULTITASKING INTERFACE FUNCTIONS
  45. *
  46. * Note(1): 1) The following routines are required only if uC/GUI is used in a true multi task environment,
  47. *             which means you have more than one thread using the uC/GUI API.  In this case the #define
  48. *             GUI_OS 1   needs to be in GUIConf.h
  49. *********************************************************************************************************
  50. */
  51. void  GUI_X_InitOS (void)(4)
  52. {
  53. OS_ERR     err;
  54. /* 用于资源共享 cnt = 1*/
  55.     OSSemCreate((OS_SEM    *)&DispSem,
  56.                 (CPU_CHAR  *)"DispSem",
  57.                 (OS_SEM_CTR )1,
  58.                 (OS_ERR    *)&err);
  59. /* 用于事件触发 cnt = 0*/
  60. OSSemCreate((OS_SEM    *)&EventSem,
  61.                 (CPU_CHAR  *)"EventSem",
  62.                 (OS_SEM_CTR )0,
  63.                 (OS_ERR    *)&err);
  64. }
  65. void  GUI_X_Lock (void)(5)
  66. {
  67. OS_ERR     err;
  68. OSSemPend((OS_SEM *)&DispSem,
  69.   (OS_TICK )0,
  70.   (OS_OPT  )OS_OPT_PEND_BLOCKING,
  71.   (CPU_TS  )0,
  72.   (OS_ERR *)&err);
  73. }
  74. void  GUI_X_Unlock (void)(6)
  75. {
  76. OS_ERR     err;
  77. OSSemPost((OS_SEM *)&DispSem,
  78.           (OS_OPT  )OS_OPT_POST_1,
  79.           (OS_ERR *)&err);
  80. }
  81. U32  GUI_X_GetTaskId (void) (7)
  82. {
  83.     //由于存在同优先级的任务,这里不知道是不是可以
  84. //uCOS-III中已经没有任务的ID
  85. return ((U32)(OSTCBCurPtr->Prio));
  86. }
  87. /*
  88. *********************************************************************************************************
  89. *                                        GUI_X_WaitEvent()
  90. *                                        GUI_X_SignalEvent()
  91. *********************************************************************************************************
  92. */
  93. void GUI_X_WaitEvent (void) (8)
  94. {
  95. OS_ERR     err;
  96. OSSemPend((OS_SEM *)&EventSem,
  97. (OS_TICK )0,
  98. (OS_OPT  )OS_OPT_PEND_BLOCKING,
  99. (CPU_TS  )0,
  100. (OS_ERR *)&err);
  101. }
  102. void GUI_X_SignalEvent (void) (9)
  103. {
  104. OS_ERR     err;
  105. OSSemPost((OS_SEM *)&EventSem,
  106.       (OS_OPT  )OS_OPT_POST_1,
  107.       (OS_ERR *)&err);
  108. }
  109. /*
  110. *********************************************************************************************************
  111. *                                      KEYBOARD INTERFACE FUNCTIONS
  112. *
  113. * Purpose: The keyboard routines are required only by some widgets.
  114. *          If widgets are not used, they may be eliminated.
  115. *
  116. * Note(s): If uC/OS-II is used, characters typed into the log window will be placed    in the keyboard buffer.
  117. *          This is a neat feature which allows you to operate your target system without having to use or
  118. *          even to have a keyboard connected to it. (useful for demos !)
  119. *********************************************************************************************************
  120. */
  121. void  CheckInit (void) (10)
  122. {
  123. if (KeyIsInited == DEF_FALSE) {
  124. KeyIsInited = DEF_TRUE;
  125. GUI_X_Init();
  126. }
  127. }
  128. void GUI_X_Init (void)
  129. {
  130. OS_ERR err;
  131. OSSemCreate((OS_SEM    *)&KeySem,
  132. (CPU_CHAR  *)"KeySem",
  133. (OS_SEM_CTR )0,
  134. (OS_ERR    *)&err);
  135. }
  136. int  GUI_X_GetKey (void)
  137. {
  138. int r;
  139. r          = KeyPressed;
  140. CheckInit();
  141. KeyPressed = 0;
  142. return (r);
  143. }
  144. int  GUI_X_WaitKey (void)
  145. {
  146. int    r;
  147. OS_ERR err;
  148. CheckInit();
  149. if (KeyPressed == 0) {   
  150. OSSemPend((OS_SEM *)&EventSem,
  151. (OS_TICK )0,
  152. (OS_OPT  )OS_OPT_PEND_BLOCKING,
  153. (CPU_TS  )0,
  154. (OS_ERR *)&err);
  155. }
  156. r          = KeyPressed;
  157. KeyPressed = 0;
  158. return (r);
  159. }
  160. void  GUI_X_StoreKey (int k)
  161. {
  162. OS_ERR     err;
  163. KeyPressed = k;
  164. OSSemPost((OS_SEM *)&KeySem,
  165.       (OS_OPT  )OS_OPT_POST_1,
  166.       (OS_ERR *)&err);
  167. }
  168. void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }(11)
  169. void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
  170. void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
复制代码
1. 用于给系统提供时间基准。
2. 用于实现延迟。
3. 用于执行空闲的调用。
4. 创建两个信号量,一个用于资源的共享,另一个用于事件的同步。
5. 这个函数用于锁定GUI,此函数在GUI访问显示器之前或在使用关键内部数据结构之前由GUI调用,它使用资源信号量/互斥体阻止其它线程进入同一临界区,直到GUI_X_Unlock()已被调用。
6. 这个函数用于解锁GUI,此函数在访问显示器之后或在使用关键内部数据结构之后由GUI调用。在使用实时操作系统时,通常必须减量计数资源信号量。
7. 用于返回当前任务的唯一ID。只要返回值对于使用emWin API的每个任务/线程是唯一的,且只要该值对于每个特定线程始终相同,则返回值是多少并不重要。
8. 用于等待事件。
9. 用于释放事件。
10. 这个里面的几个函数用实现按键接口函数。通过创建信号量来实现同步功能。
11. 这三个函数用调试目的。

29.2.2 触摸任务
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskGUIRefresh
  4. *    功能说明: emWin刷新函数
  5. *    形    参:p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7. *   优 先 级:OS_CFG_PRIO_MAX - 3u
  8. *********************************************************************************************************
  9. */
  10. extern __IO uint8_t s_ucRA8875BusyNow;
  11. static void AppTaskGUIRefresh(void *p_arg)
  12. {
  13.     (void)p_arg;     /* 避免编译器告警 */
  14. while (1)
  15. {
  16. /* RA8875 触摸*/
  17. if (g_ChipID == IC_8875)
  18. {
  19.     /* 资源共享标志 */
  20. if(s_ucRA8875BusyNow == 0)
  21. {
  22. GUI_TOUCH_Exec();
  23. }
  24. }
  25. /* XPT2046 */
  26. else
  27. {
  28. GUI_TOUCH_Exec();
  29. }
  30. BSP_OS_TimeDlyMs(20);
  31. }
  32. }
复制代码

29.2.3 STemWin任务


  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: MainTask
  4. *    功能说明: GUI主函数
  5. *    形    参:无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void MainTask(void)
  10. {
  11.     GUI_Init();
  12.     GUI_SetTextMode(GUI_TM_TRANS);
  13.     for (i = 0; i < 3; i++)
  14.     {
  15.         GUI_SetColor(GUI_BLUE);
  16.         GUI_FillRectEx(&Rect);
  17.         GUI_SetColor(GUI_WHITE);
  18.         GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
  19.         Rect.x0 += 60;
  20.         Rect.x1 += 60;
  21.     }
  22.     while (1)
  23.     {
  24.         GUI_Delay(10);
  25.     }
  26. }
复制代码
这个例子整体的显示效果如下:
29.3.png


29.3 多任务系统:多个任务调用emWin
    这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。

29.3.1 uCOS创建三个STemWin任务
这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskGUI
  4. *    功能说明: GUI任务0
  5. *    形    参:p_arg 是在创建该任务时传递的形参
  6. *    返 回 值: 无
  7. *   优 先 级:OS_CFG_PRIO_MAX - 6u
  8. *********************************************************************************************************
  9. */
  10. extern void MainTask(void);
  11. static void AppTask0GUI(void *p_arg)
  12. {
  13.     (void)p_arg;     /* 避免编译器告警 */
  14. while (1)
  15. {
  16. MainTask();
  17. }
  18. }
  19. /*
  20. *********************************************************************************************************
  21. *    函 数 名: AppTaskGUI
  22. *    功能说明: GUI任务1
  23. *    形    参:p_arg 是在创建该任务时传递的形参
  24. *    返 回 值: 无
  25. *   优 先 级:OS_CFG_PRIO_MAX - 5u
  26. *********************************************************************************************************
  27. */
  28. extern void Task_1(void);
  29. static void AppTask1GUI(void *p_arg)
  30. {
  31.     (void)p_arg;     /* 避免编译器告警 */
  32. while (1)
  33. {
  34. Task_1();
  35. }
  36. }
  37. /*
  38. *********************************************************************************************************
  39. *    函 数 名: AppTaskGUI
  40. *    功能说明: GUI任务2
  41. *    形    参:p_arg 是在创建该任务时传递的形参
  42. *    返 回 值: 无
  43. *   优 先 级:OS_CFG_PRIO_MAX - 4u
  44. *********************************************************************************************************
  45. */
  46. extern void Task_2(void);
  47. static void AppTask2GUI(void *p_arg)
  48. {
  49.     (void)p_arg;     /* 避免编译器告警 */
  50. while (1)
  51. {
  52. Task_2();
  53. }
  54. }
复制代码

29.3.2 STemWin任务
建立的三个任务所在文件夹:
29.4.png

MainTask文件中的任务:
  1. #include "includes.h"
  2. #include "MainTask.h"
  3. /*
  4. *********************************************************************************************************
  5. *    函 数 名: _cbCallbackT0
  6. *    功能说明: 任务0的回调函数
  7. *    形    参:pMsg  消息指针
  8. *    返 回 值: 无
  9. *********************************************************************************************************
  10. */
  11. static void _cbCallbackT0(WM_MESSAGE * pMsg)
  12. {
  13. switch (pMsg->MsgId)
  14. {
  15. case WM_PAINT:
  16. /* Handle the paint message */
  17. GUI_SetBkColor(GUI_RED);
  18. GUI_SetColor(GUI_BLACK);
  19. GUI_SetFont(&GUI_FontComic24B_ASCII);
  20. GUI_Clear();
  21. GUI_DispStringAt("Task0 Moving", 0, 0);
  22. break;
  23. default:
  24. WM_DefaultProc(pMsg);
  25. }
  26. }
  27. /*
  28. *********************************************************************************************************
  29. *    函 数 名: _cbBackgroundWin
  30. *    功能说明: 背景窗口的回调函数
  31. *    形    参:pMsg  消息指针
  32. *    返 回 值: 无
  33. *********************************************************************************************************
  34. */
  35. static void _cbBackgroundWin(WM_MESSAGE* pMsg)
  36. {
  37. switch (pMsg->MsgId)
  38. {
  39. case WM_PAINT:
  40. /* Handle only the paint message */
  41. GUI_SetBkColor(0x00CC00);
  42. GUI_Clear();
  43. GUI_SetFont(&GUI_Font24_ASCII);
  44. GUI_DispStringHCenterAt("STemWin - multitasking demo\n", 159, 5);
  45. GUI_SetFont(&GUI_Font13_1);
  46. GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35);
  47. default:
  48. WM_DefaultProc(pMsg);
  49. }
  50. }
  51. /*
  52. *********************************************************************************************************
  53. *    函 数 名: Task_0
  54. *    功能说明: GUI任务0
  55. *    形    参:无
  56. *    返 回 值: 无
  57. *********************************************************************************************************
  58. */
  59. void Task_0(void)
  60. {
  61. /* Create frame window */
  62. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 230, 200,
  63. 40);
  64. /* Create child window */
  65. WM_HWIN      hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
  66.   WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT0, 0);
  67. FRAMEWIN_SetActive(hFrameWin, 0);
  68. /* Make sure the right window is active... */
  69. WM_SelectWindow(hChildWin);
  70. /* ...and the right font is selected */
  71. GUI_SetFont(&GUI_FontComic24B_ASCII);
  72. while(1)
  73. {
  74. int i;
  75. int nx = 80;
  76. /* Move window continously */
  77. for (i = 0; i < nx; i++)
  78. {
  79. WM_MoveWindow(hFrameWin, 2, 0);
  80. GUI_Delay(50);
  81. }
  82. for (i = 0; i < nx; i++)
  83. {
  84. WM_MoveWindow(hFrameWin, -2, 0);
  85. GUI_Delay(50);
  86. }
  87. }
  88. }
  89. /*
  90. *********************************************************************************************************
  91. *    函 数 名: MainTask
  92. *    功能说明: GUI任务0
  93. *    形    参:无
  94. *    返 回 值: 无
  95. *********************************************************************************************************
  96. */
  97. void MainTask(void)
  98. {
  99. GUI_Init();
  100. WM_SetCreateFlags(WM_CF_MEMDEV);              
  101. WM_SetCallback(WM_HBKWIN, _cbBackgroundWin);
  102. while(1)
  103. {
  104. Task_0();
  105. }
  106. }
复制代码
App_Task1中的内容:
  1. #include "includes.h"
  2. #include "MainTask.h"
  3. /*
  4. *********************************************************************************************************
  5. *    函 数 名: _cbCallbackT1
  6. *    功能说明: 任务1的回调函数
  7. *    形    参:pMsg  消息指针
  8. *    返 回 值: 无
  9. *********************************************************************************************************
  10. */
  11. static void _cbCallbackT1(WM_MESSAGE * pMsg)
  12. {
  13. WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);
  14. switch (pMsg->MsgId)
  15. {
  16. case WM_PAINT:
  17. /* Handle the paint message */
  18. GUI_SetBkColor(GUI_BLUE);
  19. GUI_SetColor(GUI_WHITE);
  20. GUI_SetFont(&GUI_FontComic24B_ASCII);
  21. GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
  22. GUI_Clear();
  23. GUI_DispStringHCenterAt("Task1 window...",
  24. WM_GetWindowSizeX(hWin) / 2,
  25. WM_GetWindowSizeY(hWin) / 2);
  26. break;
  27. default:
  28. WM_DefaultProc(pMsg);
  29. }
  30. }
  31. /*
  32. *********************************************************************************************************
  33. *    函 数 名: Task_1
  34. *    功能说明: GUI任务0
  35. *    形    参:无
  36. *    返 回 值: 无
  37. *********************************************************************************************************
  38. */
  39. void Task_1(void)
  40. {
  41. /* Create frame window */
  42. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP,
  43. 20, 170, 200, 40);
  44. /* Create child window */
  45. WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW |
  46. WM_CF_MEMDEV,_cbCallbackT1, 0);
  47. FRAMEWIN_SetActive(hFrameWin, 0);
  48. while(1)
  49. {
  50. int i;
  51. int nx = 80;
  52. int ny = 90;
  53. /* Move window continously */
  54. for (i = 0; i < ny; i++)
  55. {
  56. WM_MoveWindow(hFrameWin, 0, -2);
  57. GUI_Delay(50);
  58. }
  59. for (i = 0; i < nx; i++)
  60. {
  61. WM_MoveWindow(hFrameWin, 2, 0);
  62. GUI_Delay(50);
  63. }
  64. for (i = 0; i < ny; i++)
  65. {
  66. WM_MoveWindow(hFrameWin, 0, 2);
  67. GUI_Delay(50);
  68. }
  69. for (i = 0; i < nx; i++)
  70. {
  71. WM_MoveWindow(hFrameWin, -2, 0);
  72. GUI_Delay(50);
  73. }
  74. }
  75. }
复制代码
App_Task2中的内容:
  1. #include "includes.h"
  2. #include "MainTask.h"
  3. /*
  4. *********************************************************************************************************
  5. *    函 数 名: _cbCallbackT2
  6. *    功能说明: 任务2的回调函数
  7. *    形    参:pMsg  消息指针
  8. *    返 回 值: 无
  9. *********************************************************************************************************
  10. */
  11. static void _cbCallbackT2(WM_MESSAGE * pMsg)
  12. {
  13. switch (pMsg->MsgId)
  14. {
  15. case WM_PAINT:
  16. /* Handle the paint message */
  17. GUI_SetBkColor(GUI_YELLOW);
  18. GUI_SetColor(GUI_BLACK);
  19. GUI_SetFont(&GUI_FontComic24B_ASCII);
  20. GUI_Clear();
  21. GUI_DispStringAt("Task2 Moving", 0, 0);
  22. break;
  23. default:
  24. WM_DefaultProc(pMsg);
  25. }
  26. }
  27. /*
  28. *********************************************************************************************************
  29. *    函 数 名: Task_2
  30. *    功能说明: GUI任务0
  31. *    形    参:无
  32. *    返 回 值: 无
  33. *********************************************************************************************************
  34. */
  35. void Task_2(void)
  36. {
  37. /* Create frame window */
  38. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 2",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 190, 200, 40);
  39. /* Create child window */
  40. WM_HWIN         hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
  41. WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT2, 0);
  42. FRAMEWIN_SetActive(hFrameWin, 0);
  43. /* Make sure the right window is active... */
  44. WM_SelectWindow(hChildWin);
  45. /* ...and the right font is selected */
  46. GUI_SetFont(&GUI_FontComic24B_ASCII);
  47. while(1)
  48. {
  49. int i;
  50. int nx = 80;
  51. /* Move window continously */
  52. for (i = 0; i < nx; i++)
  53. {
  54. WM_MoveWindow(hFrameWin, 2, 0);
  55. GUI_Delay(50);
  56. }
  57. for (i = 0; i < nx; i++)
  58. {
  59. WM_MoveWindow(hFrameWin, -2, 0);
  60. GUI_Delay(50);
  61. }
  62. }
  63. }
复制代码
这个例子的整体显示效果如下:
29.5.png

29.4 总结
     本期教程就跟大家讲这么多,希望通过创建的这三个DEMO让大家对STemWin创建裸机或者多任务系统有个整体认识,具体工程中用那种方式要根据实际的需求来决定。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 06:01 , Processed in 0.240060 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表