你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第29章 STemWin多任务(ucos-III)

[复制链接]
baiyongbin2009 发布时间:2015-2-12 14:32
本帖最后由 baiyongbin2009 于 2015-2-12 14:38 编辑 ( n2 R1 f% t% P8 x* n. [; i
& A0 @* |; ~/ `7 d
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
' F9 H: w) d$ B8 L) p; c3 |
第29章 STemWin多任务(uCOS-III)
$ S  O7 R+ s3 t
    本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
    29. 1  单任务系统(超级循环)
    29. 2 多任务系统:一个任务调用emWin
    29. 3 多任务系统:多个任务调用emWin
    29. 4 总结
29.1 单任务系统(超级循环)
工程代码的结构如下:
29.1.png
    关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。
29.1.1 内核接口
    内核接口文件GUI_X.C内容如下:
  1. ----------------------------------------------------------------------
    9 ^7 V7 {3 p9 S0 w
  2. File        : GUI_X.C5 s' E' U- ~& U2 W, C, F
  3. Purpose     : Config / System dependent externals for GUI* x; H# s4 z1 \$ ^; i. G, P
  4. ---------------------------END-OF-HEADER------------------------------
    . _' L8 ?/ O1 n* }" a! ?! Y
  5. */# Y1 a; t4 f( U+ [5 j3 G  o' Q

  6. $ _! ?: d% q- L$ @
  7. #include "GUI.h", F4 `! M; y% z1 Q: t" r
  8. #include "stm32f4xx.h"
    9 a0 {; S) }7 c4 y
  9. & n+ ?* T% z. @) W7 \

  10. 3 E, w$ c4 c! q  y5 ?

  11. 1 z' a- T5 h! Z, `3 G
  12. /*********************************************************************, A1 |3 G4 t! ~- |7 A
  13. *
      n& V7 T. g5 {, j% d
  14. *      Timing:# A4 y7 }+ R: N  Z' A* p9 V' I& V
  15. *                 GUI_X_GetTime()1 {0 ~9 B0 L6 w% K3 d2 ^
  16. *                 GUI_X_Delay(int)5 F+ P. w+ g3 A- L! r4 D

  17. 3 n0 I3 \# @8 g0 C* O
  18.   Some timing dependent routines require a GetTime
    * W, x2 ?5 o/ B' R
  19.   and delay function. Default time unit (tick), normally is
    $ I4 m) z/ ~9 }" y8 @4 h1 h& k
  20.   1 ms.! g! q8 i9 a) n, t, s, |
  21. */: e& m% L$ Z; x
  22. extern __IO int32_t g_iRunTime;(1)
    # ^! D% a5 J; F/ r' B0 S* V3 C" D
  23. int GUI_X_GetTime(void)(2), Z* \1 t/ ~$ O0 ]5 @
  24. {- v6 U8 C& H. u( q8 G) \" Y
  25. 7 y* l2 R/ G& b: t
  26. return g_iRunTime;
    $ H9 `) `$ M7 Q0 j
  27. }
    0 O4 o2 }. Q3 B5 |7 \9 X' _, @

  28. " {7 n, i3 X' {- _% y4 K# {
  29. void GUI_X_Delay(int ms)(3)7 U/ ^, R( @) z+ ^2 O2 K4 q  N
  30. {3 h. }, f4 k1 M! f& z
  31. int tEnd = g_iRunTime + ms;
    - u) B) U! ]1 }1 \" A
  32. while ((tEnd - g_iRunTime) > 0);
    3 |1 x; p7 D8 D$ I8 |
  33. }9 [; O8 V1 i8 n0 o  ?! ^3 \' o
  34. " n1 T9 G: N# _9 ^& @
  35. /*********************************************************************
    ) l; G$ i' a0 ]& K9 w
  36. *$ K% {& D. E4 ~. J( Z: k, n7 ^+ P; Z
  37. *       GUI_X_Init()4 ]( y; f" `& r- f0 B
  38. *
    5 T& d% M, F- s. c9 s
  39. * Note:
    3 ?' r" V. k3 n+ f, e5 k2 b
  40. *     GUI_X_Init() is called from GUI_Init is a possibility to init3 j) c' g! b5 D' m" [
  41. *     some hardware which needs to be up and running before the GUI.
    7 [- p( C' Z6 {- g- Z
  42. *     If not required, leave this routine blank.
    $ F) |+ U7 B, G5 ^
  43. */* V% o. G# y8 ~& s% o

  44. 0 v7 j' W! s+ O$ ~- p3 I9 R" D
  45. void GUI_X_Init(void) {}; ?9 ~& {- g% b: F

  46. # [9 q+ y: {! w: R7 B6 g
  47. 8 Q& v* R1 K& c' R' R' g
  48. /*********************************************************************
    ( \8 V/ l5 f+ l; G$ o5 P; |
  49. *
    ; U) W7 p! B7 g* J2 g% l. W
  50. *       GUI_X_ExecIdle) h# c: h, |& g% K% F) f4 F  M
  51. *
    . Z! @- `5 \+ Q  q/ c
  52. * Note:7 H  i$ N. X) L/ h3 i, G
  53. *  Called if WM is in idle state
    3 K& T2 e' c- Y) p1 n. R
  54. */
    / z+ M) [2 f1 N; U$ T5 {, R2 x

  55. / x& X6 V. h% r0 D9 G
  56. void GUI_X_ExecIdle(void) {}8 f% e4 l( e6 }9 X- V9 g
  57. % R9 R0 b! C* q: ~
  58. /*********************************************************************
      O1 H' u  M4 W
  59. *
    $ F) k: P/ G+ C; g8 m1 ]
  60. *      Logging: OS dependent3 e9 x! U: o% J* c1 Q. b

  61. ' {: s- }8 e7 E9 K3 l
  62. Note:
    5 _% Y+ Z; I8 v7 D/ q
  63.   Logging is used in higher debug levels only. The typical target2 f  d+ L: d1 b7 [6 k  x* I
  64.   build does not use logging and does therefor not require any of
    * B  [6 O# w6 E; P' U
  65.   the logging routines below. For a release build without logging+ v3 [+ M& x3 |( t  l: m4 d
  66.   the routines below may be eliminated to save some space.
    % h- O. c* H+ G( ]7 z" z& v! y' o
  67.   (If the linker is not function aware and eliminates unreferenced
    : i; Q  m' y3 [" C6 \; E; g
  68.   functions automatically)
    ( w' s% \0 m; M7 K: \( P1 `8 q

  69. 6 R  ?* U8 n  L& h; U
  70. */
    - U+ S  x, G$ P. A. E) t8 R

  71. 6 T8 `. M5 f3 z. g8 Y# |$ N: F
  72. void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }
    9 m; I# _  G9 [% W; C' f
  73. void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
    : U2 b! V1 p) ^! w/ L* V" D9 D2 E
  74. void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
复制代码
1. 时间基准全局变量,这个变量在bsp_timer.c文件里面进行了定义,由嘀嗒定时器中断进行调用,每1ms调用一次。

  1. ' v/ q6 [) j  Z: t6 v$ Q, y
  2. /*+ r& w3 C0 R" [) D
  3. 全局运行时间,单位1ms
    5 e# {4 I5 o; n; @& M
  4. 最长可以表示 24.85天,如果你的产品连续运行时间超过这个数,则必须考虑溢出问题  v( {1 S! w' j1 K$ W
  5. */
    - g: H( Z' J$ E9 ^- E& d
  6. __IO int32_t g_iRunTime = 0;9 Y! H3 c0 x1 C( i6 ]2 @8 W( p
  7. /*; j( k3 V( X2 A' l4 Z
  8. *********************************************************************************************************
    6 s6 P" W5 ^: V( Q
  9. *        函 数 名: SysTick_ISR3 B6 v2 r1 Q# D3 i+ f
  10. *        功能说明: SysTick中断服务程序,每隔1ms进入1次- h5 c& Y1 M+ r/ s! J' ^! m, s
  11. *        形    参:  无9 u( B4 r  i9 ~, a
  12. *        返 回 值: 无
    - X; K9 q8 X  w' v( u
  13. *********************************************************************************************************
    * D1 \/ |, f0 i6 [: }
  14. */" P# g3 s' E6 Q
  15. void SysTick_ISR(void)
    3 k0 d" ~6 }7 x/ O; [3 M: Y
  16. {: c  |9 H% P# U( v- O
  17. static uint8_t s_count = 0;
    & N3 D6 Q( D" r" z$ a  R5 N) @" a
  18. uint8_t i;9 D7 h  `( e# c8 W
  19. 0 S7 r* p; p& P. B1 o3 y* C
  20. /* 每隔1ms进来1次 (仅用于 bsp_DelayMS) */$ G3 z, x5 u6 M: Q% K- A4 }2 ]
  21. if (s_uiDelayCount > 0)' ~2 J$ l! W( x8 i  v" o$ @7 b+ G8 i
  22. {" e  S8 ^) a1 v7 Y% T- t9 R8 a
  23. if (--s_uiDelayCount == 0)
    + g+ _& y9 ~# D9 _
  24. {, `' i: Z) z! |4 p  s! Q
  25. s_ucTimeOutFlag = 1;
    ( q3 q. d: Z5 G2 y) q, h
  26. }
    / t! H7 t  F; N0 Y
  27. }
    - v  Y0 I8 C( ]0 {

  28. 4 m3 J' `# E/ D5 c9 N6 Q
  29. /* 每隔1ms,对软件定时器的计数器进行减一操作 */# ~( }* ~# u! w9 E
  30. for (i = 0; i < TMR_COUNT; i++)8 e$ A( d7 z: J: b  K" H/ L% D! _5 L
  31. {9 o' u' ~" }) D4 k
  32. bsp_SoftTimerDec(&s_tTmr[i]);5 Y0 Q- f1 _: F1 J, S6 H
  33. }& e. n# R7 _+ x
  34. 5 x  X" T5 X, N) f
  35. /* 全局运行时间每1ms增1 */) v7 |: b$ }: e# C
  36. g_iRunTime++;; ]" X$ q7 C: V* E( y1 b% D: D# D
  37. if (g_iRunTime == 0x7FFFFFFF)        /* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF */0 X- {. _- u: @
  38. {
      B8 h7 l# i. k$ b1 {
  39. g_iRunTime = 0;/ G3 f) [  U0 q  D: l: [$ o
  40. }5 U$ @3 r% u# U3 k" W

  41. $ H8 P9 L2 x+ Y+ ^, ^& m/ A3 ]
  42. bsp_RunPer1ms();         /* 每隔1ms调用一次此函数,此函数在 bsp.c */
    ; D+ `- t) B/ ^9 c6 J+ {5 F

  43. % h/ }* @7 H- O7 C! x- O
  44. if (++s_count >= 10)9 i, {! Q4 O1 X6 Z6 z3 h; U) s
  45. {+ b5 i" p- R7 j6 e- ^7 E7 t
  46. s_count = 0;# l: m6 t/ z6 G) K  F- W* v, k

  47. . D1 R: C& `, a
  48. bsp_RunPer10ms();        /* 每隔10ms调用一次此函数,此函数在 bsp.c */) R5 j, a/ F$ }7 ~8 a+ ^3 f
  49. }$ z' z) g/ F* v# L7 D7 G; ?
  50. }
