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

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

[复制链接]
baiyongbin2009 发布时间:2015-2-12 14:32
本帖最后由 baiyongbin2009 于 2015-2-12 14:38 编辑
' N3 U& B. n+ b; R, N4 C+ U' l' }9 {* t$ s0 Q
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接) q$ |& L  w' l, U) V$ n% {9 @
第29章 STemWin多任务(uCOS-III)
  P) s+ ^8 R( O. t
    本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
    29. 1  单任务系统(超级循环)
    29. 2 多任务系统:一个任务调用emWin
    29. 3 多任务系统:多个任务调用emWin
    29. 4 总结
29.1 单任务系统(超级循环)
工程代码的结构如下:
29.1.png
    关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。
29.1.1 内核接口
    内核接口文件GUI_X.C内容如下:
  1. ----------------------------------------------------------------------9 f, t5 o/ f7 T( e
  2. File        : GUI_X.C: J0 T# l- J5 t4 ?% \. o
  3. Purpose     : Config / System dependent externals for GUI
    $ }" _9 A/ k6 i2 _
  4. ---------------------------END-OF-HEADER------------------------------
    : R& i6 z9 g9 a2 @' u
  5. */
    + P9 l" z8 D' z0 L. f
  6. : z/ j+ Q3 c# f  s
  7. #include "GUI.h"  @1 a& o# y7 Y7 M7 F( O8 R% h7 o1 q
  8. #include "stm32f4xx.h"+ q0 {: w! S. \# ]8 }9 i$ r
  9. " F+ J1 N* h) M8 B( T  h2 z- H9 |5 g

  10. 8 K. {, X2 Z( Z; g. Z/ a
  11. % U7 O% K0 V: X1 e! i6 M
  12. /*********************************************************************
    4 S. `1 v4 [; `& g+ S% X
  13. *
    , l2 c3 g+ F% H- b0 ?8 @1 @3 P
  14. *      Timing:4 Y7 w4 C( h% `+ z
  15. *                 GUI_X_GetTime()  p* [" h5 D9 ^- o
  16. *                 GUI_X_Delay(int)' a& c5 M! M5 p

  17. 8 `* z6 P, n5 h
  18.   Some timing dependent routines require a GetTime* K. O6 D9 K1 Z. A
  19.   and delay function. Default time unit (tick), normally is2 ?6 ]9 v" g+ F
  20.   1 ms.6 h  ~0 L9 k! }, L' B0 H& ?
  21. */9 i6 p7 P: L. F* ~/ Q& \
  22. extern __IO int32_t g_iRunTime;(1)! H7 C6 V" F5 v, N9 S" u' l
  23. int GUI_X_GetTime(void)(2)- x1 E, Z' Q( G7 x: J3 K
  24. {
    4 I1 J2 ~( ]3 T- d9 O- ^. @
  25. 0 ]+ J! S) _* \/ E
  26. return g_iRunTime;
    : q  z/ X8 O: P) `
  27. }
    + D8 q7 S+ m7 |  \6 m9 F* f
  28. 1 r0 e2 H2 V9 y  C
  29. void GUI_X_Delay(int ms)(3)
    - {6 M9 ^, f3 |9 N- Q! x4 A; ~
  30. {
    ! S7 i3 W2 a" k0 x8 Z" H- v7 y* g$ Q
  31. int tEnd = g_iRunTime + ms;7 r) Q9 ]6 Y2 X* v" I; k6 i8 k
  32. while ((tEnd - g_iRunTime) > 0);
    : f! i# {5 `4 J9 ?
  33. }
    $ {' d! u5 H1 A: ?1 t! a1 ~

  34. # w! ]" [  V3 Q  }, d4 u
  35. /*********************************************************************6 N$ S; G6 J0 l. M; S1 T
  36. ** C1 ]3 ]4 o" i3 ]! G0 A; N
  37. *       GUI_X_Init()
    ' G" A- v1 R9 r4 c3 g
  38. *
    2 J+ L! {% @% m- Y! f
  39. * Note:
    0 P  s( h0 t2 K: w% P' o  s8 C
  40. *     GUI_X_Init() is called from GUI_Init is a possibility to init+ ^8 i* S& v8 x- B" L& f+ p9 h
  41. *     some hardware which needs to be up and running before the GUI.
    $ j! @* @1 |0 [/ V! t% T
  42. *     If not required, leave this routine blank.+ q; f) L1 {1 i! H# [
  43. */
    % F, A# b. e1 v- V
  44. 6 B! C& E# I1 E/ _2 I
  45. void GUI_X_Init(void) {}
    6 g. |: k) Q7 E/ E4 R$ p7 z

  46. # I! O7 G# A1 I' T6 \4 i8 Q) O

  47. ; f6 D5 _5 G8 V7 @, H5 H/ u
  48. /*********************************************************************
    8 Z$ E# _# A2 {  i  j4 T  R
  49. *
    * M& w9 h& _+ B
  50. *       GUI_X_ExecIdle
    * L( d6 D6 a& j* B& [- v" X& _
  51. *
    % r' r6 p& o  G2 i: g6 o& C: X
  52. * Note:
    # i8 n" P7 d+ E1 F2 i
  53. *  Called if WM is in idle state
    0 n9 R7 r) a4 Q  E. ~9 F
  54. */( M% l" E! c; f

  55. + f' P4 y3 ^) |3 l: }2 Z* R+ S
  56. void GUI_X_ExecIdle(void) {}+ F* I0 [; p( D9 q1 x  P

  57. # n$ @  A: k9 [. I
  58. /*********************************************************************
    ( L  p& C$ T% o! ?9 O& ?
  59. *5 J6 h* }% C" t) `- L" A% E
  60. *      Logging: OS dependent4 g1 n# L" [2 ~  R- G- \
  61. ! r" a% l; j! v5 c7 C
  62. Note:
    . _4 P+ z' f% _; [/ P
  63.   Logging is used in higher debug levels only. The typical target& r. \. C5 G. K( E0 @
  64.   build does not use logging and does therefor not require any of
    8 N# ^, D& X4 J/ I; ?
  65.   the logging routines below. For a release build without logging
    : F5 S' y+ C/ p) T
  66.   the routines below may be eliminated to save some space.
    4 e) g- m3 e8 |8 N5 O
  67.   (If the linker is not function aware and eliminates unreferenced
    8 \6 ?" ?$ T/ r6 Y$ n) F8 b
  68.   functions automatically)# J( {; P+ T1 E0 j6 G% O" b

  69. ' k( w  B( V$ q* g
  70. */
    ) i0 ^4 Z( E: z" H8 }4 c

  71. 3 e+ K% u  z0 j6 g) n3 G6 t5 T
  72. void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }
    6 a8 c/ A1 i6 |8 b' L4 ?+ U
  73. void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }& K7 a* [6 B4 M' _6 U
  74. void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
复制代码
1. 时间基准全局变量,这个变量在bsp_timer.c文件里面进行了定义,由嘀嗒定时器中断进行调用,每1ms调用一次。

  1. 6 `% A5 m8 I, r5 f5 r
  2. /*
    9 M- G! ]/ ~* ^& R9 w
  3. 全局运行时间,单位1ms
    6 D# J8 x$ M' N
  4. 最长可以表示 24.85天,如果你的产品连续运行时间超过这个数,则必须考虑溢出问题9 ?8 a# g/ W0 `' {+ A
  5. */5 I2 e& u/ O% Y8 k5 V
  6. __IO int32_t g_iRunTime = 0;+ M8 s' T9 _$ P% f6 V
  7. /*4 H  G: Y1 p) }& r) a% F8 t
  8. *********************************************************************************************************, d1 B0 `9 e# x4 m
  9. *        函 数 名: SysTick_ISR
    : m8 p/ O+ w$ ^( B: y' `0 s0 [, y
  10. *        功能说明: SysTick中断服务程序,每隔1ms进入1次: @9 w0 n0 {' F4 C- ~5 b
  11. *        形    参:  无
    1 f+ N- }: Y' X% t+ n9 w( z5 ^' K
  12. *        返 回 值: 无
    * x7 l. W+ {2 p- _
  13. *********************************************************************************************************
    ' @! h0 K$ H7 s8 j
  14. */
    & w  J& B7 O$ K/ o5 S: g$ i
  15. void SysTick_ISR(void)
    ) O3 x. r: H- v2 ?/ K
  16. {
    % a- X/ E; M8 R2 O4 `, }9 ~
  17. static uint8_t s_count = 0;
    / S4 j3 t5 Y) r# P0 \3 e
  18. uint8_t i;
    7 ~0 Q7 ?; x% q
  19. 9 ~+ O( s0 p; K3 r  s
  20. /* 每隔1ms进来1次 (仅用于 bsp_DelayMS) */
    ( x# s8 I/ r$ K! F0 y
  21. if (s_uiDelayCount > 0)- E! H3 _0 j# F
  22. {# _; }6 {( G# w, v5 A
  23. if (--s_uiDelayCount == 0)2 D  j/ z% [$ j% w
  24. {
    , f  f' }2 t& c9 O- k" z
  25. s_ucTimeOutFlag = 1;! `9 Q7 C: y$ Y* g
  26. }5 w% W$ J! ~& w8 j- J$ D
  27. }
    1 a1 a1 J7 i3 w3 {' {- P

  28. 3 c0 t: ?0 U5 ^" |; z8 ~
  29. /* 每隔1ms,对软件定时器的计数器进行减一操作 */
    % `2 g1 {: `3 G8 [: n
  30. for (i = 0; i < TMR_COUNT; i++)" a7 ?, B( @  V2 d1 t- ~! _
  31. {
    ; O! f: B4 S* Q
  32. bsp_SoftTimerDec(&s_tTmr[i]);- r" S' @, {( H3 X
  33. }2 P! Y8 _. Z6 C
  34. # n1 t. v: U3 H, [. p# e) h$ k! u
  35. /* 全局运行时间每1ms增1 */
    . \2 h' i# E% N' i( N& M/ f
  36. g_iRunTime++;
    8 [/ Y) s( _9 X+ ?9 S: r
  37. if (g_iRunTime == 0x7FFFFFFF)        /* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF */6 X' r3 H5 e  t1 o
  38. {
    3 H2 k4 T' C9 _! M- M
  39. g_iRunTime = 0;
    ' a, }2 J/ @! t' }5 B0 c
  40. }
    0 z: W' f# b9 o. f3 j

  41. ( N, Y5 V) L" l9 o
  42. bsp_RunPer1ms();         /* 每隔1ms调用一次此函数,此函数在 bsp.c */  r( v/ x7 ]2 c/ z- i) B5 u

  43. $ q' v! U( a3 _+ p' e
  44. if (++s_count >= 10)! T7 N, h1 M  p- Q9 J4 M
  45. {$ W( F8 i2 P7 ~( f8 M2 e
  46. s_count = 0;# g  E, y# t, ^" w. ^$ f

  47. - o( j' I: [0 n) Y
  48. bsp_RunPer10ms();        /* 每隔10ms调用一次此函数,此函数在 bsp.c */
    5 ^7 u( ^) S6 y: _& y1 L
  49. }6 R6 o. s- N4 T9 L
  50. }
复制代码
2. 供STemWin调用的接口函数,用于获取系统时钟基准。
3. 供STemWin调用的接口函数,用于延迟时间设置。
4. 主要设置上面两个函数即可,其余函数根据需要进行配置。
29.1.2 触摸接口
   触摸部分由嘀嗒定时器中周期性的调用:
  1. /*3 y3 J( O/ x, Y5 g
  2. *********************************************************************************************************
    - T5 F" z+ E1 X  R2 z" y' }- E
  3. *        函 数 名: bsp_RunPer10ms" d2 _- k$ a* U' @
  4. *        功能说明: 该函数每隔10ms被调用1次。在bsp_timer.c的定时中断调用。主要用于硬件事件检测
    7 u5 [: V# q# b! L( H% v
  5. *        形    参:无/ B! r5 ^) `/ Y! J
  6. *        返 回 值: 无
    & t3 e5 F0 a% b% ~) t' s
  7. *********************************************************************************************************3 x' m/ r$ r* c5 ^$ ?: \3 [
  8. */
    ; Y- d; ]4 K) q( a: ^% Q) a: T
  9. extern __IO uint8_t s_ucRA8875BusyNow;
    " ?/ \2 F! p& D
  10. void bsp_RunPer10ms(void)
    ! ?% N1 [; i6 @% h, ]& d+ P
  11. {8 G) x6 M& Z, ~  Z0 C
  12. /* RA8875 触摸*/
    $ E! K& l( ~9 E/ m* Y' \0 Z
  13. if (g_ChipID == IC_8875)( _7 S* D& ^' [, D
  14. {
    0 k. Q( R3 f$ P
  15.     /* 资源共享标志 */
    ) W6 q/ D* s- ^
  16. if(s_ucRA8875BusyNow == 0)7 y" v1 d) @  C8 Y! T# W/ g
  17. {2 S. Y# S! E' B( e0 {; d+ E' \
  18. GUI_TOUCH_Exec();) ]6 S: K: C1 r7 z! P
  19. }
    ' Q1 o. J" t; n" x
  20. }
    , ]& [* X4 x$ U, v
  21. /* XPT2046 */
    * ^+ ^, s( S! D. c6 I9 l% r  p1 Y- t
  22. else
    7 @1 u# I) g$ }; P# s/ \
  23. {. ]/ A$ Y4 H& M8 Q5 g- m
  24. GUI_TOUCH_Exec();
    + g# [$ I, H3 r9 j% M$ q; @8 N
  25. }
    % g6 r6 p) \1 X- q$ z4 o
  26. }