复制代码
2. 供STemWin调用的接口函数,用于获取系统时钟基准。
3. 供STemWin调用的接口函数,用于延迟时间设置。
4. 主要设置上面两个函数即可,其余函数根据需要进行配置。
29.1.2 触摸接口
   触摸部分由嘀嗒定时器中周期性的调用:
  1. /*
    * L( Q. b0 x% d; M
  2. *********************************************************************************************************
    - Y" v6 O5 l+ f. k# R" N
  3. *        函 数 名: bsp_RunPer10ms
    0 y. Q7 y' Q( d9 I
  4. *        功能说明: 该函数每隔10ms被调用1次。在bsp_timer.c的定时中断调用。主要用于硬件事件检测  t( l: z1 A8 U. r
  5. *        形    参:无6 ~2 j0 Y# e5 j; J4 u" b
  6. *        返 回 值: 无  @, |: M% w3 X
  7. *********************************************************************************************************
    2 b& a0 P/ Q8 i- }/ ?" _
  8. */7 |: m, [. X; p( e$ k# b
  9. extern __IO uint8_t s_ucRA8875BusyNow;" P4 T" U; |  V6 b9 j2 Q
  10. void bsp_RunPer10ms(void)/ Q$ N! s* ]; ^8 F( J, ]
  11. {5 m3 H. K+ K& `/ |: s5 y& Y# v
  12. /* RA8875 触摸*/
    . y- p% W+ o+ t2 [7 M2 P( \
  13. if (g_ChipID == IC_8875), {1 H. o  e0 s
  14. {% h7 J/ f& l' g0 V7 G
  15.     /* 资源共享标志 */
    * M8 P, Q& n# Q
  16. if(s_ucRA8875BusyNow == 0)
    2 k0 J% ~6 c8 }9 _, y( R
  17. {
    . k, F8 w. v* T6 T: Z: N! ^
  18. GUI_TOUCH_Exec();
      v- J3 h1 H. C0 R9 ]# _
  19. }
    2 t# l+ j( C$ f( h1 t# Z& G* r7 P' o8 V
  20. }
    0 ?7 H( a/ V: g9 b# m' D# t$ Y1 R
  21. /* XPT2046 */
    4 L0 i7 t  W2 _5 t8 w
  22. else& H2 ?- U1 @/ L6 [0 Q3 H
  23. {# `* H2 T, }. D
  24. GUI_TOUCH_Exec();
    5 r6 A" L, m6 `! g1 `7 |
  25. }
    3 @; j4 [9 K. L$ |- p3 b4 ]
  26. }
复制代码
29.1.3 主程序
在文件main.c
  1. /*3 M: n- A7 _* `8 u1 c
  2. *********************************************************************************************************
    9 Y: X! S, e- \7 {. T3 {' R& ^7 o
  3. *        函 数 名: main& ~% L6 D2 m) z" I9 a/ D
  4. *        功能说明: c程序入口
    9 k. x" ~8 p8 a" Q( r2 G' l
  5. *        形    参:无
    6 y! m& ]  _" {( c" P
  6. *        返 回 值: 错误代码(无需处理)5 Q6 N# O( C# l- `5 p1 a
  7. *********************************************************************************************************7 B  F0 Z' p( V# K
  8. */
      B# _- R- }  Z% c' l4 S! A) f
  9. int main(void)( ^8 ^4 A1 ]! p1 C. N) H
  10. {7 w0 `  e0 Z% a" }) K
  11. bsp_Init();        /* 为了是main函数看起来更简洁些,我们将硬件初始化的代码封装到这个函数 */; V5 T: I: c2 Y4 r
  12. + T$ @: [8 U  Y+ {& C( A4 _6 w9 N8 b
  13. MainTask();+ O/ r8 P3 q" x# _0 G
  14. }
复制代码
在文件MainTask.c
  1. /*
    4 M+ j, q3 a1 N5 X2 ]1 p. _
  2. *********************************************************************************************************7 P. a, }" `. d: q
  3. *        函 数 名: main9 ^7 R8 A& j! O9 ~
  4. *        功能说明: c程序入口0 j' A7 n% k- K: ~
  5. *        形    参:无  \9 B8 A% {7 M7 {, H
  6. *        返 回 值: 错误代码(无需处理)9 I7 u5 g) g- |" D
  7. *********************************************************************************************************$ l  m( b, w' b
  8. */$ [: ~2 ^* |" d
  9. void MainTask(void)
    - {6 f8 i$ Z5 n4 [" l6 u
  10. {
      M# {) I* I$ \% i0 P( z* A) C
  11. int xPos;. N1 d4 t/ F, D
  12. int yPos;) b& A4 P8 R2 \' R' O. O, V
  13. int xSize;
    ; g) q+ F0 {. l( J1 U# c1 B( b
  14. int i;. c6 k+ J' p/ C

  15. $ N+ [3 c8 k- `: M( V
  16. i = 0;0 ]- l9 Q  Q4 _7 _0 i) {1 f) |
  17. /* 初始化 */0 ^* ]& A' c3 f* u$ a% m6 @* {3 J
  18. GUI_Init();
    . {2 ]* \6 y* W; g- m$ C
  19. /* 获取要显示的X,Y坐标 */% g% e6 w1 D4 J9 t* i6 V
  20. xPos = LCD_GetXSize() / 2;
    & g1 I8 |9 j% P
  21. yPos = LCD_GetYSize() / 3;
    3 w/ E0 q+ v+ c9 g- F# T
  22. /* 设置文本显示模式 */2 d$ \- |1 d9 i1 o/ T' E3 ^  \
  23. GUI_SetTextMode(GUI_TM_REV);
    9 G% {# B' J2 I1 p0 n
  24. /* 设置显示字体 */
    : n" S2 K% u" ~' i) z; H5 v3 W' q  {
  25. GUI_SetFont(GUI_FONT_20F_ASCII);
    $ d  L; K1 c: g3 x7 ^4 m
  26. GUI_DispStringHCenterAt("Hello world!", xPos, yPos);
    ! n7 M7 S" h2 t, i; v7 Q; w* {
  27. /* 设置显示数字字体 */
    : F- S7 ~% _1 W4 U$ E
  28. GUI_SetFont(GUI_FONT_D24X32);! R9 g, ^( Z1 E; Y
  29. /* 获取显示0000,在字体GUI_FONT_D24X32下的显示情况 */. `. o6 {- I9 o% G) ^4 d* G
  30. xSize = GUI_GetStringDistX("0000");
    6 ?( V: t' A7 f) ]' V0 @
  31. /* 设置显示位置 */
    5 N' r* P+ P; O+ Z( z* ]2 @
  32. xPos -= xSize / 2;
    0 ^) z  z. ^4 y! _
  33. yPos += 24 + 10;
    0 }# g" e; S! q. Q. q
  34. while (1)
    2 T+ h, X6 t, ?" |- y: y
  35. {- x  y. T! t) h% n  W: _
  36. GUI_DispDecAt( i++, xPos, yPos, 4);
    2 p0 {4 H  [' Y! w; j+ K+ N
  37. if (i > 9999) ) }: o; v& P$ V$ P1 ^: B
  38. {
    1 Q$ s+ Z) g) N4 p# @
  39. i = 0;: l3 l3 R  a9 a7 q) g
  40. }. |) d% ~) M& `* g
  41. }
    6 _8 t' d  x% S! I
  42. }
复制代码
功能比较简单,实现效果如下:
29.2.png

8 g  U3 p+ M* K) C! b
收藏 评论4 发布时间:2015-2-12 14:32

举报

4个回答
baiyongbin2009 回答时间:2015-2-12 14:34:09
29.2 多任务系统:一个任务调用emWin
前面几期教程配套的例子都是采用的这种方式,实现这种方式也是分为三部分
29.2.1 内核接口
内核接口文件GUI_X.C内容如下:
  1. #include <app_cfg.h>
    . m3 v- I# N8 M$ m
  2. #include <includes.h>, }1 H8 o8 q, Q( P( M( n
  3. #include "GUI_Private.H"
    # P9 ]1 X5 u$ V* ?
  4. #include "stdio.H"  `: W6 R. n7 G; I: ~/ \
  5. : N( F  z/ \6 K$ F; W) F, N& H+ |! y. d
  6. /*
    # Y% ?& K' k4 z3 l5 C
  7. *********************************************************************************************************# p. j0 S$ y1 ^) _1 A
  8. * GLOBAL VARIABLES3 s- {) D+ j- |' _0 o5 @
  9. *********************************************************************************************************/ D  B* `2 R1 ^$ I% i: q
  10. */
    6 @) E: d& X/ \0 z  r- Y

  11. & v. J" X5 K: n  d  s& B
  12. static OS_SEM DispSem;/ C9 O" s/ E$ N6 H& g
  13. static OS_SEM EventSem;) ^2 B" P) I' n
  14. $ H. ~  X; R& H
  15. static OS_SEM KeySem;
    2 V4 E* H; @& f6 U8 g: P* B
  16. static int KeyPressed;
    + O" D% H/ m2 k, e" s7 z
  17. static char KeyIsInited;' J* u9 n% [5 Q" B. @

  18. # ~3 w' f3 Y' g" K3 p7 [, U
  19. : J7 h. H" P# J+ V
  20. /*
    ! g8 `5 \2 d8 E" c2 i
  21. *********************************************************************************************************
    8 W0 j* m+ R% L- q4 J
  22. * TIMING FUNCTIONS8 X" c$ x+ `* J0 ~4 u2 o: M' w4 A
  23. *! `+ r# ^' N: q7 E; W: [% ]
  24. * Notes: Some timing dependent routines of uC/GUI require a GetTime and delay funtion. ( X; }2 G' X2 I1 D" p
  25. * Default time unit (tick), normally is 1 ms.
    " d% o" P4 P: j1 E: k
  26. *********************************************************************************************************; M7 I6 `1 |% L+ K8 F
  27. */( A) M, V3 N  c" r2 }8 i' z
  28. ; ~$ P/ g" F' ?) h
  29. int GUI_X_GetTime (void) (1)* m5 N& b( s; ^+ ~
  30. {
    ) z& H( e3 G" E& U* w9 Z, g2 C
  31. OS_ERR err;" D1 F5 X( i5 D0 p3 R
  32. return OSTimeGet(&err);' x. {3 f8 ^; h2 ^5 i0 G
  33. }! e  F2 u' M$ W' j4 F: \; f

  34. ; }2 c) y# B" G* ~* f
  35. 5 \! V3 ~; |! g; b
  36. void GUI_X_Delay (int period) (2)
    4 R5 ?- W+ u% G
  37. {2 F& V2 v" G( v
  38. OS_ERR err;
    7 @6 P  y* C7 g+ k/ [# W
  39. OSTimeDly(period, OS_OPT_TIME_DLY, &err);
    1 U4 A8 x4 J# `9 |* R
  40. }* `; \9 v( R* j2 x9 D9 Y' J
  41. # q! Q% t& p6 r+ e9 w; m0 w
  42. : m. @7 o5 {; Q2 y) G  Y7 |8 u
  43. /*
    9 W9 {) M) G$ z6 K0 i: [  p
  44. *********************************************************************************************************, X" B) m, d8 V  m
  45. * GUI_X_ExecIdle()
    # f. Y' R! I5 a& M, E. N
  46. *********************************************************************************************************
    ; }! P6 ?- {0 @3 c7 {) n0 ?: M8 u
  47. */
    . C7 D* y6 d3 S$ m+ x0 r( F5 C; _
  48. void GUI_X_ExecIdle (void) (3)
    # Y9 C: m  H5 [- B6 v8 c5 {
  49. {& R$ U. u7 W4 r" i/ {
  50. GUI_X_Delay(1);
    9 F: q, Z/ T7 _: U1 F. m
  51. }- [0 r. l3 P% L- C5 W+ o
  52. $ e1 }6 U; ~8 m4 Y% D
  53. 0 F$ ^! x! X& d3 |$ Y/ E* c
  54. /*
    ! j' j: Q+ `. u# L9 t% b
  55. *********************************************************************************************************$ @$ \9 m4 D$ n, r7 k, U4 b
  56. * MULTITASKING INTERFACE FUNCTIONS
    # _) ~8 ]' w0 g* a
  57. *
    : Y! c3 w4 o# M
  58. * Note(1): 1) The following routines are required only if uC/GUI is used in a true multi task environment,
    : @% [7 b2 g" B. v# F
  59. * which means you have more than one thread using the uC/GUI API. In this case the #define , q3 T5 {" P0 [
  60. * GUI_OS 1 needs to be in GUIConf.h
    " C4 w, X" y. S+ B
  61. *********************************************************************************************************% P% _& j+ _% i0 J  w
  62. */
    . ]4 _9 |- X# q8 N
  63. 1 t" b: @  R3 e2 ^* ^4 f" k# J7 ~0 k
  64. void GUI_X_InitOS (void)(4)
    # O; P9 r8 c) @6 C9 G
  65. { , @; C/ q/ t* y* t, j
  66. OS_ERR err;
    : ^6 P: n# e, s4 V7 K7 M
  67. ! ^+ Y* Y$ I+ H; n
  68. /* 用于资源共享 cnt = 1*/' A/ V% i% A8 Q0 q  ]! V
  69. OSSemCreate((OS_SEM *)&DispSem,2 e. p! H6 T1 ]( Z/ z: e
  70. (CPU_CHAR *)"DispSem",6 O% U8 O) X6 A7 Q  E/ c$ F! d
  71. (OS_SEM_CTR )1,( d& U5 b! l% M9 `! l6 c
  72. (OS_ERR *)&err);7 S' w. M# X3 @$ A( K' I+ C
  73. /* 用于事件触发 cnt = 0*/
    # V  f  @4 C* w7 D
  74. OSSemCreate((OS_SEM *)&EventSem,) C) W9 j# r8 W2 S/ H  ?1 `& r
  75. (CPU_CHAR *)"EventSem",9 }6 d4 R4 X8 @7 b" E
  76. (OS_SEM_CTR )0,* t! b% ^. _/ }3 N( _1 c
  77. (OS_ERR *)&err);/ }0 A8 \' L* c1 t) V
  78. }! G! s' J- |3 w  i" m

  79. . l2 j1 B* x  t& I1 J3 t# p
  80. void GUI_X_Lock (void)(5)$ o/ R! v: e, ^, q. t* f. L1 ?
  81. { 2 h, J9 k, I# D1 X7 h5 c
  82. OS_ERR err;5 [, P1 q$ c3 Q1 T' H: {
  83. OSSemPend((OS_SEM *)&DispSem,
    9 |. M# `7 C/ X0 e8 y# z
  84. (OS_TICK )0,
    5 W. k. @6 O- w1 e
  85. (OS_OPT )OS_OPT_PEND_BLOCKING,
    $ }, I) X1 o2 l" K& b5 B
  86. (CPU_TS )0," J5 ^) d1 r8 r5 y
  87. (OS_ERR *)&err);2 d* q0 G* `% L
  88. }5 r0 [6 R+ K# }6 a; G

  89. 1 N* [% ~  N6 w/ M) ^
  90. void GUI_X_Unlock (void)(6)
    ( W8 b9 b' @9 X) ^8 w' s" t
  91. { 7 w% Q/ \* z9 k3 t& L. m; r
  92. OS_ERR err;
    5 p% c1 Z9 @/ }! O
  93. 0 {' Y4 |7 p) P& g' m5 c! n
  94. OSSemPost((OS_SEM *)&DispSem,1 t* L7 }% s$ d, `9 a9 y/ }4 V
  95. (OS_OPT )OS_OPT_POST_1,
    " ?) H+ K& s$ ]! }# s* s6 |8 M
  96. (OS_ERR *)&err);
    - x4 t& Y( u( W) w" d+ W
  97. }8 G% H; e. N9 S& `3 U3 y% q6 L

  98. % L: w7 l& E7 q; r) L$ _- b  a
  99. ! M( _* `+ k6 o* C
  100. U32 GUI_X_GetTaskId (void) (7). B* j( _, u! M- v6 [
  101. { $ b- u4 n3 m4 S% H$ ]
  102. //由于存在同优先级的任务,这里不知道是不是可以0 w3 R: s+ e# V  m, x
  103. //uCOS-III中已经没有任务的ID& s/ }) g$ m% h) f+ X/ N
  104. return ((U32)(OSTCBCurPtr->Prio));1 A  G# h9 _+ M; R
  105. }
    $ N. a5 k: W, g' O& `% s: H+ L
  106. $ O9 w* @* [4 k4 h1 f  P
  107. /*1 w% h# u8 w& ~
  108. ********************************************************************************************************** b6 |& {2 t1 @: g
  109. * GUI_X_WaitEvent()
    6 m& \& N! k* w' A$ ^- `# V
  110. * GUI_X_SignalEvent()
    ; g7 K5 N; Z' x5 v) E% t
  111. *********************************************************************************************************; ?' s/ d6 h) J1 o
  112. */4 n0 `, v1 E+ }9 {3 n3 ?

  113. 7 X; m5 O) X+ K( l$ m
  114. ; e( a4 }: Z: O- j# t7 U& x) \
  115. void GUI_X_WaitEvent (void) (8)1 e0 q5 n9 R7 U9 W& L$ j6 t
  116. {
    , `4 `! C/ k; Y8 m& J+ |
  117. OS_ERR err;* W4 s" t! Z4 i
  118. OSSemPend((OS_SEM *)&EventSem,1 Z" A# Y" L- }+ v' U: l
  119. (OS_TICK )0,* N6 b' f2 R9 e4 v' ^/ e- n: i/ B
  120. (OS_OPT )OS_OPT_PEND_BLOCKING,
    9 s# H7 r2 z( o+ n1 y2 r
  121. (CPU_TS )0,0 z8 U& ~6 q* A' S% |
  122. (OS_ERR *)&err);( b. A9 F8 t1 O/ r3 E
  123. }6 ^! @% @+ D7 K/ @% D( |4 ^% u& f
  124. 5 F1 T- ]3 m" G1 M2 D/ z

  125. ; w2 i* @9 Z$ z( M( i2 F
  126. void GUI_X_SignalEvent (void) (9)
    ; G4 O% i5 r" x* I7 s- E# ?
  127. {
    0 o  s  ^2 b* `% S5 R- b. N. Y
  128. OS_ERR err;$ \$ j- n* m6 z. e
  129. 7 v5 t0 W, A9 i* b9 n; {
  130. OSSemPost((OS_SEM *)&EventSem,  t7 e1 v* t* J) |
  131. (OS_OPT )OS_OPT_POST_1,1 L: m1 ^  u+ e0 X7 H! w; `
  132. (OS_ERR *)&err);
    " I. F! R1 P0 \& ~6 V
  133. }1 v- S& s: B( O* ~5 B- D
  134. 4 g$ P$ x5 n2 _  M/ P; {. P: ]
  135. /*
    6 m! J% \% v4 _6 c, o- K
  136. *********************************************************************************************************% X. C+ F. F7 I& L: i
  137. * KEYBOARD INTERFACE FUNCTIONS
    6 x' A3 c4 W- f) f
  138. *5 q3 B6 [7 _" N9 k; M, W' N' N
  139. * Purpose: The keyboard routines are required only by some widgets.5 ~0 g/ m, e( w4 F5 G7 ]/ ^( j! P
  140. * If widgets are not used, they may be eliminated." i* y3 p' Q. P: P& G8 U% Z
  141. *9 {5 T1 K/ u2 h* l( J9 Y
  142. * Note(s): If uC/OS-II is used, characters typed into the log window will be placed        in the keyboard buffer. . Q' P% D2 O# Y0 ]% L) ~  k
  143. * This is a neat feature which allows you to operate your target system without having to use or ; H1 @/ ~7 L: S* C* f* }( j! `  T
  144. * even to have a keyboard connected to it. (useful for demos !)
    3 K; D! G8 k8 U* v2 q8 H/ F
  145. *********************************************************************************************************% M4 w2 j7 u0 D9 u* y
  146. */( K0 V1 R6 C9 K& \
  147. 5 s- W- y. Y: m! [+ X8 P( g
  148. void CheckInit (void) (10)
    % e* \7 F5 J! r8 ?* a
  149. {8 m  a: {. r5 V. [: m
  150. if (KeyIsInited == DEF_FALSE) {8 I2 |& ~* L+ m$ n) p. b$ j
  151. KeyIsInited = DEF_TRUE;
    1 f1 V5 F3 b( h. J2 N) N
  152. GUI_X_Init();- }4 }) g; T! m. F
  153. }6 X# G; X; v- A$ n. W2 V2 P' b$ u  M
  154. }
    4 W1 a" B7 V* I, F6 z

  155. ! p) K/ F2 b5 d
  156. void GUI_X_Init (void) 7 _9 J$ S. J" z1 _7 S
  157. {$ M7 }5 W0 O0 u! H; m# s
  158. OS_ERR err;
    $ K' V( U3 ^+ K
  159. OSSemCreate((OS_SEM *)&KeySem,
    ) g4 P& f0 x: L
  160. (CPU_CHAR *)"KeySem",' Y; U! Q# J9 j  \
  161. (OS_SEM_CTR )0,; K% w. _% U" b- A* T2 X4 q* N
  162. (OS_ERR *)&err);" k- M8 N8 k" n0 _) P& n
  163. }' N' z1 U) V. n1 m
  164. 3 E1 r/ ?. F* C4 |; }+ G9 S! c
  165. int GUI_X_GetKey (void) - d+ L/ |* Z% F0 Q
  166. {
    1 V( S1 [* f* W% w0 _
  167. int r;
    ( _/ i" q- q$ K0 [

  168. . g! e0 J* f/ j7 _
  169. r = KeyPressed;; T; {2 O7 u- v" s; ?
  170. CheckInit();
    6 R' ~2 \' d1 C
  171. KeyPressed = 0;& Q  X7 @& n9 T- V
  172. return (r);% {; ~' G8 J8 T+ O$ i( x
  173. }
    4 t8 O3 V% {. Q% Y
  174. % K! L8 M3 e2 _; J5 f
  175. int GUI_X_WaitKey (void) 4 l1 Z) l/ m4 z/ i9 T
  176. {: _6 w. ]& H" w5 n' g  g5 O
  177. int r;
    5 _/ I6 r; b8 o( k0 v. }. m
  178. OS_ERR err;% @- T2 l" ]; y8 b1 |4 \
  179. 2 v; G( r- h6 v* g+ Z' `* u

  180. / o% B3 B! m6 ?# U# j8 k
  181. CheckInit();7 z, u9 m: A# c' I, ~
  182. if (KeyPressed == 0) { 7 s. |% Z5 ?3 e& G5 \0 }$ Z+ ]
  183. OSSemPend((OS_SEM *)&EventSem,  Q! j6 _, @& z9 b! i2 D: [% j" [
  184. (OS_TICK )0,2 f1 Y( ]5 _  M7 m8 H; V2 p
  185. (OS_OPT )OS_OPT_PEND_BLOCKING,
    # g0 Y6 \/ e; V& K0 r- Y
  186. (CPU_TS )0,( N2 [5 `; ~" X
  187. (OS_ERR *)&err);
    1 U; A7 u, Q3 C2 N6 ?5 o
  188. }
    : J/ }! D: f1 {% P2 z
  189. r = KeyPressed;# n. r0 x5 f9 i
  190. KeyPressed = 0;
    . ^" t# X: f4 b* o# J
  191. return (r);
    9 t) j7 ], ^  Z8 r
  192. }! K9 y$ B  R" X0 Z( Q( n  B
  193. 3 R& L& `! U( N1 x5 ]0 G9 S
  194. void GUI_X_StoreKey (int k)
    0 Q5 y+ F2 t* c- v
  195. {
    / b" S0 {7 B2 o1 m2 v1 ^& H: j' O$ H
  196. OS_ERR err;) ^. E4 _9 F( C, [
  197. KeyPressed = k;
    & c" k, w0 {- Z" l8 s
  198. OSSemPost((OS_SEM *)&KeySem,
    ! z! R9 `1 n$ K( e+ ~, T9 v
  199. (OS_OPT )OS_OPT_POST_1,
    0 C2 A1 @4 {4 p  h. M
  200. (OS_ERR *)&err);* R5 U  X: K( }$ v
  201. }
    / |0 Y9 Y- i2 G& j

  202. 5 [8 w( C, Z7 P, r8 x
  203. void GUI_X_Log (const char *s) { GUI_USE_PARA(s); }(11)
    " Y& _: M( f  d
  204. void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); }
    / {0 G4 O  h3 `3 o2 K& E& u7 ]1 e9 y: I
  205. 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. /*1 o0 K9 ?/ H! X% h  ]  J
  2. *********************************************************************************************************% r: u  m1 {6 S# m# z
  3. *        函 数 名: AppTaskGUIRefresh
    ! T) [' @, }3 C0 \- \' F) u2 i+ z
  4. *        功能说明: emWin刷新函数3 O9 ]4 x0 Q8 {1 E+ }1 ?
  5. *        形 参:p_arg 是在创建该任务时传递的形参9 t/ I, F+ T/ w4 j' Z: Z  m1 f
  6. *        返 回 值: 无
    % i& O- M. G  S- ^) L
  7. * 优 先 级:OS_CFG_PRIO_MAX - 3u* q: u4 V% }; W9 [0 o$ \) w
  8. *********************************************************************************************************
    $ [/ `, e; o0 x
  9. */. Z9 H7 i% t/ C2 A$ L9 V
  10. 4 }2 n. ^$ [1 T) A* t6 z+ c
  11. extern __IO uint8_t s_ucRA8875BusyNow;; [& [8 f! z' j' e7 Z) Q* z/ S
  12. static void AppTaskGUIRefresh(void *p_arg)3 W7 L1 P6 N  y4 I" O7 O) F
  13. {5 H. A. n0 {7 U
  14. (void)p_arg;         /* 避免编译器告警 */0 v3 J2 {0 c. S% j0 f% B) c
  15. while (1) ) |- _" U4 P9 I) s. V
  16. {5 Q+ J2 P4 U. Q4 X
  17. /* RA8875 触摸*/  o/ l0 n- ]$ X2 A* f
  18. if (g_ChipID == IC_8875)
    . v& r6 X3 o& H" i' ^$ ^4 g8 n" V
  19. {# C& z% i+ V; @$ O6 `* n
  20. /* 资源共享标志 */, e+ T3 m0 f4 G# c, A
  21. if(s_ucRA8875BusyNow == 0)- Z" O9 w+ G5 l3 z
  22. {1 M+ K' t3 G9 l
  23. GUI_TOUCH_Exec();7 N$ b9 P1 O& Y5 n- [
  24. }1 a* v# [* `" N5 L
  25. }+ \& z( u" S5 @3 _
  26. /* XPT2046 */
    ) V& L8 D" r3 `) ~$ p
  27. else
    : s/ O2 w# ?/ U: c
  28. {
    * t, h5 z7 W: q& R1 {
  29. GUI_TOUCH_Exec();' G+ Z) T3 v) f! V) k
  30. }7 K# U: d. u7 [+ [/ v6 _3 y
  31. 9 v4 V1 W! Z  t0 z& R! |
  32. BSP_OS_TimeDlyMs(20);
    8 Z6 r$ p- ?, f- b7 o5 @& I, a
  33. }
    * O3 u* X# F# u8 D% c( M
  34. }
复制代码
29.2.3 STemWin任务
  1. /*
    2 A0 U4 h  a  W$ k; G2 L. J  r% o
  2. *********************************************************************************************************3 g; ~6 j/ c! H: j' H9 X4 ^9 z, j# m
  3. *        函 数 名: MainTask1 [& J0 b  e7 x8 O: j. ?, y$ S
  4. *        功能说明: GUI主函数7 e0 I+ A/ y% G# L; e; S" F3 [! h
  5. *        形 参:无
    % n( F9 |* v- r. U6 t% n
  6. *        返 回 值: 无* q, E, ?8 Z1 q% C
  7. ********************************************************************************************************** T) B% {) R5 _8 I; W4 o$ j1 X
  8. */
    ; x) @$ _7 I  `7 x! n( s8 T
  9. void MainTask(void) " ~4 ~, H# X/ Q- z/ y8 b* f$ L
  10. {
    + j$ e' D) T8 U6 D* B2 s: C& F
  11. GUI_Init();
    + i+ ~! T( j$ y& T
  12. GUI_SetTextMode(GUI_TM_TRANS);6 W8 {6 ?2 \& p  ^5 X) R
  13. for (i = 0; i < 3; i++) " S+ H* c* z/ u: Q. o
  14. {
    * C. X& |, g6 O
  15. GUI_SetColor(GUI_BLUE);
    6 s' r, d% J/ r, v- t0 }: \
  16. GUI_FillRectEx(&Rect);
    - m* d  a4 D7 o/ N2 w$ i- W
  17. GUI_SetColor(GUI_WHITE);
    8 R0 G$ D. `! B; v. C, \5 e& H4 l
  18. GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
    0 t3 K( }; ?5 \' r. F( }
  19. Rect.x0 += 60;2 [* R$ V: \' N
  20. Rect.x1 += 60;' h" e8 [! A3 M2 V! |& M7 M8 M
  21. }
      v6 Q/ r3 q( L9 \" e7 P: k# Z
  22. while (1). I) v: y+ n. T* L8 P# l+ W9 \3 R
  23. {( w$ S9 H+ S$ L7 O0 v
  24. GUI_Delay(10);6 P% F5 n* L$ J9 @
  25. }! S/ f; z1 O/ U# }! Z1 y
  26. }
复制代码
这个例子整体的显示效果如下:
29.3.png
" `8 s% v- y- m% D$ b3 P
baiyongbin2009 回答时间:2015-2-12 14:37:10
29.3 多任务系统:多个任务调用emWin
    这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。
29.3.1 uCOS创建三个STemWin任务
这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
  1. /*
    . L# i/ X2 t* N# N
  2. *********************************************************************************************************4 S4 e. A( i' w* n
  3. *        函 数 名: AppTaskGUI3 @9 u; ]# t' S. O  i4 k3 I5 J& A
  4. *        功能说明: GUI任务05 N/ ~$ L' u0 |0 i6 u1 R  j
  5. *        形    参:p_arg 是在创建该任务时传递的形参
    4 h- b$ D+ B# @- m" y) F: U4 {
  6. *        返 回 值: 无6 q+ E$ u4 g3 y# W
  7. *   优 先 级:OS_CFG_PRIO_MAX - 6u
    : ^8 T" |  Z) U0 T, w8 `
  8. *********************************************************************************************************/ Z4 U' }9 c' J) y9 a3 f% ~" Z
  9. */
    + w4 X' i, J& K
  10. extern void MainTask(void);5 i8 f( V1 \  c( s- |3 l
  11. static void AppTask0GUI(void *p_arg)
    ; b) q- Q7 ~& v1 v% V. W$ L5 ^* j
  12. {
    5 D# T6 d4 Q3 ]! k' ?0 {
  13.     (void)p_arg;        /* 避免编译器告警 */
    2 x" h7 {8 N4 H6 Y% ]7 E9 N# R/ x
  14. while (1) " S( i5 N4 i' E( n- H8 f2 R
  15. {
    9 B' i7 ?% W: m& l! b
  16. MainTask();$ x0 ^5 \& O& D4 P8 Q  |' W
  17. }, d  g/ m* ~5 y3 o* D( E
  18. }( m2 p, E; D! V$ [7 L# o
  19. 6 b6 R- M8 n4 q
  20. /*
    1 W0 f' n( ^2 ^, A; r
  21. *********************************************************************************************************6 Y! Z5 V5 h# W+ g% y( D/ s: @
  22. *        函 数 名: AppTaskGUI' C& W7 p  _% U4 z
  23. *        功能说明: GUI任务1
    + T7 S% s" L, T8 p7 k$ X( p% g
  24. *        形    参:p_arg 是在创建该任务时传递的形参/ F4 f) t0 c$ ^: p( C) S' }5 g1 v
  25. *        返 回 值: 无6 _4 r2 d7 C5 E8 R6 O; k& j
  26. *   优 先 级:OS_CFG_PRIO_MAX - 5u
    , o5 k, G" I7 s2 S: j" Q
  27. *********************************************************************************************************  ?# M, g! o, {) a; s6 _# x
  28. */
    ; M& d7 |9 W% O7 k
  29. extern void Task_1(void);
    ' O7 P) o) p5 `! C0 ^& `/ K1 b* a
  30. static void AppTask1GUI(void *p_arg)
      ~$ K' E- o* V4 p( ?' A
  31. {
    9 _, }6 v# O* b4 b' r
  32.     (void)p_arg;        /* 避免编译器告警 */
    4 c/ \3 V) |) K' \0 c9 d
  33. while (1)
    7 F6 W/ R5 b; R2 Z& `# f+ T
  34. {
    . {6 b3 P: P7 @8 j* J0 F! B  J
  35. Task_1();
    / \) ^' F) [$ n/ ]8 y: y
  36. }
    3 w( f) J) L( y: d# T
  37. }7 w5 |% F+ T) |% b1 V

  38.   a4 B* y3 \8 f! m+ u1 V
  39. /*/ N% f; C( R2 |4 C# E+ V! t9 [3 u* k
  40. *********************************************************************************************************3 Y8 {) W2 j7 X* o: q2 h
  41. *        函 数 名: AppTaskGUI
      _8 d3 o# O/ S7 W" o
  42. *        功能说明: GUI任务29 a2 V( {. r; C1 c) x
  43. *        形    参:p_arg 是在创建该任务时传递的形参3 s8 p% R$ h8 V; U6 w6 u& J
  44. *        返 回 值: 无+ Q( M* i1 H5 E# A# T, n5 k2 u6 u
  45. *   优 先 级:OS_CFG_PRIO_MAX - 4u
    4 F9 U. r& Y) ~
  46. *********************************************************************************************************
    : v& H" ]  ~8 ?5 s% s
  47. */$ A$ H0 P0 j: e! Y: R5 c
  48. extern void Task_2(void);
    5 Q; j1 I' M: {" Q9 o5 G
  49. static void AppTask2GUI(void *p_arg)* @7 h# F; Q1 s- w) F  e2 [
  50. {
    6 x* Y0 b  C, }% ]+ M. E2 l
  51.     (void)p_arg;        /* 避免编译器告警 */
    5 }" m; b4 G7 }* U3 g
  52. while (1) : L* H$ n  X$ v6 q: F
  53. {
    4 g! Y3 F9 R$ X8 Y( L( G1 S
  54. Task_2();
    9 @4 M  v8 c8 [' d4 g8 N6 ^4 h4 c
  55. }
    / D+ H% A8 ~& X9 X' m  Y0 Y1 I* c- v
  56. }
复制代码
29.3.2 STemWin任务
建立的三个任务所在文件夹:
29.4.png
MainTask文件中的任务:
  1. #include "includes.h"; a( P. T; `" u  v
  2. #include "MainTask.h"
    ( j: ?" R, y, V& C7 j/ ]) q

  3. 5 d9 ^3 A/ N" K5 x+ d; y8 ?+ j

  4. . s; ?; l4 A1 h" A
  5. /*
    9 s/ D1 X+ g+ l
  6. *********************************************************************************************************
    . Y6 D& N& Z3 ]: ~3 U! c) a8 d
  7. *        函 数 名: _cbCallbackT0
    # Z% i  g4 Y; Y
  8. *        功能说明: 任务0的回调函数
    8 y7 ?( h% r( s- o9 Q8 Z
  9. *        形    参:pMsg  消息指针1 e1 w% u4 H  O. Q; u0 k2 n
  10. *        返 回 值: 无
    % g5 F4 f: L: K- K$ G7 j
  11. *********************************************************************************************************1 _, |5 P& R6 b
  12. */. s2 C4 e! d) p
  13. static void _cbCallbackT0(WM_MESSAGE * pMsg)
    7 y5 V# J3 D$ B$ ^- D& f( x
  14. {& F+ m5 t1 [) R. a
  15. switch (pMsg->MsgId)
    4 v; C- d, K$ L) w2 A" T
  16. {
    7 i0 r% y: T) l8 X$ {- @( C3 h
  17. case WM_PAINT:
    # @0 g! [: N$ H5 ?# N" D; t' M
  18. /* Handle the paint message */
    % F/ D8 ?# v; |; \
  19. GUI_SetBkColor(GUI_RED);
    : Y3 F% s! ?- G: W
  20. GUI_SetColor(GUI_BLACK);. i( V2 }0 B4 o
  21. GUI_SetFont(&GUI_FontComic24B_ASCII);
    4 \; g" i4 w' s7 H& ?! u
  22. GUI_Clear();
    ' B8 s1 z6 v7 O3 G
  23. GUI_DispStringAt("Task0 Moving", 0, 0);$ T( G* Y- t6 }0 q# L) a  {% W5 f
  24. break;, b$ Q4 R. `/ Y: S+ D$ i
  25. default:2 i- G8 i$ s4 u6 ~- q
  26. WM_DefaultProc(pMsg);& b1 X4 {! E* M4 W
  27. }
    + a2 s- N4 ~$ f, L0 i+ e; l
  28. }
    3 r; x4 j' ~7 T
  29. 0 Q" b) ^' D, U5 K% v. p
  30. /*" f" e  D# k/ o) m
  31. *********************************************************************************************************
    : m/ [7 z0 C# N2 x2 ?, s
  32. *        函 数 名: _cbBackgroundWin: v. ^: ~" V- u  M
  33. *        功能说明: 背景窗口的回调函数
    / b! x$ i1 ]' C1 [' M1 |2 Q
  34. *        形    参:pMsg  消息指针
    & ^1 r) K2 k9 f! K6 H" H) U
  35. *        返 回 值: 无
    & ?* C; Y5 L+ b$ v/ o
  36. *********************************************************************************************************, L  S: j$ J5 h: f7 d/ ?
  37. */
      o% y9 M* F7 F+ o0 w+ Y8 \+ f
  38. static void _cbBackgroundWin(WM_MESSAGE* pMsg)
    # C$ P+ o3 W4 u. N4 L/ y
  39. {
    * }5 q/ g4 |. n) `
  40. switch (pMsg->MsgId)
    2 ~: x: [" M7 L9 c: w
  41. {
    * X8 _8 H: Q* |. u  x$ l6 I$ a/ b
  42. case WM_PAINT:
    % b& c/ G& A5 |1 B4 `- [! `7 U
  43. /* Handle only the paint message */
    ) F% E4 Y" z* K. ?/ U; h: S
  44. GUI_SetBkColor(0x00CC00);
    " s+ p7 I7 d/ I+ H, ^6 m
  45. GUI_Clear();0 O) G: N' T  U' U" ^& X* b
  46. GUI_SetFont(&GUI_Font24_ASCII);$ P, j3 ~7 H' v+ z: j% O3 q$ c
  47. GUI_DispStringHCenterAt("STemWin - multitasking demo\n", 159, 5);
    , r  Q/ g+ u+ w" [) f$ }# V7 [: }
  48. GUI_SetFont(&GUI_Font13_1);3 I. z+ z" [1 p9 v1 a! D: D3 r
  49. GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35);, K( N" n* h$ r( H& A
  50. default:5 d$ w; m9 P/ O; R' \
  51. WM_DefaultProc(pMsg);0 _4 n2 ]& R3 A7 }5 Z' }
  52. }' g$ H1 e% \, J1 x4 l. s9 d
  53. }
    + M4 i' x4 y  v1 h% g( H- T6 W8 t

  54. $ n! T+ C& P& @- _& J
  55. /*$ f: e7 f: x" {" e& u& y
  56. *********************************************************************************************************; A' p7 Y3 i# M$ e5 e
  57. *        函 数 名: Task_0
    ; W2 y! f! G5 v1 s8 A$ A6 [1 X
  58. *        功能说明: GUI任务07 v8 |: i5 P5 U$ B6 a/ j
  59. *        形    参:无. W+ O! X1 z3 C+ J% Z
  60. *        返 回 值: 无
    3 }( p# i, ?' C# M/ O8 L
  61. *********************************************************************************************************
    ; w, \4 e( _1 o9 N
  62. */+ H+ Q6 z3 L' f* K8 z2 }9 _# E
  63. void Task_0(void)
    5 K7 f4 }$ L6 w/ S" z) f
  64. {& g9 E: W- C" k8 [. o- I+ b
  65. /* Create frame window */! U" E* T1 V2 H; G
  66. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 230, 200,
    ! [( _* w" z' r5 D) m1 ?" `
  67. 40);! ]( X* k/ `* m' l/ [
  68. /* Create child window */% g2 z* v, _% \, Q1 i7 x, g
  69. WM_HWIN      hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), : p" W2 f! ^! R! o/ \+ Y
  70.   WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT0, 0);
    ) T+ G! D: D4 @7 v" d5 x8 a; _
  71. FRAMEWIN_SetActive(hFrameWin, 0);
    2 s0 w# K5 p; C) I. c" v
  72. /* Make sure the right window is active... */
    % T0 z# E: S% X3 H
  73. WM_SelectWindow(hChildWin);
    / Y* x+ n* c" Q+ W: J
  74. /* ...and the right font is selected */' r( v3 z. N5 h
  75. GUI_SetFont(&GUI_FontComic24B_ASCII);. U8 Z( j( ^% d; r
  76. while(1)
    % w- i% H' {0 @3 u4 U
  77. {* l1 j* m% o: `/ p
  78. int i;
    9 H' s) ]& o+ C/ w& J& ^4 E' u2 v
  79. int nx = 80;4 }7 n% D5 b) X. ~" x. v/ W; Z( `
  80. /* Move window continously */
    . f0 @7 i; [8 {! a8 C
  81. for (i = 0; i < nx; i++)
    8 H  \& A4 ~8 @0 ?, x/ }' y
  82. {
    4 X2 F; ~3 ]2 D; D, Q' O
  83. WM_MoveWindow(hFrameWin, 2, 0);
    2 [7 n7 H' C! l9 m, p" _
  84. GUI_Delay(50);
    & l7 F1 y5 M2 V! a% d
  85. }/ b" x- w9 J- R# I
  86. for (i = 0; i < nx; i++) ; P3 I1 c  J( q! [
  87. {
    # d: t' H% X7 [; S3 C! l5 Z0 q
  88. WM_MoveWindow(hFrameWin, -2, 0);$ n2 z' r" `8 z8 k2 X' B
  89. GUI_Delay(50);0 L1 G2 {+ d% K- P- [+ o; o" J
  90. }
    ; y" A4 i- [& X' E% z9 V) Q. O" E
  91. }. e( e* r, I/ r% j% q! C* A$ X3 c
  92. }
    . {) y3 |; D+ o0 Q6 I& p; |0 E4 ]
  93.   C- o6 t6 G8 @* V  e7 \" \( d/ _, ~
  94. /*
    6 V- G' n# i9 R, ~5 `$ r, N
  95. *********************************************************************************************************8 q0 X0 i  Q8 g( f4 O
  96. *        函 数 名: MainTask, w) B/ |: b! m2 x( b
  97. *        功能说明: GUI任务0, o! Y$ {8 T/ [# @" P  c. x% |5 k
  98. *        形    参:无
    * H- ]6 P, w& N- q' f& n
  99. *        返 回 值: 无
    ' r& ~) ^2 c/ F2 k% E- n' F3 b
  100. *********************************************************************************************************
    ! b, m' A3 R  U  w3 _; b: m
  101. */
    4 W8 R0 ]  z; e
  102. void MainTask(void)
    ) _3 `: I4 l( F0 x9 }
  103. { 6 h6 b& |: Z2 T& o' i) w
  104. GUI_Init();5 j6 g, ^" o( h; }9 f
  105. WM_SetCreateFlags(WM_CF_MEMDEV);              
    1 }$ Q2 b2 u4 N; [6 W% ^! f
  106. WM_SetCallback(WM_HBKWIN, _cbBackgroundWin); + @: y4 \. ?( h  Y# d$ x) d" p
  107. while(1)
    2 [$ W) |8 U" t8 g# f6 r4 d) X! @
  108. {0 q& g, g9 m% r+ f
  109. Task_0();1 l: |* [* Y/ f( I+ y
  110. }' @1 c" w/ ?3 x( s0 B
  111. }
复制代码
App_Task1中的内容:
  1. #include "includes.h"
    # I% M1 C- a; |6 Y/ v
  2. #include "MainTask.h". `- S2 |# g1 Y: P+ Z/ `" K: \, a2 Z

  3. / P& }9 M9 F0 x% w  K  ]

  4. + ?. u5 M( a6 \8 b* E
  5. /*
    & v% U6 S* k' p6 _( }3 j
  6. *********************************************************************************************************( U2 ?# _6 g4 z- \* W* `  B0 m
  7. *        函 数 名: _cbCallbackT1( ^  G  ~. h  H0 x
  8. *        功能说明: 任务1的回调函数3 M3 }* e9 E8 N- d# @, ~, x
  9. *        形    参:pMsg  消息指针
    . n, U6 Y+ M/ z/ y/ z% l# K$ d
  10. *        返 回 值: 无( ~  o+ m* H/ p& h
  11. *********************************************************************************************************% N5 l) X+ E5 L6 T1 V
  12. */! ?, X* D) W; H8 I
  13. static void _cbCallbackT1(WM_MESSAGE * pMsg) / c# M3 Q7 A. e1 T+ X; l9 e- V1 N
  14. {
    ! c7 l) p6 h9 L0 e% P& u1 h
  15. WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);- E; O& L1 u; L* P. ]: R
  16. switch (pMsg->MsgId) 8 [. q6 o0 Z* m4 J, J5 k5 S
  17. {
    0 F# X& G) @/ `+ I' R, i/ w
  18. case WM_PAINT:4 Q6 F7 w& X9 k+ }. M% d% j
  19. /* Handle the paint message */, f0 V4 T" s+ i; r. `" N( y0 \
  20. GUI_SetBkColor(GUI_BLUE);) A5 P6 O) G* T$ Z" G
  21. GUI_SetColor(GUI_WHITE);
    ! X- N8 j3 a$ ?7 c8 i8 J. M
  22. GUI_SetFont(&GUI_FontComic24B_ASCII);+ H/ p# n2 ?$ f! Z0 T$ a8 ^, a
  23. GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    , H" j& D! [1 y: a( \( x5 C& u
  24. GUI_Clear();( j: R' Y7 ?* b& b
  25. GUI_DispStringHCenterAt("Task1 window...", - X/ i0 c4 W& k4 F) w4 N+ h4 `  g
  26. WM_GetWindowSizeX(hWin) / 2, 1 X; v4 d( h. K( x# B* ^6 }4 R
  27. WM_GetWindowSizeY(hWin) / 2);
    # Z% E1 j" o% k' w" l
  28. break;2 V7 R  f# B* S
  29. default:
    / N/ |* p- _& R6 r
  30. WM_DefaultProc(pMsg);, U/ U' Y  u( e1 y# _% i
  31. }2 K6 Y8 j! Q" j
  32. }
    3 ?. B5 A2 _6 s/ v! e4 W1 B
  33. + B& n) n+ l. A& R/ T& t8 U9 X; y
  34. /*' F) T; n% s7 o$ [2 r
  35. *********************************************************************************************************: k- _1 _* G) ~. ^
  36. *        函 数 名: Task_14 f. Z* Y& t: S
  37. *        功能说明: GUI任务0  j/ L" O7 h  q# B# c
  38. *        形    参:无. O8 g2 S/ S8 g
  39. *        返 回 值: 无5 o1 G5 L# }$ o1 @0 N+ p, C; q# Q9 ?
  40. *********************************************************************************************************
    " O* ~* V" o1 W$ D" Z9 P
  41. */4 c  Z: ]1 E% y  x) |
  42. void Task_1(void)
    ' D- j: U( A- h" L+ V& ~9 [* b
  43. {
    ; B: S. ]/ N4 |" O
  44. /* Create frame window *// [; {3 _" W4 ~& f
  45. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP,
    % R3 j; i& Y6 y. \! }- l4 v3 v
  46. 20, 170, 200, 40);
    6 U( e  K. Q) F  H5 ?$ j$ ?8 V
  47. /* Create child window */' Y/ |3 ~0 A# p  {5 U1 }' o2 H/ k' g
  48. WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW | ' Z* t% c7 `0 Z+ R- i  x# _
  49. WM_CF_MEMDEV,_cbCallbackT1, 0);
    % i$ Q. [$ }/ }) a3 j8 r; r
  50. FRAMEWIN_SetActive(hFrameWin, 0);
    ( v; G1 ]4 h0 D! w3 I  L
  51. while(1)
    ! ^, r, \$ u7 ^' K
  52. {
    : H4 `+ y! Z6 Z: `. @
  53. int i;
    - n4 r  V9 k; ?3 |& Q, g0 r, M
  54. int nx = 80;
    6 B$ `5 Z6 K7 R. V
  55. int ny = 90;
    # d6 A3 k/ Y" {+ Y& C9 M
  56. /* Move window continously */
    $ f2 j; I; j. }! B0 M
  57. for (i = 0; i < ny; i++)
    & m! ]4 G* M% {* ?8 u* {
  58. {) H, f4 m4 D8 k; [
  59. WM_MoveWindow(hFrameWin, 0, -2);0 R3 z$ M! }9 d( b4 U6 ^
  60. GUI_Delay(50);  J! T' t- v, D4 N9 w4 C
  61. }! S$ J1 T7 C3 N7 \5 t1 D, F
  62. for (i = 0; i < nx; i++)
    6 Z  D/ L) L+ h: |  X$ y+ Y
  63. {) Y+ _9 y$ h3 P  D  @9 C) t# e
  64. WM_MoveWindow(hFrameWin, 2, 0);7 o4 n! n. |# h+ S( N; z3 N
  65. GUI_Delay(50);  ~# K  ]: s& U; a" ^! C. f
  66. }: Y1 n6 Y/ ^, v' L  p
  67. for (i = 0; i < ny; i++) 3 I0 Z0 @1 L. y9 M1 z
  68. {
    + c+ {( e; c" B/ e( d# ?
  69. WM_MoveWindow(hFrameWin, 0, 2);
    " F' Q0 g4 I8 Q( U8 X. W2 O
  70. GUI_Delay(50);
    " a) V5 k. Z  a$ z
  71. }
    ) J* b$ p9 a7 \( p' Z, Z
  72. for (i = 0; i < nx; i++) 2 _" k( h( y+ n
  73. {
    # |( ~) O4 N3 d2 U9 E7 a1 f  ^
  74. WM_MoveWindow(hFrameWin, -2, 0);1 f; s" k9 Z6 d+ d" `0 P
  75. GUI_Delay(50);5 |! S1 y2 L. v' Z3 ~% Y
  76. }
    2 N2 }( m7 @% l( `$ R3 s7 o
  77. }$ s  I1 e3 g% d& i- u' T. \
  78. }
复制代码
App_Task2中的内容:
  1. #include "includes.h"
    ; y, J/ }, a! l4 n3 ?* I$ |( `
  2. #include "MainTask.h"2 T* g# h# n, m7 h4 J; v/ p
  3. : m/ j- x  V- i. X* ]2 g
  4. /*
    : Q+ Y+ h. n) D0 z
  5. *********************************************************************************************************
    ( L, i0 G: ^& [3 }! h. ?
  6. *        函 数 名: _cbCallbackT2
      H' G+ g% m% Y
  7. *        功能说明: 任务2的回调函数" v! F% g  y% e4 d
  8. *        形    参:pMsg  消息指针* \. k5 t0 G. h# P! M0 S
  9. *        返 回 值: 无
    - s- C0 a- |3 q% i
  10. *********************************************************************************************************" N* [- b3 r" p" X) X; A
  11. */
    - v1 p4 U, I8 @
  12. static void _cbCallbackT2(WM_MESSAGE * pMsg) % @# Q2 k: y' }- u9 Z# y
  13. {
    7 M( q. f: m3 [! K, F$ p9 V
  14. switch (pMsg->MsgId)
    5 x; w# A: }  s; {" h# ]( l
  15. {$ i/ ?! R  b% N* |+ g
  16. case WM_PAINT:$ I1 p% i3 r+ K* Z
  17. /* Handle the paint message */5 E- t7 `3 A7 q2 H' R
  18. GUI_SetBkColor(GUI_YELLOW);. C- b0 I1 h! {
  19. GUI_SetColor(GUI_BLACK);5 t! C& h7 @4 r/ w8 u* }8 f. t
  20. GUI_SetFont(&GUI_FontComic24B_ASCII);
    9 }. i6 U/ G3 u  B; S; G7 f, z
  21. GUI_Clear();7 v4 {/ l3 c. }9 J7 V9 J
  22. GUI_DispStringAt("Task2 Moving", 0, 0);
    6 S$ p. i7 k) j# `
  23. break;
    $ c) o" Y( D- E+ N
  24. default:2 S; q% W' w9 [- M
  25. WM_DefaultProc(pMsg);0 i% y* D* b! L3 I; Q
  26. }& v0 W+ Q* r1 V5 i: D( X
  27. }
    # |) r8 B& b' R! g- _+ r

  28. 2 Q  o, P0 r2 K& I
  29. /*# @$ d( \3 A4 ]. q
  30. *********************************************************************************************************8 |$ X. V+ Z5 f! G$ O# ^
  31. *        函 数 名: Task_2
    9 i" x4 Q3 i5 z/ Y
  32. *        功能说明: GUI任务08 y* h0 i8 g$ A  T$ M/ O
  33. *        形    参:无
    # m  @+ K3 {8 z  ^6 C
  34. *        返 回 值: 无
    ' y* n. c# {' \% ^# F8 i
  35. *********************************************************************************************************" X2 D! d" U) N( e4 |, Q; V; M
  36. */
    ; p8 C8 s/ i; n3 C5 f6 J. ~- N6 a, [
  37. void Task_2(void)
    9 b% ^& k- j  q! D  A+ J$ p8 |% a/ \
  38. {
    $ s; t$ S$ l- ?
  39. /* Create frame window */
    ! x/ W2 w) h! v) e2 A* Z2 X
  40. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 2",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 190, 200, 40);: i" M: B9 P1 K" o0 o: f
  41. /* Create child window */8 G5 \( B# n4 J6 j" ]
  42. WM_HWIN         hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
    7 ~8 h" C+ G- O
  43. WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT2, 0);! |( M) [7 G$ R& {* d9 ]
  44. FRAMEWIN_SetActive(hFrameWin, 0);# m& i- g% A1 ~, g
  45. /* Make sure the right window is active... */
    7 }( _% P7 P( T) ^* i) }2 a
  46. WM_SelectWindow(hChildWin);- B' |* @2 p! c. M
  47. /* ...and the right font is selected */& f( P0 n" _0 T) y
  48. GUI_SetFont(&GUI_FontComic24B_ASCII);2 r4 F1 o2 h. v/ N; m" ~
  49. while(1) . t2 O# r# H" @  e/ U: `* D
  50. {
    - ^' ?3 q8 b! ^, v2 P( g% T
  51. int i;
    3 N+ I2 ]0 A+ [0 Z2 k2 i* v
  52. int nx = 80;
      T6 R) D: l- s$ V6 |
  53. /* Move window continously */
    . V7 P: u. \% z: l. @1 j, o
  54. for (i = 0; i < nx; i++)
    . g3 W5 v. b7 `6 Y
  55. {/ n: v: {5 L4 B9 b
  56. WM_MoveWindow(hFrameWin, 2, 0);
    ) O' g2 W/ H  @& M$ t; F8 J
  57. GUI_Delay(50);
    & w. H  z4 I, U9 c! c8 s+ w7 k
  58. }
    6 _! Y( C3 ~* `4 y% G( G$ N4 ?- B
  59. for (i = 0; i < nx; i++) ! B2 x0 E6 Y& g! q% R$ @$ ?! m
  60. {& @' `' d: ?% K; X( p5 ~0 ~: ^
  61. WM_MoveWindow(hFrameWin, -2, 0);$ [7 q4 g3 H4 e
  62. GUI_Delay(50);
      U8 {, m! |3 ^' [% I5 m
  63. }
    & v# c/ Y8 Y" x3 H- z" Q
  64. }& {% N3 O( H2 ?
  65. }
复制代码
这个例子的整体显示效果如下:
29.5.png
29.4 总结
    本期教程就跟大家讲这么多,希望通过创建的这三个DEMO让大家对STemWin创建裸机或者多任务系统有个整体认识,具体工程中用那种方式要根据实际的需求来决定。

$ ]$ P& o- }" K8 Z" l
wyxy163@126.com 回答时间:2015-2-12 14:59:17
提示: 作者被禁止或删除 内容自动屏蔽
lkl0305 回答时间:2015-2-12 16:58:02
多谢分享!!

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版