复制代码
29.1.3 主程序
在文件main.c
  1. /*' E9 c+ _) I& X. O8 Y4 Y
  2. *********************************************************************************************************, B; z' T- U* F; w2 A" b
  3. *        函 数 名: main
    2 q0 v$ J. E: z' r2 s
  4. *        功能说明: c程序入口
    7 g2 o: B. t6 J2 k
  5. *        形    参:无
    9 K; P* D4 ]0 L+ e: N
  6. *        返 回 值: 错误代码(无需处理)
    6 T5 M0 o9 {9 u8 U% h& A6 m; \
  7. *********************************************************************************************************
    9 x* V" i+ V* |6 @- H
  8. */
    6 R) C$ \9 I. ?- l8 W- {
  9. int main(void): q1 g% D# A/ k5 @, m
  10. {9 V0 [+ O( ?& q& g; @5 [4 {
  11. bsp_Init();        /* 为了是main函数看起来更简洁些,我们将硬件初始化的代码封装到这个函数 */$ [$ p3 Y; O# j" I' \2 d
  12. 5 [' l8 V; u+ l0 S" \+ n
  13. MainTask();
    8 ~. E; ^8 o, ~+ M2 V) H
  14. }
复制代码
在文件MainTask.c
  1. /*8 r) u2 ~7 J* I8 r3 Y
  2. *********************************************************************************************************
    2 {3 h* x- [5 O  \2 k  u
  3. *        函 数 名: main' V2 I' h% P% ~0 S- \
  4. *        功能说明: c程序入口
    6 V( U; Z  J6 G. s( F( X; x
  5. *        形    参:无1 F) t# k) B& v, i7 H3 v3 g( [
  6. *        返 回 值: 错误代码(无需处理)) y+ v& |6 i6 z1 f9 I
  7. *********************************************************************************************************- |4 i* X) J$ @  C' T/ z
  8. */( [9 e' Q' P4 b1 z3 ~0 p( S
  9. void MainTask(void)
    * p, O% U2 @, {$ ]7 H9 \
  10. {& K! G$ Q% t& x6 V7 ~
  11. int xPos;8 F1 h( A8 S5 _8 R' E
  12. int yPos;- _8 K! m9 X) s% K0 j; |; M
  13. int xSize;
    * ^* ?( T# @' p! J0 c' p; _, q
  14. int i;
    , r* O% y% I1 r2 R- E
  15. * ?; b. h, h' t
  16. i = 0;
    4 X8 [$ r! H) [
  17. /* 初始化 */
    0 h' P2 ^: E# r# l6 H0 |
  18. GUI_Init();
    1 t+ D0 {9 p/ C1 R) I) E& F( }
  19. /* 获取要显示的X,Y坐标 */3 g, K  {$ L0 O& v6 f' {( q
  20. xPos = LCD_GetXSize() / 2;
    - e% O  g7 r3 j# d% J. v5 r  C
  21. yPos = LCD_GetYSize() / 3;
    3 J' ~3 e- \% V! t. h% V9 F
  22. /* 设置文本显示模式 */
    4 i$ D* s) v, N; C
  23. GUI_SetTextMode(GUI_TM_REV);# g* |/ U3 X; V& X
  24. /* 设置显示字体 */6 m$ x! `9 D/ q1 g  j
  25. GUI_SetFont(GUI_FONT_20F_ASCII);# v; m7 M" e: D* N
  26. GUI_DispStringHCenterAt("Hello world!", xPos, yPos);* b. u3 J3 g1 P4 y. t
  27. /* 设置显示数字字体 */
    2 `# N  m5 d) w
  28. GUI_SetFont(GUI_FONT_D24X32);
    # I8 J) I1 W$ j* E
  29. /* 获取显示0000,在字体GUI_FONT_D24X32下的显示情况 */$ b) V: v  m" H% `: k" j
  30. xSize = GUI_GetStringDistX("0000");3 _, I, U8 H8 d9 H/ P
  31. /* 设置显示位置 */$ w$ L; ?; J; }! b# ^
  32. xPos -= xSize / 2;# u1 X9 ?; F# W5 g. I8 }  |
  33. yPos += 24 + 10;
    2 F( v  C  }" [; C0 a( J' a
  34. while (1)
    0 l% \4 i  v0 i6 a( p6 Z
  35. {
    . l: K8 ?0 K( C: j  Q
  36. GUI_DispDecAt( i++, xPos, yPos, 4);
    . _' d2 a3 O% V
  37. if (i > 9999)   c/ L& h7 r& t! p/ s
  38. {
    / H5 g8 m7 S! Q$ d' E
  39. i = 0;
    . F, X, C+ o) S' A
  40. }
    : _/ ]' v4 B2 u8 T
  41. }3 l+ o5 M' O! W0 O6 ]  i# }% A6 d
  42. }
复制代码
功能比较简单,实现效果如下:
29.2.png
4 K' K  d$ T8 Q( M4 c5 i2 ^
赞 收藏 评论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>
    3 L1 k0 j; h9 K$ r
  2. #include <includes.h>9 T2 ]8 B; D) A! O0 U
  3. #include "GUI_Private.H"
    1 v9 \& r* C, R! P% v
  4. #include "stdio.H": j5 y0 d( `+ R1 s: y; n

  5. ( c  X4 b, |( ]/ f- y
  6. /*' W, m1 o; q# m0 S$ O- G2 M' B
  7. *********************************************************************************************************2 Q5 M' `/ m4 r5 u% V
  8. * GLOBAL VARIABLES; ?, J8 e  F; m1 k
  9. *********************************************************************************************************
    * Q8 D% f+ b& G5 ?1 {* ]
  10. */
    1 W1 E3 E/ r5 L- G$ d& b

  11. ( H/ p2 A2 d* l7 w' O/ o/ H: k
  12. static OS_SEM DispSem;9 y9 H+ T5 V" V$ ^" s
  13. static OS_SEM EventSem;$ i: Z$ g& N) u5 `5 p+ k6 G' \$ f9 L# A

  14. % i  U( N5 l# q& O- R! d3 X
  15. static OS_SEM KeySem;
      M- I8 N6 B& |% V. R$ ]
  16. static int KeyPressed;6 S7 ~5 ^0 o( O9 |' u/ D
  17. static char KeyIsInited;; @6 V/ {: N" m8 h/ |& d
  18. ' r% h0 z) M7 Q. v

  19. / ~) Z; y; s$ |/ p6 x- p5 i& q
  20. /** l7 Q/ T( B% c6 O' I5 l0 ~
  21. *********************************************************************************************************: u8 G1 O+ m* v6 ]
  22. * TIMING FUNCTIONS
    9 j! l6 }3 c3 \, V/ n* K" D
  23. *
    + R& W2 U, j, r! K; O4 m4 `" e
  24. * Notes: Some timing dependent routines of uC/GUI require a GetTime and delay funtion.
    9 B5 k* r; i+ {0 G; m3 W
  25. * Default time unit (tick), normally is 1 ms.
    # [" `' }/ u6 N" [& p7 @) g
  26. *********************************************************************************************************
    " u" b- P1 z# d/ G2 J+ j
  27. */
    ; f0 K& r$ C* m) k' A- }* Q
  28. ' a; j1 I: M- a$ _
  29. int GUI_X_GetTime (void) (1)
    8 C' P- {/ m2 Y: V& d: Y
  30. {
    $ Q4 Y4 ~) s8 r
  31. OS_ERR err;' g& s2 o+ t" O9 |
  32. return OSTimeGet(&err);- ^4 Q& @5 V  I6 x# Q5 O6 ]
  33. }
    # S$ ^2 ?7 ]: u* _

  34. 7 a9 g; `' Q; f% l1 ~
  35. , ~9 ^# e3 \( j. J5 ?3 k
  36. void GUI_X_Delay (int period) (2); b) }: V8 a  v, ]
  37. {
    ( Z7 u7 w6 }8 o6 S, y
  38. OS_ERR err;2 Q2 A/ z- g3 d5 e, n- O
  39. OSTimeDly(period, OS_OPT_TIME_DLY, &err);1 c3 O, I( V2 b1 U& V  T
  40. }# E' ~2 ]) {9 J; @! e* x9 U

  41. 2 I1 B3 I5 z& s2 V# G: ]5 T" T

  42. # b2 U: C0 z, k" [% x0 h, c
  43. /*
    7 X2 k% t0 Y+ Q4 S4 x$ l' \1 u0 v. n
  44. *********************************************************************************************************% u: s) g( l) ~, l
  45. * GUI_X_ExecIdle()
    / G4 ]  j  s2 p3 P( |  [
  46. *********************************************************************************************************
    # O2 ~# ^: V$ L1 L/ N1 \" w5 d
  47. */$ M' b& ?; a; F. |+ ^+ H; N- k
  48. void GUI_X_ExecIdle (void) (3)& J$ o, s; i2 Z0 r2 L
  49. {
    / B% f8 k- ?5 u" G7 }7 j
  50. GUI_X_Delay(1);
    & |$ F: G! R( O. e) |6 I$ P3 m* c
  51. }( u$ I, \. r! A* y7 a' X

  52. ; Y0 F) t# d0 n( M9 o3 w" P, _
  53. . C& R: j( \% a: u* W8 Q
  54. /*, @9 \9 k* N; _+ [8 v
  55. *********************************************************************************************************
    + X6 _8 ~5 j1 m% Q
  56. * MULTITASKING INTERFACE FUNCTIONS
    9 A, L  r6 e- a2 h6 f
  57. *
    ' T' w" t  m2 L* }0 K  j5 L
  58. * Note(1): 1) The following routines are required only if uC/GUI is used in a true multi task environment,
    1 O0 l2 j( e2 A1 L0 v) Y0 w
  59. * which means you have more than one thread using the uC/GUI API. In this case the #define
    8 K% @5 a2 y" \5 \  g& r" y
  60. * GUI_OS 1 needs to be in GUIConf.h! ~. [6 c& y- w( V
  61. *********************************************************************************************************
    " U0 J& A# b0 f
  62. */
    ; U* c3 t2 C2 D" Y
  63. 3 F( ]5 Y/ c( @6 E4 z+ ~6 t
  64. void GUI_X_InitOS (void)(4)! N3 ?, D& K: C
  65. {
    4 g9 W% S6 B% a/ [- E5 r
  66. OS_ERR err;
    & v! y2 W7 n% z- _

  67. # d6 @# H, d3 }' V1 T( C6 A/ q
  68. /* 用于资源共享 cnt = 1*/
    , w1 @8 ?+ I  U
  69. OSSemCreate((OS_SEM *)&DispSem,
    $ V1 V7 b$ u# f. s1 p
  70. (CPU_CHAR *)"DispSem",: y4 z* H) e2 _7 a! l$ C
  71. (OS_SEM_CTR )1,3 Z% n" B7 Z1 A9 V5 R2 h8 O$ n. k0 E' h
  72. (OS_ERR *)&err);- L( ?& }# d+ C3 P  \1 r0 j
  73. /* 用于事件触发 cnt = 0*/6 i6 H& Q/ C4 B* o) P( g
  74. OSSemCreate((OS_SEM *)&EventSem,
    3 o' C+ d; O- O+ O2 W: ~
  75. (CPU_CHAR *)"EventSem",
    2 O* a; e: T8 N' v2 y7 [
  76. (OS_SEM_CTR )0,/ A6 C4 S% K" t
  77. (OS_ERR *)&err);
    * h  |. n- a' _% M
  78. }
    , N$ o1 w' ~$ Z# m

  79. , ], ~! N- p/ O. U
  80. void GUI_X_Lock (void)(5)
    . j. Q( f5 _3 x! u
  81. {
    5 Q, O5 N* @: {3 y/ W* F, |2 q
  82. OS_ERR err;$ v: j7 U& J- a- e) q" [
  83. OSSemPend((OS_SEM *)&DispSem,+ z! N7 I. E1 P- i7 M. I/ \
  84. (OS_TICK )0,
    / P7 `% ^- _$ @3 o. J7 M
  85. (OS_OPT )OS_OPT_PEND_BLOCKING,
    - v& A$ `+ L0 J1 f
  86. (CPU_TS )0,
    ) s& J8 W: f: \: k
  87. (OS_ERR *)&err);  y8 |/ ?$ @7 U/ ~# `' H8 p
  88. }
      w" q, I# o% t
  89. & N& R' K% x% A! L
  90. void GUI_X_Unlock (void)(6)' F5 [9 R6 D5 v" r( m
  91. { ! F' m# U( P5 Z9 O  w" G
  92. OS_ERR err;8 P$ \- K1 |2 l; Z
  93. - T2 Q. b' `8 M" w4 V1 E
  94. OSSemPost((OS_SEM *)&DispSem,
    2 d+ Y5 w) E" Y+ f+ O! p
  95. (OS_OPT )OS_OPT_POST_1,2 u) ^% V0 Q' {9 H0 m, U
  96. (OS_ERR *)&err);
    4 i7 r, Z; }5 s8 n% }8 ^4 L
  97. }
    ) T( g( k1 Z* a/ R- y

  98. 3 V3 P- [! \( g" C
  99. & C! B) I& \+ N! ^9 }
  100. U32 GUI_X_GetTaskId (void) (7)
    3 m  P6 |; T' E$ h8 K5 e$ M. b
  101. { / M4 G9 g( O' |" A& G
  102. //由于存在同优先级的任务,这里不知道是不是可以/ L. g- j) Q! |5 O
  103. //uCOS-III中已经没有任务的ID
    1 S( p- H) _+ W) ]$ f# z8 Y
  104. return ((U32)(OSTCBCurPtr->Prio));
    / a8 Z+ @; U# E5 Q, _) I0 @, V) G
  105. }
    9 j' [; T1 c: X
  106.   h. ?) d4 `+ t
  107. /*7 `3 M/ X* S- y. ^  o" H! M% |
  108. *********************************************************************************************************; B( J6 s2 l2 a7 R3 f! ~
  109. * GUI_X_WaitEvent()
    . X$ s- X( {; `
  110. * GUI_X_SignalEvent()
    ' g! n* N% j0 C- Z! h/ c/ X
  111. *********************************************************************************************************% M9 p% w+ u, ^0 f
  112. */
    * Y9 _; ~4 T. j, l1 u4 l

  113. , r  y$ c! B* @+ M6 t: n
  114.   }% r8 J4 e% m" \
  115. void GUI_X_WaitEvent (void) (8)
    4 m& B6 {: n; u  ~
  116. {; S' s) U+ w1 k, b! J; o
  117. OS_ERR err;% y0 ], ]! g% P6 D4 _$ I# ^' H5 x- o
  118. OSSemPend((OS_SEM *)&EventSem," S3 u3 K3 J7 ~# H8 }
  119. (OS_TICK )0,' r  L$ X7 q. {2 M( d$ A$ P( z
  120. (OS_OPT )OS_OPT_PEND_BLOCKING,, O, R0 N+ {9 O% Q6 K: X1 E- }2 W
  121. (CPU_TS )0,5 v$ B; [$ [6 q5 J  o
  122. (OS_ERR *)&err);% Z7 `8 @5 q* b5 l' P7 `0 q
  123. }7 K: D7 H4 L+ |" z. o

  124. % u* L0 f: F3 \0 w* T5 [" j0 ]
  125. & U9 v0 h: ], i, j1 d% [+ K- E
  126. void GUI_X_SignalEvent (void) (9)
    0 M. ~$ J* d1 u, T; M: E, C. P8 [
  127. {
    5 o, t+ Y9 ?0 k( G+ G
  128. OS_ERR err;6 D6 t5 _. I. q- p

  129. * U9 g% N0 I% Y0 P$ W# J
  130. OSSemPost((OS_SEM *)&EventSem,
    ) y* ]/ @- \+ B& G
  131. (OS_OPT )OS_OPT_POST_1,
    ; l" Z+ g  U& R+ M( g* d2 p
  132. (OS_ERR *)&err);! h1 Z2 Y, h7 |# ?5 k0 f0 B1 h
  133. }
    / ?1 H0 q! t- r+ M, [7 Q

  134. ! s! l) O$ y5 U
  135. /*
    5 p! L& v0 N" a. n" Q3 F  Q
  136. *********************************************************************************************************
    , D( G, M; r/ R+ L9 p( B# J
  137. * KEYBOARD INTERFACE FUNCTIONS, y8 B. C$ R, T# ^
  138. *
    8 d' ]5 A  d5 ~, Q
  139. * Purpose: The keyboard routines are required only by some widgets.1 `% V! \% B! O
  140. * If widgets are not used, they may be eliminated.! C, A+ ]; `& F2 y. }: M! M
  141. *
    8 o$ E- L# b. R# }7 `4 i( P
  142. * Note(s): If uC/OS-II is used, characters typed into the log window will be placed        in the keyboard buffer.
    + Z; R0 Q& N7 B  `& M; ]6 I% r/ I0 p
  143. * This is a neat feature which allows you to operate your target system without having to use or
    + e! M6 Y+ k7 j* V: w
  144. * even to have a keyboard connected to it. (useful for demos !)
    . T' g( y7 B3 S* t! W6 w
  145. *********************************************************************************************************
    ' X% X6 z! S: {; H2 ~
  146. */) ~9 u! K) D) n/ W8 m
  147. $ B# q2 x% E$ H$ s7 P
  148. void CheckInit (void) (10)3 Z9 {+ j- Y. }, |, W& p5 k* p: X1 K9 o
  149. {
    / H+ i+ D, N- G9 p1 n: e+ s
  150. if (KeyIsInited == DEF_FALSE) {
    8 @) [- \3 C6 h3 _  z/ ~1 _
  151. KeyIsInited = DEF_TRUE;
    $ v+ c# ?; b# M& d, e3 G( N
  152. GUI_X_Init();. e" [6 d# P$ S1 S  A: I) b
  153. }
    + ?1 c, r5 L! G
  154. }! y7 p- Y. M9 |' O8 R& Z7 F

  155. ' t/ j6 V& E5 _( k- r4 y
  156. void GUI_X_Init (void)
    2 q! G, U2 s- V! S5 I
  157. {% A; i1 C# _2 |' |& T  R
  158. OS_ERR err;
    : A# O& c: H( U9 _' N# |- {
  159. OSSemCreate((OS_SEM *)&KeySem,
    7 ~( U3 [, `7 D( Q# Y: D
  160. (CPU_CHAR *)"KeySem",* a4 x4 j9 {3 g: `9 }
  161. (OS_SEM_CTR )0,3 H  p# i: P5 s+ Y
  162. (OS_ERR *)&err);
    7 Q8 V. y7 \6 i& `8 j
  163. }
    0 g7 ?3 M# s( [

  164. 0 S- n4 h8 d$ A/ b3 i/ m- f9 ?
  165. int GUI_X_GetKey (void) 4 ^: @; P8 s, ?( ~& A  ]/ s
  166. {
    6 m7 M$ H5 }+ M* ~' Z! l6 |
  167. int r;% C; p# J. ^$ K. B- R: C, W

  168. 8 Z3 \: J# x: K4 I9 _
  169. r = KeyPressed;5 g. t8 I. l# G/ _5 @
  170. CheckInit();
    ! G  C6 L  d+ V5 K( m1 I  Z
  171. KeyPressed = 0;# I/ t" V+ s; \; ?+ u3 D
  172. return (r);
    ! o  \+ G! M/ n  Z
  173. }" r. L1 Q& V, R( U' @6 A$ p
  174. " ]  g- J0 ]' u4 k7 B6 j1 L
  175. int GUI_X_WaitKey (void)
    . J% B$ i1 H( q
  176. {
    ; L- p2 `. ^) ~  G6 t
  177. int r;
    $ L' J* i1 Y  R
  178. OS_ERR err;
    ) D0 ^1 a- F# z- I* i$ M! A/ `
  179. 4 J# o% [& _8 f" d* Y8 h6 `
  180. 7 ~# O% ?$ v( y1 m; }6 b; b
  181. CheckInit();, q1 u7 T  ~4 K7 w
  182. if (KeyPressed == 0) {
    . G5 G  y% g' Y
  183. OSSemPend((OS_SEM *)&EventSem,1 c* x6 h- d8 t! D/ d: C
  184. (OS_TICK )0,
    8 j8 I( j* J* l
  185. (OS_OPT )OS_OPT_PEND_BLOCKING,
    . F: |# V! C8 v% v# n( U, Y0 Y5 s
  186. (CPU_TS )0,9 t* n+ f7 S- c3 a& J1 b0 J% D
  187. (OS_ERR *)&err);0 p/ \7 ?* A6 }' D/ M2 \4 i: X' \
  188. }! {! G) P% L: S3 h' H
  189. r = KeyPressed;3 u# c7 I% W1 T  s+ x( Q7 c0 W
  190. KeyPressed = 0;* e' r: K7 M! i1 r
  191. return (r);
    ' r8 E% m2 N3 d; \; S
  192. }
    # D0 L6 M% w: L
  193. + h: i! P+ r$ w: `( }
  194. void GUI_X_StoreKey (int k) ! J8 o) Z" j* a, Z. b5 |
  195. {' d9 |$ x. {5 K1 @6 u7 ~
  196. OS_ERR err;
    ( L' I9 I# T3 i$ y" n0 E$ V4 L( E
  197. KeyPressed = k;
    / P. K& @) C% v( W" S5 |1 L( y2 @
  198. OSSemPost((OS_SEM *)&KeySem,
    ! [, m" c/ O! m4 D9 ?2 j2 U% _) ]
  199. (OS_OPT )OS_OPT_POST_1,' o( t9 l% {$ V/ l& q3 G; }  \
  200. (OS_ERR *)&err);+ p4 \. e" F' J8 A* P4 ~
  201. }
    " y5 |6 F: ?5 `) s+ p
  202.   i$ Q# T% J( J  _7 q. D/ r$ b
  203. void GUI_X_Log (const char *s) { GUI_USE_PARA(s); }(11)
    9 T: \, m2 E* {( o# {
  204. void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); }# N" W6 U9 L3 `$ R9 C2 k
  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. /*
    6 G) |: |# z5 r/ @% [; N5 \) J
  2. *********************************************************************************************************
    8 L) G. N- r8 e, V  m* G
  3. *        函 数 名: AppTaskGUIRefresh/ ^" u( G$ x/ |7 i6 R1 O
  4. *        功能说明: emWin刷新函数
    9 u& |( m9 U) ?4 v* \
  5. *        形 参:p_arg 是在创建该任务时传递的形参5 U7 w3 n* l7 y7 G! ]+ l
  6. *        返 回 值: 无
    / m6 q4 }% V8 d5 b2 v7 _5 G
  7. * 优 先 级:OS_CFG_PRIO_MAX - 3u
    , n, g" y8 s- s+ K3 n3 X* [
  8. *********************************************************************************************************
    3 i' W) G, k0 ?; J) r7 K
  9. */- E6 g( Q7 I7 Y/ q4 n0 S
  10. - ?5 w) a! d" t, r. U
  11. extern __IO uint8_t s_ucRA8875BusyNow;7 j% `# r2 B9 f/ d; i
  12. static void AppTaskGUIRefresh(void *p_arg)
    ! N, {' `) S: _. y+ M7 f* m# X- Y
  13. {
    + a. A2 ^0 s1 K, m6 e
  14. (void)p_arg;         /* 避免编译器告警 */
    8 T" \' W, }+ c5 a3 l/ w0 t5 K" \4 W
  15. while (1)
    + ]( I) N3 L! E& V! ~' e3 ]$ `
  16. {
    / Q8 `( {% W5 ]6 U4 w$ t3 s
  17. /* RA8875 触摸*/0 J! L* h$ u' a* t
  18. if (g_ChipID == IC_8875)
    # W! m9 ~1 r) W" t) A- e
  19. {
    : V4 U4 Z% g/ x; J/ R9 E$ G
  20. /* 资源共享标志 */
    3 E9 i( U# l" W1 _0 V+ j) ?. ?: t' o
  21. if(s_ucRA8875BusyNow == 0)+ \6 i2 g+ P; u* p9 P) ^
  22. {
    ) z' R& o7 _' J8 d1 D: p7 V% K% [; ^
  23. GUI_TOUCH_Exec();
    / T, Z9 z. m9 l7 L. d; s8 O
  24. }
    2 E9 d' D. D: k2 E* u
  25. }3 X! [1 m3 B7 e& d
  26. /* XPT2046 */0 n$ [* s% X, u* D9 C* e
  27. else' F, I3 [5 K  I
  28. {1 c, T5 ]! Q. V# M' q( q1 v
  29. GUI_TOUCH_Exec();
    : u6 x8 p# a& N3 r& d( H, j' _
  30. }2 Q3 t& \8 j! G
  31. / Z9 s" C7 @0 ^$ t$ l% i, x& G* {" q
  32. BSP_OS_TimeDlyMs(20);
    ' q2 t5 A1 X% {# k3 ?
  33. }
    ( f9 G! _* [0 u  w+ ^5 N. U: R
  34. }
复制代码
29.2.3 STemWin任务
  1. /*0 [& {- u2 i3 @
  2. *********************************************************************************************************& E/ Z% j! Z  c) z
  3. *        函 数 名: MainTask
    $ R- S, ~* {6 Z6 k1 e' O6 {
  4. *        功能说明: GUI主函数% q& T6 [# \# y7 Z! U& E
  5. *        形 参:无& B& {$ {# Q. t$ [
  6. *        返 回 值: 无" Q9 X' F- r/ H. Z8 O
  7. *********************************************************************************************************2 A; t0 j: {3 L7 M/ o
  8. */* F% r" ?- B2 A% u# r$ O
  9. void MainTask(void) 3 P  t$ G2 {% u/ ?. U' W. g
  10. {
    % P4 N2 l  ~7 b: M1 Z4 S6 ^
  11. GUI_Init();9 y, v& s8 J4 `- R3 W! f4 x
  12. GUI_SetTextMode(GUI_TM_TRANS);
    ! L7 e' ~  V2 L2 v, R- V" _2 U+ B
  13. for (i = 0; i < 3; i++) . q& U% j3 f2 m% N& f, G5 @: z
  14. {, o8 _2 F4 P0 w! v% i3 a
  15. GUI_SetColor(GUI_BLUE);
    & K" D' p" E5 v( K7 w: c# `
  16. GUI_FillRectEx(&Rect);. }* W, r" m! r) }- s
  17. GUI_SetColor(GUI_WHITE);8 C7 h3 X8 a; w6 X6 R# L& Q& l
  18. GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
    4 n) I5 A1 }) ^6 b, y
  19. Rect.x0 += 60;: E% o. z- u: Q
  20. Rect.x1 += 60;, s. `2 {7 X/ U
  21. }( k7 X4 Z4 f+ K' n/ Y8 p/ y
  22. while (1)
    ; B/ |4 L. Z. a3 e
  23. {4 k' s  j: Y1 S7 q1 i
  24. GUI_Delay(10);: O( f+ @& h# A# X8 a  M$ |
  25. }/ B$ F1 b7 W0 O9 {6 c! m
  26. }
复制代码
这个例子整体的显示效果如下:
29.3.png
* l6 A% [( l1 x5 ]
baiyongbin2009 回答时间:2015-2-12 14:37:10
29.3 多任务系统:多个任务调用emWin
    这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。
29.3.1 uCOS创建三个STemWin任务
这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
  1. /*
    . z0 P$ ~) K/ F# t5 s6 k
  2. *********************************************************************************************************; E; x2 y& z& A* H% k% y
  3. *        函 数 名: AppTaskGUI
    $ k. m! W5 B/ G" v5 y7 G
  4. *        功能说明: GUI任务06 k4 Y! v+ G, G. P. P0 c
  5. *        形    参:p_arg 是在创建该任务时传递的形参* E/ v5 ~& n( r+ z& C
  6. *        返 回 值: 无5 [4 V9 j/ o' t/ h
  7. *   优 先 级:OS_CFG_PRIO_MAX - 6u
    $ u: t+ F3 y) L/ \$ Q
  8. *********************************************************************************************************5 `/ y( l7 d/ B$ m1 ]- E: `2 M
  9. */3 C+ b/ x( o& c4 @
  10. extern void MainTask(void);8 z: H6 `$ [; [, a9 X
  11. static void AppTask0GUI(void *p_arg)& l) [" @6 x) g: j! g: Z& @. K; H1 O$ Z  @" d
  12. {
    8 w. u. M% a( C% b6 r8 k" F
  13.     (void)p_arg;        /* 避免编译器告警 */5 O. n7 m; x* R7 ^; r
  14. while (1) 6 ~, e' R8 t1 K0 g
  15. {
    ) I) D6 C2 T. N. [; V8 k# c8 ^6 c- [. L
  16. MainTask();
    5 c3 c8 f, {/ X: h3 Q# o
  17. }
    1 ]& Y4 z* j4 B) {+ |7 j. T
  18. }
    " R9 C, [$ U  I$ X/ v

  19. : }- j0 k+ V/ ~4 y% U0 W0 X4 c
  20. /*
    # A( ~$ g) c9 |6 G
  21. *********************************************************************************************************$ A; v* [; N! p$ o
  22. *        函 数 名: AppTaskGUI; k: e% I+ a0 z9 p
  23. *        功能说明: GUI任务1
    % W' Q- r" ?" D
  24. *        形    参:p_arg 是在创建该任务时传递的形参
    8 W4 D4 n3 U) I4 P4 F/ r1 y
  25. *        返 回 值: 无- z6 P- Z( k. z" H) w. o, ]
  26. *   优 先 级:OS_CFG_PRIO_MAX - 5u: m( k2 f3 ?3 B' `
  27. *********************************************************************************************************# I: [" t( k" h' s5 Q1 k( m
  28. */
    8 ^( `  r* M7 h+ ]7 e+ \$ p
  29. extern void Task_1(void);% ?0 q% w/ ^# W. ~3 r) N! }! _' B! ^8 Z0 R
  30. static void AppTask1GUI(void *p_arg)& q, P) \' A7 `' ]3 j- F
  31. {
    + ~% q* L) ?9 j& W
  32.     (void)p_arg;        /* 避免编译器告警 */
    ; ^. K. u: k/ D! D
  33. while (1) $ P( G" [- z# G  `
  34. {' X. w/ e7 [1 X3 T
  35. Task_1();% c1 V: s; n: a! z. g
  36. }
    ( y& y" g9 F, D- d1 e: H  ~6 ]- H
  37. }7 v8 X; l2 L' z) ^
  38. ( u: t$ `: L" T5 Z
  39. /*
    - {5 b9 q2 L* L3 f: G& f
  40. *********************************************************************************************************: G% d8 N( A0 P4 b& \: x5 G& p" V
  41. *        函 数 名: AppTaskGUI
    * R( o! {7 _5 F0 P! l; g
  42. *        功能说明: GUI任务2
    " h/ C9 F* [" v
  43. *        形    参:p_arg 是在创建该任务时传递的形参
    ' y' x+ x3 x5 E2 H$ F
  44. *        返 回 值: 无' }4 j2 F" R2 ?/ b
  45. *   优 先 级:OS_CFG_PRIO_MAX - 4u* y& B0 t* Q% h4 B
  46. *********************************************************************************************************
    6 e4 a0 W" D. Z, x7 N. G+ y( B
  47. */
    ) W8 \  c& E3 G4 T1 v* m6 r
  48. extern void Task_2(void);. ~8 K- _8 i2 U% W, o# m
  49. static void AppTask2GUI(void *p_arg)
    8 y  `1 @- E. q6 `5 w0 w* p
  50. {
    8 s" y  D! v: t/ f& W  S/ ?% t# c
  51.     (void)p_arg;        /* 避免编译器告警 */" w2 U( m+ n( j3 Q0 q% I
  52. while (1) ' V" z+ `6 {+ L8 @; ?
  53. {
    ( z, U+ z  u, Q4 `
  54. Task_2();
    ! o& K0 E) J3 B- T" V% V
  55. }! h- E# S0 b8 g7 B' e
  56. }
复制代码
29.3.2 STemWin任务
建立的三个任务所在文件夹:
29.4.png
MainTask文件中的任务:
  1. #include "includes.h"
    & s2 z+ \6 v( \! W4 p+ g
  2. #include "MainTask.h"
    ( d/ X5 z, [1 E, B5 \7 v1 m/ ?* }
  3. : j7 O' x+ b6 i+ P; ~' k. }" g/ U

  4. ; f  h9 _5 d2 S( y1 c) R) _
  5. /*, [5 W& z& B+ V5 ?# g# \; Y1 ~! e
  6. *********************************************************************************************************6 G" H3 H, A9 r3 O" c% o  ?
  7. *        函 数 名: _cbCallbackT0
    - ~5 L3 q3 l. E- P1 ]
  8. *        功能说明: 任务0的回调函数
    / F: R/ Z% |7 r! }9 c; R
  9. *        形    参:pMsg  消息指针% f& f1 M+ F8 s, h
  10. *        返 回 值: 无
    2 V, e6 n) r; l! E3 w! E  M0 `
  11. *********************************************************************************************************% M  C/ g+ ^' Y" E1 E
  12. */' z: i% G9 E- m9 n: R2 @
  13. static void _cbCallbackT0(WM_MESSAGE * pMsg)
    & p' v" o# l- t4 Y8 K: H/ I& o
  14. {6 O( a- e+ |4 n( _) {6 o
  15. switch (pMsg->MsgId) " m: X8 A! G* T: Z" c) F" [
  16. {
    9 a- I  X! c6 d3 w- V/ `
  17. case WM_PAINT:
    8 J" [8 H, q2 K3 i
  18. /* Handle the paint message */" m0 @/ A  L6 g$ p2 I  f
  19. GUI_SetBkColor(GUI_RED);% R% A# F5 j% I. W: }. l
  20. GUI_SetColor(GUI_BLACK);
    % c) J/ ?1 R4 d9 O
  21. GUI_SetFont(&GUI_FontComic24B_ASCII);& I. |3 Q- }3 J4 Z2 w3 U* f3 S
  22. GUI_Clear();$ q; [4 j. c! e4 o. d* m9 S9 K8 v
  23. GUI_DispStringAt("Task0 Moving", 0, 0);$ L; m; _+ W! F. ]0 e: m/ ?# B
  24. break;
    " ~1 y% t9 {3 z$ x& F- Y1 H: x
  25. default:4 N$ ~7 m' {* [+ k7 G2 L/ R
  26. WM_DefaultProc(pMsg);
    5 n4 c! T9 [* T- X
  27. }3 i5 [. n7 k% J3 ~! n8 y9 y
  28. }: [; d& [7 W$ J/ Q$ n, j: I
  29. 0 u  |8 y7 M9 N& Q
  30. /*' t3 Q8 j: f, B
  31. *********************************************************************************************************; @: o2 u" e/ P3 j6 _
  32. *        函 数 名: _cbBackgroundWin
    6 E$ E1 Y( l& y3 M* e( ~# h+ x
  33. *        功能说明: 背景窗口的回调函数( v1 N* Y& o6 h
  34. *        形    参:pMsg  消息指针
    7 Z* M4 t0 `4 P" }( t
  35. *        返 回 值: 无
    $ b! }2 E- w: o
  36. *********************************************************************************************************
    , ]9 q2 T+ z8 B5 Y
  37. */9 A# Y8 v* T) x3 D
  38. static void _cbBackgroundWin(WM_MESSAGE* pMsg)
    0 o5 r# Q4 |/ @- M3 o2 H1 O, Y' [
  39. {: Q, w4 ]. _3 Q, ~1 s- m
  40. switch (pMsg->MsgId) + z! Y" y9 p9 K/ Q+ f
  41. {
    : W( M( A6 G- J' o$ Q
  42. case WM_PAINT:; J; i  A/ o6 j( ^# t
  43. /* Handle only the paint message */
    ) c" X9 p# \/ Q$ `& @- Y3 j
  44. GUI_SetBkColor(0x00CC00);
    8 x0 O- f6 `. I: l: G  M  n
  45. GUI_Clear();7 ]( O* O; f6 ]7 F) H' I! b
  46. GUI_SetFont(&GUI_Font24_ASCII);* n2 I( V: D4 c% m" r, v& H
  47. GUI_DispStringHCenterAt("STemWin - multitasking demo\n", 159, 5);
      u9 e& L; O; z8 C, H2 J
  48. GUI_SetFont(&GUI_Font13_1);
    5 p0 p% h& L8 [5 ]* r, a# J# R- v
  49. GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35);
    0 a; F* v1 h3 ^; e
  50. default:
    . H" g! ~! V  d9 Z4 n
  51. WM_DefaultProc(pMsg);9 C% F, y. d: n
  52. }
    ( i0 w6 j0 b* L
  53. }
    & W1 ?/ N# z2 X/ v# n  l: ^
  54. 3 F  ]8 n/ @( i# B5 ~( q
  55. /*: W1 v. n$ f* n' W
  56. *********************************************************************************************************1 j. C, z) V+ }* e( v3 \
  57. *        函 数 名: Task_0! x5 R  z% V  u, J. U9 d, @
  58. *        功能说明: GUI任务0( S" m: [: [* d; t" Z6 n
  59. *        形    参:无# S' L/ Z" s5 \; B
  60. *        返 回 值: 无9 G1 h/ R( P4 e! e1 r
  61. *********************************************************************************************************0 Z/ c! W3 Y- L
  62. */, |& u- W  d3 P; g6 Y6 D. _* ^
  63. void Task_0(void)
    7 p% I# @3 u* b; }
  64. {
    9 o4 u# K3 E5 v* Q7 b2 k# g; x7 K3 W1 \
  65. /* Create frame window */- y/ b3 F* s. Z
  66. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 230, 200,
    ( X- a5 e( ^9 R6 \- a  c8 j
  67. 40);4 I3 ?" v* d# B( A3 _  {+ b
  68. /* Create child window */
    8 q' W; h, g) }& Y: @, h4 C; M
  69. WM_HWIN      hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), 5 `8 }) t' w4 P6 x/ N
  70.   WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT0, 0);. [$ G7 F1 j- L% @2 C. a
  71. FRAMEWIN_SetActive(hFrameWin, 0);
    , k, a: a3 ]- c5 p- G
  72. /* Make sure the right window is active... */5 u+ E1 @7 c! ?
  73. WM_SelectWindow(hChildWin);
    4 [6 L; T6 W* C2 M4 Y- U  G
  74. /* ...and the right font is selected */
    ' U; {3 x) G$ [1 ?6 c/ K
  75. GUI_SetFont(&GUI_FontComic24B_ASCII);$ G/ X) W, u, C! K
  76. while(1)   o5 C. E* z  [+ a' L$ ~7 v" \( B
  77. {$ x4 i9 S2 u# J% O9 C/ c
  78. int i;
    / c* N) H! N( r& q0 i1 r) o
  79. int nx = 80;+ ~5 G+ i$ b0 M
  80. /* Move window continously */* ^6 r4 d, E, k/ Y( S: Y9 F  f! u
  81. for (i = 0; i < nx; i++) ; U* J" d- h  o
  82. {: |" C& _1 S4 C
  83. WM_MoveWindow(hFrameWin, 2, 0);
    $ P$ B7 A4 Q% f( {* {1 p& h% r
  84. GUI_Delay(50);
    9 O9 t9 l/ b5 C; P
  85. }0 d. q6 v3 d# P* |9 F9 Z) @" j1 s
  86. for (i = 0; i < nx; i++)
    ! d4 |9 Z$ f2 a. D+ l
  87. {/ o' E: m$ a, j" o8 {
  88. WM_MoveWindow(hFrameWin, -2, 0);! h7 Q  r! |4 k, j0 V
  89. GUI_Delay(50);
    7 v6 Z: u$ \9 N# h9 ]$ H
  90. }
    1 @& f- k6 c" L' X; C
  91. }8 |! ]6 c! s1 c6 U/ D- P( l
  92. }. E$ ?" S/ i2 _  w8 n. l1 @6 M

  93. * q  D8 Z! D1 X4 C1 f2 v$ I
  94. /*
    # g4 B1 R8 ]+ p. `
  95. *********************************************************************************************************& h9 X. a/ v" Y. i
  96. *        函 数 名: MainTask
    ! O9 J2 k6 L, k
  97. *        功能说明: GUI任务0* I& F# E6 [3 a' Z  _& S$ e. p
  98. *        形    参:无
    4 g& I: _8 u- N2 \' V1 c
  99. *        返 回 值: 无- D, f5 j- h7 b, o% c) z/ v
  100. *********************************************************************************************************' a5 a* b" f/ f4 S- i; V, U* X( R! }
  101. */
    + _4 k! T$ D$ c5 I% V' B
  102. void MainTask(void)
    6 L, s5 n' G0 h' ~" _& ?1 V3 b7 V+ g
  103. {
    , F6 y4 c/ t+ l, K! E) f
  104. GUI_Init();
      f# U2 O! |: ]' l' w
  105. WM_SetCreateFlags(WM_CF_MEMDEV);              , n! w. J9 m+ A
  106. WM_SetCallback(WM_HBKWIN, _cbBackgroundWin);
    $ f8 G6 l/ }$ @2 `7 }
  107. while(1)7 f) W  j3 u. {; {% M$ C; z/ b
  108. {: T3 X5 R  w6 b( w' B6 b' D  v
  109. Task_0();" S( r) P# D* N, n" W
  110. }
    7 G, F2 u7 l  \9 D3 ^
  111. }
复制代码
App_Task1中的内容:
  1. #include "includes.h"
    . L! L# \  F/ b& @3 x+ W
  2. #include "MainTask.h"! ]8 r+ K3 Y* Y: v( Q; P/ F
  3. 1 O8 \/ C6 S& ]( b" t: h" j

  4. 2 r# M, J- f2 h8 W+ E
  5. /*
    3 e1 O* P' u% e: M+ a9 |
  6. *********************************************************************************************************
    " B. V4 k/ D2 {! k
  7. *        函 数 名: _cbCallbackT1
    3 C' V: S; V/ Y9 D- ^3 y- ?% _
  8. *        功能说明: 任务1的回调函数3 z6 A* o( @' ~6 Q! F7 ^5 d
  9. *        形    参:pMsg  消息指针
    & M+ V' @( I$ i6 ]- S/ ~
  10. *        返 回 值: 无1 j, s% h3 s7 D- K( `' r& T9 r' W" T
  11. *********************************************************************************************************
    % C: ]. H; u7 X3 x9 {1 d
  12. */
    " u, P. Q- c! X2 {  W$ t+ U2 V6 @
  13. static void _cbCallbackT1(WM_MESSAGE * pMsg)
    * ~8 N& f. T8 X: F2 w
  14. {' I5 U, Y" R5 `
  15. WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);0 y$ L: i& e" h& J
  16. switch (pMsg->MsgId)
    : ?. @6 \. R8 S0 r0 k
  17. {
    , I/ W/ _5 {6 x2 M! B, T
  18. case WM_PAINT:
      k, C/ X  e  H( `, O7 Y' O- l
  19. /* Handle the paint message */2 g& f" q  M: a7 ~. y0 N
  20. GUI_SetBkColor(GUI_BLUE);# X6 u- F: Y6 K. P
  21. GUI_SetColor(GUI_WHITE);7 p$ T! W& |6 [- B! Q3 O
  22. GUI_SetFont(&GUI_FontComic24B_ASCII);
    , {1 R; e3 B5 z! K4 o8 K7 K
  23. GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    ! f& Y9 v, H, m* m: g
  24. GUI_Clear();
    " a6 H. G3 I5 |2 l; j9 V& |* I: Q6 C
  25. GUI_DispStringHCenterAt("Task1 window...", $ [. M2 w  d! |5 X6 Z& m
  26. WM_GetWindowSizeX(hWin) / 2,
    9 H. e" q  o2 u1 ^) F1 @% T4 X% Y8 b
  27. WM_GetWindowSizeY(hWin) / 2);
    7 ], k0 R, Z5 e* s
  28. break;2 J' k7 ^; c9 T' ]/ R2 o  r" v
  29. default:9 r- E5 A6 ?* Z7 q( w
  30. WM_DefaultProc(pMsg);! o6 V  L, c) }  U5 b4 F- a8 x
  31. }- i, R4 l8 M$ V. U3 O2 r' A& B. x
  32. }( R, w) B! [1 D4 W# D2 v. P

  33. $ f# u+ O0 `2 N/ L
  34. /*/ l: T3 |  B( d4 k9 b. h& l
  35. *********************************************************************************************************$ @/ X0 v& e( l/ m) \( v
  36. *        函 数 名: Task_1
    " i  P7 p* `. B0 t
  37. *        功能说明: GUI任务0, V- I5 `" `& S: s4 X/ l+ s0 {; F' ~/ n
  38. *        形    参:无
    9 H! N0 w& P6 r3 W% }/ a* A
  39. *        返 回 值: 无
    ) j) V- {$ C% y2 M$ y7 h8 {1 j% b
  40. *********************************************************************************************************4 r- l2 a; g0 v! h2 U- G
  41. *// c% q4 E$ y0 B+ w6 C0 i' k
  42. void Task_1(void)
    & {9 z+ u6 ~9 R& X
  43. {
    ! g5 {- k0 y% W1 ~
  44. /* Create frame window */- N  s1 X7 H4 h
  45. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP,
    ( y6 G& z7 p' l3 _9 H8 |
  46. 20, 170, 200, 40);: p1 R8 [( r$ n, l
  47. /* Create child window */
    ! j, O9 t8 u8 H4 X8 M
  48. WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW | 8 N1 d+ L- P0 x; l. D
  49. WM_CF_MEMDEV,_cbCallbackT1, 0);
      q! z( i/ K7 @4 U: z
  50. FRAMEWIN_SetActive(hFrameWin, 0);
    0 s) ?3 M! o+ A/ A' ~
  51. while(1); z/ H3 Z4 B& {; f
  52. {/ \! r' ^) j0 ]/ V  v
  53. int i;
    # v4 g8 i: ?4 ]; G
  54. int nx = 80;( N; G3 n3 {" z& e! t
  55. int ny = 90;) y2 ?% |, c' k' B% B% X
  56. /* Move window continously */" A; ~2 q& y' Q+ _( Y  p
  57. for (i = 0; i < ny; i++)
    3 P; R; ~# ]9 \; d2 x5 W0 n
  58. {! b3 [6 b" A2 ?2 x+ n6 n
  59. WM_MoveWindow(hFrameWin, 0, -2);, B( E7 }+ A0 c' R+ {, Y6 v
  60. GUI_Delay(50);# p; i5 s. b& D
  61. }
    : f) ]% F# Z. A! d$ N/ g# ^
  62. for (i = 0; i < nx; i++)   ]% d( P1 S* e" _2 r
  63. {
    ) N/ Z; u* P2 G. R- a( f9 e
  64. WM_MoveWindow(hFrameWin, 2, 0);
    4 j% L. }7 |. H/ K; B/ H
  65. GUI_Delay(50);6 x" a- H  f  v4 Q5 a, d
  66. }  M4 g# M9 z) G5 G
  67. for (i = 0; i < ny; i++)
    / |8 o2 e* N* Q$ U% d/ b
  68. {2 Z9 S! t( ?6 }- S7 {5 o% f3 w
  69. WM_MoveWindow(hFrameWin, 0, 2);5 n+ l4 }( D4 W3 O. g
  70. GUI_Delay(50);: z; Q7 ~  g! p( a1 _7 z- N
  71. }3 Y, |: L5 {1 d' }2 c+ h0 S
  72. for (i = 0; i < nx; i++) ! [" X# [. u- V2 I
  73. {" F/ O0 i* ^9 ]0 F/ R! z
  74. WM_MoveWindow(hFrameWin, -2, 0);- J; C; T# |* k" U2 J3 B! {
  75. GUI_Delay(50);9 P# B$ g& ]$ w4 O& \5 n! m4 N
  76. }
    + A. @* Q/ `: \+ Q2 \
  77. }
    " `" J" ~- O+ Q( n5 f
  78. }
复制代码
App_Task2中的内容:
  1. #include "includes.h"
    2 `% x5 ^* [1 o
  2. #include "MainTask.h"
    2 d+ L' k5 D' ?9 G( y+ g

  3. 2 S, c, Q; Y) u+ |/ Q  x: I+ S8 @
  4. /*: E  }* j! C: Y. j8 D7 A5 Y
  5. *********************************************************************************************************2 Y. E( x& C9 ]
  6. *        函 数 名: _cbCallbackT2
    0 J5 j3 l5 Z% p' }9 O8 `+ Z1 f; b9 y
  7. *        功能说明: 任务2的回调函数
    " U9 {& b& D+ s/ H: e, I
  8. *        形    参:pMsg  消息指针. h4 W7 f* j# Z
  9. *        返 回 值: 无
    ) m# v7 D2 N! {
  10. *********************************************************************************************************
    . f! O6 D/ T  Y. A
  11. */
    1 U/ F/ n: N$ ?0 D
  12. static void _cbCallbackT2(WM_MESSAGE * pMsg)
      s3 X$ ^' ?: g; ~" T: L
  13. {1 L# x/ w) w( ?2 W# P- q8 D) k
  14. switch (pMsg->MsgId) 1 T  I) M1 r5 f# c! t! K
  15. {4 D* c4 W4 M- C" S9 g) Y' e0 M4 p
  16. case WM_PAINT:. v- u5 h; P' i5 I: t4 A! i
  17. /* Handle the paint message */
    3 w/ `+ V  L9 p' J
  18. GUI_SetBkColor(GUI_YELLOW);& B. U9 r3 F% c% h
  19. GUI_SetColor(GUI_BLACK);* H' w. ^- |2 ^; {9 U' _
  20. GUI_SetFont(&GUI_FontComic24B_ASCII);
    " u( Y& s$ N+ A) X% m6 r/ v, X
  21. GUI_Clear();
    8 t: o% L  C+ f  o, S) Z
  22. GUI_DispStringAt("Task2 Moving", 0, 0);
    3 ]' n# U" ~* A7 E( b
  23. break;9 a* Z% o/ `9 y" L1 N
  24. default:
    / {0 [7 }2 i: L3 D
  25. WM_DefaultProc(pMsg);: O8 k' J, w4 J  z( t
  26. }; K% e7 l; O% s
  27. }0 Q# P4 Q% S) z4 y6 w

  28. 0 x2 |* `6 |2 x6 G7 g
  29. /*" l: t) V$ Z; W$ K
  30. *********************************************************************************************************5 \9 I: X# z& \: O! D# _' H
  31. *        函 数 名: Task_2
    & a$ m/ g, y9 ^
  32. *        功能说明: GUI任务04 E: E( e+ p1 F. Y( x% X, w
  33. *        形    参:无
    / B* c; Q& F: ~" @% {- `
  34. *        返 回 值: 无
    0 O0 G, b0 A9 t+ h9 {" t
  35. *********************************************************************************************************( t& b8 A2 n# Z0 I0 [
  36. */# y; g" a" B+ Q( l
  37. void Task_2(void)
    1 Z3 T$ h/ [/ o5 ]
  38. {, Y/ K. `7 @6 j# Q# H& X) m) O
  39. /* Create frame window */
    ) \$ G4 C4 }8 U& H8 x
  40. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 2",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 190, 200, 40);
    ' R) c4 D5 p9 q- x& }* B0 s+ Z
  41. /* Create child window */
    5 X$ Z5 g5 j( z1 z7 }
  42. WM_HWIN         hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), ' c1 z6 `9 O/ c0 Y) ~9 z$ G) d
  43. WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT2, 0);
    % \$ N1 Y; _! z( i
  44. FRAMEWIN_SetActive(hFrameWin, 0);3 i7 E' A0 M" W4 e8 x: l
  45. /* Make sure the right window is active... */
    ; s! B. L1 k& s5 e7 E
  46. WM_SelectWindow(hChildWin);
    7 o! K; {& ~) [$ a3 S2 S: r
  47. /* ...and the right font is selected */. N, g$ [. w, Q6 U. X' ]* v
  48. GUI_SetFont(&GUI_FontComic24B_ASCII);
    * ~- ^$ \  W0 V( s: X: i  B
  49. while(1)
    " ]4 {% {' L* v, B( F% h$ A
  50. {! ]9 @9 a2 U9 {6 d* b  u. @
  51. int i;3 V- y8 _" |1 }! g( O0 f' Z  `
  52. int nx = 80;4 r- a0 F4 S- e4 ~( R2 `$ f
  53. /* Move window continously */
    ' i: C; T" [1 C* H0 S: S$ `
  54. for (i = 0; i < nx; i++)
    3 m1 g5 }' r8 f  @, w, [4 G3 o
  55. {; `# \7 `# r$ ?& Q% [
  56. WM_MoveWindow(hFrameWin, 2, 0);
    ; H9 c) H; C9 o
  57. GUI_Delay(50);
    : C( [: r, l; X7 B( x( h4 D* B* k) a( s
  58. }! w# c0 m* c2 X$ g8 |  }: W" t; u
  59. for (i = 0; i < nx; i++)
    6 @$ i# `1 p- J7 a# ?' H8 A
  60. {# R) H1 v0 L  J4 }  U! e
  61. WM_MoveWindow(hFrameWin, -2, 0);7 ]! }" t& o6 n1 a
  62. GUI_Delay(50);
    , Y0 k* p  S8 l/ {& Z0 i; v: r
  63. }
    1 j6 ^5 R5 D/ Y
  64. }
    1 H5 t: i+ }" E
  65. }
复制代码
这个例子的整体显示效果如下:
29.5.png
29.4 总结
    本期教程就跟大家讲这么多,希望通过创建的这三个DEMO让大家对STemWin创建裸机或者多任务系统有个整体认识,具体工程中用那种方式要根据实际的需求来决定。
/ E+ `; r; ~) @, H% e6 U6 h
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 手机版