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

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

[复制链接]
baiyongbin2009 发布时间:2015-2-12 14:32
本帖最后由 baiyongbin2009 于 2015-2-12 14:38 编辑
9 ~+ ]2 O: K+ l& [6 G" b! C& E( A
7 @  n* G# t6 |: `8 f( ~特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接( k( \. v. J9 `' A
第29章 STemWin多任务(uCOS-III)
6 H/ c1 x$ D3 K7 ~
    本期教程主要是在开发板实现上期教程中所说的三种系统。这里大家重点学习一下官方推荐的设计框架即可,如果有不懂的函数会在后面跟大家讲。
    29. 1  单任务系统(超级循环)
    29. 2 多任务系统:一个任务调用emWin
    29. 3 多任务系统:多个任务调用emWin
    29. 4 总结
29.1 单任务系统(超级循环)
工程代码的结构如下:
29.1.png
    关于移植的知识已经在前面的第二章详细讲解了,这里重点介绍时间框架和接口函数。
29.1.1 内核接口
    内核接口文件GUI_X.C内容如下:
  1. ----------------------------------------------------------------------: e2 g% i" w( @9 Y! e
  2. File        : GUI_X.C
    2 w6 y* d* e2 u
  3. Purpose     : Config / System dependent externals for GUI
    9 s. c* B3 F  x$ V: U% g% J
  4. ---------------------------END-OF-HEADER------------------------------
    - N. X6 t& V2 _, K- a
  5. */5 Q% X3 j  o; ~; p
  6. 9 d2 f9 z, m" K
  7. #include "GUI.h"
    4 r: T) j# Q7 H5 ~- q: e
  8. #include "stm32f4xx.h"
    ( i+ l: a% }. M8 a9 q

  9. 0 ?3 F/ l8 b+ E7 P% H9 F
  10. , A& a- I+ G' A' H1 l* y6 |$ t

  11. / n: D8 ?& M! Z2 P; [, {- k7 h! @: }
  12. /*********************************************************************
    6 y: Q6 d! X$ O( B. Q
  13. *9 j+ V' M2 j# q6 v& \
  14. *      Timing:
    . E* t: a" [+ `9 j% u% k
  15. *                 GUI_X_GetTime()1 i$ T0 t0 z# J4 Y( e- T$ l* X* T
  16. *                 GUI_X_Delay(int)( b% \- y0 e  I$ W( B8 g

  17. 4 c3 X0 ?4 F9 \5 P; @9 w& z, K
  18.   Some timing dependent routines require a GetTime; h& d+ y; o% @' F9 {  A5 S
  19.   and delay function. Default time unit (tick), normally is
    7 J; D8 ?" m1 ?) w) e9 @
  20.   1 ms.
    5 w6 @( V+ s+ U% k
  21. */
    3 g( G3 |+ B( R0 }2 K. X, [
  22. extern __IO int32_t g_iRunTime;(1)
    & X5 ]7 N% W. F; |# U
  23. int GUI_X_GetTime(void)(2)6 E: s& ^8 G0 O$ S9 T
  24. {3 D6 d5 b" ]- s7 b0 @

  25. " p4 F9 d$ v. u" M: x9 u
  26. return g_iRunTime;3 Z/ v, w5 y3 F0 j' n7 a! V
  27. }- E- @2 Y  r0 r
  28. : S7 y7 d2 R, Y. o  Q  w
  29. void GUI_X_Delay(int ms)(3)8 ^" x& v$ i5 t9 I
  30. {/ z9 f" p5 N' r7 w% a
  31. int tEnd = g_iRunTime + ms;  N- Q7 F% R( e* Z' H; q! L$ n
  32. while ((tEnd - g_iRunTime) > 0);/ {' X# \0 C# p2 I. Z
  33. }
    ' @+ D5 \9 @% l- o' |1 r
  34. : q/ e% f6 }: W) z6 i
  35. /*********************************************************************3 I. `% j7 U$ k1 F* f) H
  36. *( T6 |9 `, f+ p4 g
  37. *       GUI_X_Init()" y. b, P5 {1 D2 T, V
  38. *
    ( R! s5 y9 y" p1 X( ?& U/ j
  39. * Note:, ^: \- b9 Y2 h2 N( x
  40. *     GUI_X_Init() is called from GUI_Init is a possibility to init2 _' o5 N" V1 f2 J" _: p- B. r
  41. *     some hardware which needs to be up and running before the GUI.
    ( a! t- ^9 N0 d5 g" ?6 a
  42. *     If not required, leave this routine blank.
    1 J  [; C2 J0 K$ y/ d) L1 j5 o% E! R
  43. */
    3 f- c  k7 d8 L4 {* g/ o
  44. $ {( A) P2 ^& v' d
  45. void GUI_X_Init(void) {}
    1 @( A. G9 f; ?' \8 B* [( n- C, u' a1 [
  46. ) X- f9 ^% J/ B, n% k

  47. & o% D0 r8 `" w+ u
  48. /*********************************************************************
    ( ~. A, I; M6 X  s
  49. *
    7 W# v+ Z" F9 A/ W0 ~+ F6 P( d
  50. *       GUI_X_ExecIdle* W8 h3 A+ k( L9 n8 T
  51. *
    . y* z+ _# m* h8 y) N
  52. * Note:  I, w6 L2 B( r0 Y( T4 N) U$ H$ k% `' r  `
  53. *  Called if WM is in idle state
    - \/ w: a; B+ k. N& `5 q
  54. */
    . N7 }9 \5 ^$ p* [% I& V& X- K+ x

  55. : L( u5 q4 _( M& G4 y2 u  Z
  56. void GUI_X_ExecIdle(void) {}( D: y& \3 o0 a: u0 p) F
  57. 4 \8 C, U: f# n6 X9 R$ e6 Z9 E
  58. /*********************************************************************
    7 W/ `0 j6 L+ R) ]6 [
  59. *
    , b' Z$ b% D- D: {% M# x7 S
  60. *      Logging: OS dependent
    6 o& }, x% O7 p, [2 ~. l* L0 l( ]

  61. & x5 i! R* @# d: f6 ?2 @9 {; X
  62. Note:
    0 t6 i5 p7 v. ^! Q4 Z
  63.   Logging is used in higher debug levels only. The typical target0 K# S7 K: p5 [/ q' g5 ~
  64.   build does not use logging and does therefor not require any of# h& g3 k% [) w, V; {
  65.   the logging routines below. For a release build without logging8 F# M3 u: e' Q9 j/ g8 n
  66.   the routines below may be eliminated to save some space.$ }9 ~; r! m  t
  67.   (If the linker is not function aware and eliminates unreferenced$ m1 V5 f( A) V7 y
  68.   functions automatically)" M! O* e. i7 s2 }6 U- X' s4 l
  69. 5 K- g; l: d! x6 Y- v4 S# x
  70. *// A& J$ {3 B8 p! _( y+ d
  71. ) u  o4 L% k6 u4 }. e
  72. void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }1 j" ?2 C* N/ K9 `* V0 x
  73. void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
    5 O) p% t* I4 {: C) E& \& o* A: ?' E
  74. void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
复制代码
1. 时间基准全局变量,这个变量在bsp_timer.c文件里面进行了定义,由嘀嗒定时器中断进行调用,每1ms调用一次。
  1. 8 E  i7 Q$ D: [9 F
  2. /*
    3 R- t7 I8 j7 V5 N0 q0 _
  3. 全局运行时间,单位1ms
    ! J3 y  g. C( }* l* q& C4 e5 @% o& y8 Y
  4. 最长可以表示 24.85天,如果你的产品连续运行时间超过这个数,则必须考虑溢出问题  v% J- [$ _4 D4 F+ c, r( ]
  5. */# A- c6 z  I0 B1 M/ _( ~
  6. __IO int32_t g_iRunTime = 0;
    + }- n6 n3 T9 f: f( W
  7. /*
    8 |. z! l* T/ |' k, f
  8. *********************************************************************************************************  d) ]/ P5 ]6 t7 d+ X# t$ [! R  b
  9. *        函 数 名: SysTick_ISR
    ) w) h: @) @! W3 P
  10. *        功能说明: SysTick中断服务程序,每隔1ms进入1次
    / E. L: k6 X- ]# r% m9 J
  11. *        形    参:  无
    2 ]4 j  `' Y9 U3 X4 |6 U6 R' O
  12. *        返 回 值: 无3 O; k& D  {3 ]
  13. *********************************************************************************************************
    % l6 l- r% d* y# I" ]
  14. */
    1 o' @% u) u  O9 L1 R+ h. T
  15. void SysTick_ISR(void)) X; `- w  p2 U. }: b% \
  16. {6 y1 i2 Z# y& M0 f9 q
  17. static uint8_t s_count = 0;
    . Y. A* h, V: N8 b; m" l
  18. uint8_t i;
    8 @2 Q# l+ F/ _4 X! {* Q

  19. / i5 p. [8 K8 W! S
  20. /* 每隔1ms进来1次 (仅用于 bsp_DelayMS) */
      R. Y2 c0 Z+ t8 P% F2 j
  21. if (s_uiDelayCount > 0)
    . f# Q2 E- ?8 |/ w
  22. {
    + `/ Y! `# O; x$ m7 k4 ?: B
  23. if (--s_uiDelayCount == 0)
    ) t' X- Q9 c$ h: N* ?- L+ {! `
  24. {( U; M+ E* C3 y
  25. s_ucTimeOutFlag = 1;
    0 _) d$ b2 Y( p
  26. }
    0 f) W+ }4 z2 ^1 H: f
  27. }; j+ m% Y9 Z) j9 e+ g! B5 K
  28. % _1 @+ ?# v6 @
  29. /* 每隔1ms,对软件定时器的计数器进行减一操作 */, C4 ]* o" Q( O1 }' K1 X
  30. for (i = 0; i < TMR_COUNT; i++), h$ B$ E$ g+ v8 `- U: O
  31. {# J8 l& g( O4 b
  32. bsp_SoftTimerDec(&s_tTmr[i]);7 c, e6 ]( l5 X" _6 s7 g, ^
  33. }
    + g4 K0 W7 r# [! L

  34. & z; e; o/ F: u3 r4 j8 m
  35. /* 全局运行时间每1ms增1 */$ U. G( t- s, X+ d
  36. g_iRunTime++;1 S/ D- A" F0 w
  37. if (g_iRunTime == 0x7FFFFFFF)        /* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF *// D9 H' t. X' F
  38. {4 N! S! ~: J% g& H6 w
  39. g_iRunTime = 0;
    4 p- ]6 Q& |( B: t
  40. }1 {- N( @1 c. _2 f
  41. ) x- ?! s# [' m1 K$ I. n& s
  42. bsp_RunPer1ms();         /* 每隔1ms调用一次此函数,此函数在 bsp.c */
    , `- z0 `- D* p, O
  43. & P1 h% X3 S1 p3 J9 W
  44. if (++s_count >= 10)
    $ Z+ M; @3 K' A, o+ T- J
  45. {
    / J9 l$ T% ^; u1 x  D" R4 I
  46. s_count = 0;" K# z/ Z' H5 N! I( c% D
  47. , b* m- q3 n- F. q; F  j, A
  48. bsp_RunPer10ms();        /* 每隔10ms调用一次此函数,此函数在 bsp.c */! H2 I1 ^& r4 o. o& L; Y
  49. }  Y# S) u# z  f: y0 a* [
  50. }
复制代码
2. 供STemWin调用的接口函数,用于获取系统时钟基准。
3. 供STemWin调用的接口函数,用于延迟时间设置。
4. 主要设置上面两个函数即可,其余函数根据需要进行配置。
29.1.2 触摸接口
   触摸部分由嘀嗒定时器中周期性的调用:
  1. /*
    1 q7 _" c; P# b! B; ?6 l, c
  2. *********************************************************************************************************0 _, h/ [0 L5 W/ n" D. g% Q9 b+ P
  3. *        函 数 名: bsp_RunPer10ms1 `  T8 E1 I! b4 y, ^1 r
  4. *        功能说明: 该函数每隔10ms被调用1次。在bsp_timer.c的定时中断调用。主要用于硬件事件检测1 R5 F5 X, U0 {/ q0 y4 U) d
  5. *        形    参:无
    - p$ Q* p0 I/ @+ m
  6. *        返 回 值: 无7 a5 p( q" H3 C; z- y
  7. *********************************************************************************************************
    : X. Z( V4 N7 `  h; d
  8. */
    + Z8 n' e. J5 @' V# m
  9. extern __IO uint8_t s_ucRA8875BusyNow;
    ! p& ^% v& u1 F6 [9 p2 V+ t
  10. void bsp_RunPer10ms(void)5 q& s2 a! q4 \9 \/ y) z
  11. {7 |9 l& k# u, N8 p1 o
  12. /* RA8875 触摸*/
    2 G  q4 `$ M7 ?- r
  13. if (g_ChipID == IC_8875); R: w+ ^# m2 ?+ j3 M, W$ h. s
  14. {+ x+ m" R. [% N
  15.     /* 资源共享标志 */: ?3 `% U; O1 ?) F! x# T/ |
  16. if(s_ucRA8875BusyNow == 0)6 U( \4 u  |! J# D3 r8 ?: b4 q
  17. {  ?$ d- {; R1 i$ P
  18. GUI_TOUCH_Exec();
    - K( O  c8 b  |
  19. }6 n9 t% u" P2 ]+ _* {1 K* R
  20. }' b! k/ b; X. V0 h$ M- L
  21. /* XPT2046 */5 D0 A% _3 Q) N( t! d, S5 @
  22. else, ]/ n" v/ X* h5 M) m8 g) _
  23. {
    # e' n1 N1 Y1 X' c) U. g  Y+ }2 H% u; n
  24. GUI_TOUCH_Exec();' @7 |0 e6 p; }: G9 _" e' I
  25. }
    $ x; K% `( j9 c; j5 Q) L( F3 R
  26. }
复制代码
29.1.3 主程序
在文件main.c
  1. /*
    , X2 q- ?! ^: `. D- F8 w
  2. *********************************************************************************************************
    ; f5 O! Q! _0 Y
  3. *        函 数 名: main7 h% U( X$ N% R- ]+ o
  4. *        功能说明: c程序入口
    + q8 j/ z9 ~) Y  u9 e* u. {6 i
  5. *        形    参:无# ^+ ?; L1 c3 T- l$ _! ]
  6. *        返 回 值: 错误代码(无需处理)/ L5 f+ P+ \4 D+ q- Q
  7. *********************************************************************************************************9 G# Z& h9 p% W( o5 F
  8. */
    * d4 |6 C9 S: f  y" ~% n/ s8 r8 l
  9. int main(void)! r2 N! Q/ @& K5 S( S5 W# p! I
  10. {" ~' }1 d( I" C
  11. bsp_Init();        /* 为了是main函数看起来更简洁些,我们将硬件初始化的代码封装到这个函数 */
    # h3 M3 w, Q1 `! r0 {$ L# r

  12. 4 s4 s. e  s- T; [- g6 ^! U
  13. MainTask();, H; p7 L0 G' `8 w# N( h3 u
  14. }
复制代码
在文件MainTask.c
  1. /*
    3 L+ C) |$ M% A' ^# c' n
  2. *********************************************************************************************************
    # ]/ h, h' \( _7 U- e" H; q
  3. *        函 数 名: main& b. f" ?* D1 V
  4. *        功能说明: c程序入口
    . `: b' {8 k4 _3 M
  5. *        形    参:无
    * Y8 Z; G# U0 ^3 Q
  6. *        返 回 值: 错误代码(无需处理)
    0 I1 U+ ?0 G( }6 r
  7. *********************************************************************************************************
    7 I% z( e, B/ ^, F+ t( k
  8. */) a. U3 M& Z" z: z/ W1 H! u( w0 _
  9. void MainTask(void) * V; }; w& O7 }1 a! z; m7 R
  10. {
    - b  n' q9 D! x0 D8 p1 Y
  11. int xPos;
    + d3 k( G  s  e
  12. int yPos;) A7 q2 N' E* W% {4 ?' u  Y8 [$ ?
  13. int xSize;# K2 I) y! y; w' i  e
  14. int i;
    / {! k( w( H. P
  15. 4 f; w/ O$ v$ K) F
  16. i = 0;
    2 m8 o  Z' C5 p6 j0 g5 i
  17. /* 初始化 */
    ; N$ f: Q# u7 Z. n- Q
  18. GUI_Init();; f. o1 y  d7 H0 i% E
  19. /* 获取要显示的X,Y坐标 */
    ( d1 [+ r; f3 f+ s
  20. xPos = LCD_GetXSize() / 2; ' b# i6 ]: ~5 k! {% e
  21. yPos = LCD_GetYSize() / 3;
    , d* U% H. ]3 M( _  F- W+ C
  22. /* 设置文本显示模式 */) C9 @  n0 s% |* N- G4 y; C& o8 N
  23. GUI_SetTextMode(GUI_TM_REV);
    1 W* P1 r) r) W8 u8 V
  24. /* 设置显示字体 */: u/ J4 S0 K4 v  D3 L0 D
  25. GUI_SetFont(GUI_FONT_20F_ASCII);
    ( Y, s7 y7 G  r% C  K& G; B
  26. GUI_DispStringHCenterAt("Hello world!", xPos, yPos);* l/ |( K! w+ m' }1 O( z, E
  27. /* 设置显示数字字体 */7 c/ w. ?5 R% l" W& u1 O" e' g4 T
  28. GUI_SetFont(GUI_FONT_D24X32);4 b) c+ Z- S. T" }% @/ }
  29. /* 获取显示0000,在字体GUI_FONT_D24X32下的显示情况 */, ]* F/ R# g6 ]) n7 I. ]
  30. xSize = GUI_GetStringDistX("0000");
    " ]- i8 |$ D4 {
  31. /* 设置显示位置 */
    1 \/ \" P; k# q3 S4 g$ s
  32. xPos -= xSize / 2;# N( g" x. S: O' M; h: s8 q. Y3 f
  33. yPos += 24 + 10;6 z; O. a4 o- Y4 a' R
  34. while (1)
    + d3 ]$ g( I. N1 x* m7 u
  35. {
    0 P) W4 x) R# T. A- p, s7 F
  36. GUI_DispDecAt( i++, xPos, yPos, 4);9 j% g: b$ Q& a5 h6 {
  37. if (i > 9999)
    5 N4 x6 F% H9 X+ o) @; E4 J+ Z
  38. {4 c6 I; e: f3 W! [
  39. i = 0;/ ]( l! g4 H: T8 L1 h1 K
  40. }8 S/ D8 d: U5 e
  41. }+ X6 m5 o, S5 c, w2 u4 ]
  42. }
复制代码
功能比较简单,实现效果如下:
29.2.png

/ j( N7 U% J- M, ~1 E1 Y  I7 \
收藏 评论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>
    " r* n* z& N1 p: ]* {/ Z( j2 F
  2. #include <includes.h>
    ' N3 `# a& P! M' u% I
  3. #include "GUI_Private.H"
    9 R% J  h6 j4 ~1 U/ I$ T
  4. #include "stdio.H"
    6 I: X2 F9 j! l2 O- h$ v

  5. & m9 c6 K' L- o$ O! X
  6. /*
    4 J! R. r* L  E" P2 _8 e& _
  7. *********************************************************************************************************3 i; h) q" R* y# C# [
  8. * GLOBAL VARIABLES
    8 o" [* e$ V( s' n# F
  9. *********************************************************************************************************( Y' Y+ R3 R/ z! ^) {
  10. */
    6 W* E4 ^" A% `! _
  11. % Q" M& f8 D  L, ]# i4 e- U1 R' X
  12. static OS_SEM DispSem;
    + u+ \1 v* f; a: S
  13. static OS_SEM EventSem;
    ' M5 f; E1 Y1 c, q( K
  14. 9 j6 F0 t* M% Y6 E( Z3 G( Q! S+ m
  15. static OS_SEM KeySem;
    ) _$ }2 ^4 E5 Q: V& c3 ]
  16. static int KeyPressed;
    + U% h/ h5 ]/ F$ I% ^' B
  17. static char KeyIsInited;! q. p6 i1 K. i/ `0 w: T( @+ U5 M( h
  18. ) F; O+ s) P# h6 m, }6 L* Z4 d. m
  19. : t+ S$ x+ C8 B) `- D7 ?! |% P
  20. /*. d! X9 k2 v9 F5 t) L# i
  21. *********************************************************************************************************: B6 H& T; A0 C+ r
  22. * TIMING FUNCTIONS1 N2 C6 c1 l) @6 a$ D7 L2 H
  23. *6 c' M% P: x/ [
  24. * Notes: Some timing dependent routines of uC/GUI require a GetTime and delay funtion. " b$ L& l% Y* K+ ]7 t/ Y) @' Z. w
  25. * Default time unit (tick), normally is 1 ms.
    + N/ A  ~2 o' n7 @. o( ]* T) L$ S. y
  26. *********************************************************************************************************
    . B( O) {/ }# q# o' E" ?
  27. */- n4 B5 a+ q: x# a- j

  28. # z- F) y' @: w/ q9 g: ~
  29. int GUI_X_GetTime (void) (1)
    : d' l" ~- @2 e7 U& ^  l! |
  30. {
    % X) j% A+ T1 X. F
  31. OS_ERR err;
    ' _7 n' g$ h. A0 Z
  32. return OSTimeGet(&err);& p+ ?; H& c  p4 `  R9 }
  33. }
      l! R5 K" X1 }9 \! V
  34. ; l; T2 w7 g7 P3 l) P+ g
  35. ) s& L" g) I+ e  b
  36. void GUI_X_Delay (int period) (2)7 g9 p. }2 x( U) U* c% e' i
  37. {. f# Z, B: s5 U: L9 e; y
  38. OS_ERR err;
    2 S9 x& F7 m& \: U
  39. OSTimeDly(period, OS_OPT_TIME_DLY, &err);: {4 ^* i" U1 }; {0 z5 c3 u
  40. }, H" I! B1 h* g# M  r9 Q
  41. - N" y# L# s8 I

  42. . ?" \, e1 B& }' d8 B8 g& R
  43. /*: w9 t4 [" N& `, p7 @
  44. *********************************************************************************************************
    ' \% b( N# a# X3 h7 V; |3 [
  45. * GUI_X_ExecIdle()
    5 M0 i( u1 x( V. k2 ?! |7 S& I% n6 M
  46. *********************************************************************************************************$ K1 p. r( n' r2 f
  47. */8 D& Q7 ^/ M5 e! A! `! X
  48. void GUI_X_ExecIdle (void) (3)
    3 U0 J- N, D$ X6 z( f
  49. {
    1 l) |5 u9 r' w* d. N
  50. GUI_X_Delay(1);
    % E$ `. Y5 {+ z' v4 b0 a6 l
  51. }) S% H4 c( l2 k+ b# i
  52. 7 @! o/ u! s3 ?3 }0 }3 }
  53. ) f  L4 ~- s- |" x. u
  54. /*
    ( h# @0 U! S7 i  |- W. A% W
  55. *********************************************************************************************************' ^/ g* s  e, P" a% E
  56. * MULTITASKING INTERFACE FUNCTIONS" o; `  N* N9 f  a2 G, W) e
  57. *
    8 \: z) V; d$ Y" l8 y3 {3 J/ y: l
  58. * Note(1): 1) The following routines are required only if uC/GUI is used in a true multi task environment,   v! N6 Z: d0 Z5 ~! ?
  59. * which means you have more than one thread using the uC/GUI API. In this case the #define
    " m3 r- z, |8 F8 n) y9 P
  60. * GUI_OS 1 needs to be in GUIConf.h& r- ]0 w! Z" S  Z
  61. *********************************************************************************************************
    0 L; _. Z) c+ A3 q0 b. l( N- w0 c/ j
  62. */
    , o- W. s2 \/ Q3 F
  63. 6 L. d* Y! d3 Q8 z
  64. void GUI_X_InitOS (void)(4)
    2 l$ y3 D9 b% p: ]1 u1 V8 w
  65. { % X, e' X# j$ n
  66. OS_ERR err;) z+ g* Z  G' c2 d# ~9 }8 O, D4 z
  67. ' p% W2 w6 o+ m7 w' W
  68. /* 用于资源共享 cnt = 1*/+ f, p- K! Q( S
  69. OSSemCreate((OS_SEM *)&DispSem,
    2 |9 H' @6 F/ r
  70. (CPU_CHAR *)"DispSem",& Y3 |2 r# t2 Y/ o
  71. (OS_SEM_CTR )1," Y* Z& w0 ~* M+ k2 k: V
  72. (OS_ERR *)&err);
    ) R% Q8 E2 d: X9 [1 ]( v% k* ^* I
  73. /* 用于事件触发 cnt = 0*/5 b: X9 J/ |/ d
  74. OSSemCreate((OS_SEM *)&EventSem,
    6 V8 q+ f. j7 j! j. C( L! w
  75. (CPU_CHAR *)"EventSem",5 |7 e; Z) A+ I4 n% j7 a
  76. (OS_SEM_CTR )0,6 P  Z& p7 M1 i2 O
  77. (OS_ERR *)&err);( p6 K4 m$ u' ~0 U; G
  78. }: i3 ^2 H) L  Q, _, R5 t% V: @

  79. $ L$ a8 p9 I& \3 J6 N1 v
  80. void GUI_X_Lock (void)(5)
    - b3 ?- h: n- M4 y3 {  t( P
  81. {
    % p2 K, Q( t2 F0 P1 u& _$ V0 o
  82. OS_ERR err;
    9 C0 `7 j: u* j: E  R
  83. OSSemPend((OS_SEM *)&DispSem,
    3 C7 K6 m$ ]. f+ ]/ f; t3 q
  84. (OS_TICK )0,) {5 z: c. z. M$ T2 Y% v
  85. (OS_OPT )OS_OPT_PEND_BLOCKING,2 T* y3 z, W$ R& J, P
  86. (CPU_TS )0,  u9 ~+ o3 R3 b( a, V
  87. (OS_ERR *)&err);
      [8 Z) z' z$ Z/ C. o% G4 z
  88. }
    - b0 o% q7 E5 ~& u/ j

  89. . G( w6 T1 L8 h. m# B, d& p
  90. void GUI_X_Unlock (void)(6)
    0 P% G; D( t% E. M  S8 n( ~+ I
  91. { 9 |: h3 d+ A- |) d( K6 g' K
  92. OS_ERR err;+ g9 r1 O# R3 t, g% i. u

  93. 6 ~: V& j$ A7 S# z' K) g: l. j. x" I9 f
  94. OSSemPost((OS_SEM *)&DispSem,$ b9 t- n8 z$ |3 y: _9 j# |
  95. (OS_OPT )OS_OPT_POST_1,
    0 B$ ^6 j! [' M) X9 R8 O
  96. (OS_ERR *)&err);
    4 V5 P+ n# }+ E5 Q' v; D
  97. }$ E3 S; ]% ~' M, x
  98. . k# f0 U" K" v& u
  99. 3 L9 k7 G4 l+ X6 _  c" D
  100. U32 GUI_X_GetTaskId (void) (7)
    8 T: x( w0 d- U" \" c2 m
  101. {
    1 g! q# a% e0 |0 ~( m6 c
  102. //由于存在同优先级的任务,这里不知道是不是可以4 t5 v% }) g# W, u# x; Z
  103. //uCOS-III中已经没有任务的ID
      T' a9 k3 X& T
  104. return ((U32)(OSTCBCurPtr->Prio));0 H& x# q3 I0 O1 `+ H; B4 ?0 S
  105. }) v4 f. r% N. z' t' z  B

  106. . F& f0 ~3 I; y
  107. /*
    , f1 }; S6 h4 a0 v4 g* e9 R7 R
  108. *********************************************************************************************************
    " I( n! c" }& X  }
  109. * GUI_X_WaitEvent()1 R' H3 b$ s8 u) A* L
  110. * GUI_X_SignalEvent()' C7 h6 |4 ^( h" \
  111. *********************************************************************************************************
    2 C* B2 Z& c8 e& i5 o
  112. */, N, `  R' o& @5 ]4 k  ?
  113. ; v3 k9 Q9 _! \; @2 i
  114. 7 h9 T7 W9 h7 R
  115. void GUI_X_WaitEvent (void) (8)
    * I  Y" d/ q9 \: J' e4 @, Z7 Y! j
  116. {# o" ?  x8 S9 ?+ J: G. `* r
  117. OS_ERR err;
    " @, {7 v$ W5 {& [$ `' j& Q
  118. OSSemPend((OS_SEM *)&EventSem,( V$ V' A# @1 L; @
  119. (OS_TICK )0,+ o+ {6 I% L7 L: @; ]% L4 R/ h
  120. (OS_OPT )OS_OPT_PEND_BLOCKING,
    9 ?# b5 @+ |$ X+ b! Y
  121. (CPU_TS )0," N$ A% K8 s3 W" K0 _/ a1 z
  122. (OS_ERR *)&err);; W" U! ]2 w% w/ H. ^2 Z! X, K
  123. }% |2 h' y/ ?. o! }2 \5 {
  124. ) P; J' R/ C6 Z

  125. " x5 M0 q' @" C3 C
  126. void GUI_X_SignalEvent (void) (9). [8 N, a6 @- t! @2 E
  127. {
    $ N  T0 J) A$ J& D
  128. OS_ERR err;
    $ j# [$ G4 J5 l( U$ I- X0 }
  129. 4 b4 h$ A1 ^3 u1 O4 c
  130. OSSemPost((OS_SEM *)&EventSem,
    ( U" ?, H0 g4 g: }6 l# _+ b* _
  131. (OS_OPT )OS_OPT_POST_1,
    # x  [0 O' ?  r% V5 m
  132. (OS_ERR *)&err);
    9 F' B" d5 ?4 L, s  @
  133. }6 [+ U0 W' W3 U1 w( p

  134. ) n+ h2 H& M% a/ V( e
  135. /*
    * U/ q4 C# U. D- c
  136. *********************************************************************************************************
    * x4 y- |8 X! Y" H8 z2 J
  137. * KEYBOARD INTERFACE FUNCTIONS; r2 _7 a+ b: ]# e: t/ H. o8 n2 _5 u
  138. *
    % u! u' \: O% p9 M' A$ m
  139. * Purpose: The keyboard routines are required only by some widgets.
    , X2 X, p  o/ z0 B' Z/ C) M
  140. * If widgets are not used, they may be eliminated.+ B5 Q. Q/ u- [: r8 U5 P' q8 l
  141. *
    : L2 z( G. d2 t% d5 x# Q) G, C
  142. * Note(s): If uC/OS-II is used, characters typed into the log window will be placed        in the keyboard buffer.
    " D* A4 v5 e# Z
  143. * This is a neat feature which allows you to operate your target system without having to use or
    3 `" I: Y- j) H  z0 Q1 ^! T
  144. * even to have a keyboard connected to it. (useful for demos !). H+ v5 M" {" p/ d( m3 M
  145. *********************************************************************************************************: O# E& w) \' r, ^# n
  146. */
    $ |* H( U7 ~4 H; h
  147. : K% \, N7 ]+ F: z# I1 B+ z
  148. void CheckInit (void) (10)0 K. p0 c) [. J/ h+ k$ d% K8 T: l
  149. {% B" _" f5 c" u' [1 s
  150. if (KeyIsInited == DEF_FALSE) {; M. Z, N3 A! \$ A! Q: x
  151. KeyIsInited = DEF_TRUE;
      A0 q: u, }/ X) |# d; X" h
  152. GUI_X_Init();& V5 M* @$ n2 R* g; U1 `
  153. }$ j( y3 P( N  O
  154. }
    , @4 M+ l9 Y7 j! [

  155. 2 j- Y( O% A- C
  156. void GUI_X_Init (void)
    , U% Y1 q4 m* t# I' ^" t. q; ~1 V0 t( u
  157. {
    ' y9 X; o; J4 X2 s
  158. OS_ERR err;
    6 e/ o" A  y1 [& y2 D
  159. OSSemCreate((OS_SEM *)&KeySem,0 j$ c, _/ l7 P" w3 l: a1 U3 X* U7 L
  160. (CPU_CHAR *)"KeySem",. r2 V' r  @4 L
  161. (OS_SEM_CTR )0,* a$ Q6 n% d+ R6 W- Z4 S$ g# B$ b
  162. (OS_ERR *)&err);- ?! H- ]0 k2 Y1 [
  163. }6 r+ X  Z) N( Z

  164. ; c+ X' i% K, K
  165. int GUI_X_GetKey (void) " D$ q4 {# f3 b$ P+ ^" I  Y- E" f7 a' \
  166. {0 u. W- Z- ~9 u+ w& e6 q
  167. int r;$ y- R+ t. G9 h

  168. 5 @1 y! d9 J, z- Q
  169. r = KeyPressed;
      ?3 S5 A  v: g* a7 _2 r* m9 d
  170. CheckInit();
    $ B1 d# V# d6 j9 T+ f2 f4 Y
  171. KeyPressed = 0;- M/ x" ~; O% ~: _: T+ C
  172. return (r);
    3 P8 F/ A: w( @& E! @- w/ W8 S& z
  173. }6 j( ?' K" m" [# C

  174. - J$ A2 a. ]; h0 f0 I& _
  175. int GUI_X_WaitKey (void) 4 j5 T; W. l' s1 v' j
  176. {
    # h2 w3 L( T/ H. x+ z
  177. int r;
    0 }* i3 f9 ^- V% M
  178. OS_ERR err;
    ; L1 i7 ]; @) ^( d3 W, R1 b
  179. 4 b& r& K' p0 F; w. a* N" d+ a
  180. 0 P8 S* l+ c, V9 m
  181. CheckInit();( D; T+ o, @. x- t' X0 m) p- i' j5 O
  182. if (KeyPressed == 0) { ! B- n7 I& v; m# X( {
  183. OSSemPend((OS_SEM *)&EventSem,
    " \! d5 R& W+ o* x, S% s4 [
  184. (OS_TICK )0,
    ) D+ V+ p2 n- x" @5 u: J4 P) v
  185. (OS_OPT )OS_OPT_PEND_BLOCKING,
    - e% C/ B% z/ b1 r. t' [, b- ~
  186. (CPU_TS )0,
    7 z2 Z5 t. s2 P% ~) @+ K
  187. (OS_ERR *)&err);, Y7 P; l  p" ~4 N7 @' \' k
  188. }
    , Y& T; D" C: k  l* ^% H
  189. r = KeyPressed;
    9 K- D! z9 K# d$ k% V
  190. KeyPressed = 0;
    $ r4 C* {) z: w- z" l- z
  191. return (r);7 J# w. g  _% v. n9 t4 w
  192. }! {# U, y1 K- N0 k- U; m

  193. 1 Y' _3 t# X- }0 s$ C
  194. void GUI_X_StoreKey (int k)
    4 n& v7 R( I6 @! i, b
  195. {4 v+ v6 h4 q, Z
  196. OS_ERR err;
    7 R- C9 i9 g+ F" W! J$ B  v) w
  197. KeyPressed = k;
    8 L0 Z5 D* Y2 M1 E6 B4 H
  198. OSSemPost((OS_SEM *)&KeySem,
    & Z* K. ]# S; }  f3 R9 x# I& U
  199. (OS_OPT )OS_OPT_POST_1,! G& p* y3 K: _- T- g0 h
  200. (OS_ERR *)&err);
    & T' t( H8 N2 h, c
  201. }
    ' p2 T, a% [4 V+ [# S/ `$ m4 U8 I0 l
  202. , l7 P8 |, K: T( O
  203. void GUI_X_Log (const char *s) { GUI_USE_PARA(s); }(11)
    - a9 Q9 ?! R* G# `: y
  204. void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); }- C+ r% N3 t. f+ d3 p
  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. /*
    3 G& G" T' T% k. R" l
  2. *********************************************************************************************************
    : L: p& r, e5 E
  3. *        函 数 名: AppTaskGUIRefresh. k+ P2 v1 o4 `/ ?  p0 i
  4. *        功能说明: emWin刷新函数4 t5 J$ K: _/ L0 s# I: }
  5. *        形 参:p_arg 是在创建该任务时传递的形参
    ( y0 T4 Z) J- X  ^
  6. *        返 回 值: 无
    ! O; F' E8 V  P; n5 \& s
  7. * 优 先 级:OS_CFG_PRIO_MAX - 3u4 M8 l8 N$ ^3 f* {- U
  8. *********************************************************************************************************0 [6 O; i1 K  Y5 V6 Y
  9. */% U$ }* @9 l" z" [1 k

  10. * {8 L7 s' y, q* e: n
  11. extern __IO uint8_t s_ucRA8875BusyNow;
      v" ^2 I0 ^7 q5 T! @; j: a
  12. static void AppTaskGUIRefresh(void *p_arg)
    9 |" J9 ^9 a% t6 Q) s
  13. {
    ' Z% |3 }/ T2 Q7 D' f
  14. (void)p_arg;         /* 避免编译器告警 */
    % g  k7 u3 D& O$ N% o8 c8 l
  15. while (1)
      e" k+ m# x# }0 [! d8 S
  16. {* W* {7 j/ h2 J2 B) Y* s$ h4 a
  17. /* RA8875 触摸*/
    ) D/ U  Z. \# b! X4 X5 Q0 J
  18. if (g_ChipID == IC_8875)
    9 b$ g  [+ v/ k/ p+ Z
  19. {; ^" q4 S6 p$ y- t; H: r, w+ N
  20. /* 资源共享标志 */
    7 h7 b* O5 @  D5 l. f, [- X
  21. if(s_ucRA8875BusyNow == 0)
    . W+ Y; y5 M! s' e$ W8 I% l
  22. {
    ! z9 h+ U# s$ w- E' V( ]" c  t
  23. GUI_TOUCH_Exec();
    ; P8 o  Z' U1 t* ?
  24. }# m: O( J* m$ [; H4 H
  25. }
    " t2 c3 @; X: _' l7 x! E. C1 n% G
  26. /* XPT2046 */
    ! \' ~) ]( _9 F! ?; D& Q
  27. else
    ) K% ]4 Q5 T' V! O; P
  28. {6 ^8 Y! v. P, }, Z$ q9 q5 d) v
  29. GUI_TOUCH_Exec();
    . }6 L6 ?- R; r" @8 c
  30. }
    ; p4 @) A' ?8 F
  31. - n0 ^, ?% u0 k8 O" Q
  32. BSP_OS_TimeDlyMs(20); ! y1 v8 d& D6 B, b/ |% C
  33. }* ^; P9 Y5 r% y4 j3 y. ?6 v( R
  34. }
复制代码
29.2.3 STemWin任务
  1. /*$ `3 d  `  W9 C6 B5 T3 B2 m  q
  2. *********************************************************************************************************9 @1 h, b  x+ ?' P/ y4 V
  3. *        函 数 名: MainTask
    " S( g; T5 _! u- Q5 M# j! q
  4. *        功能说明: GUI主函数
      k. V: g1 b$ @4 g! f
  5. *        形 参:无
    - Z- o7 S  c; {8 k1 x, ~8 `
  6. *        返 回 值: 无) U* X( s+ W7 H$ ]) Q* m/ F' V
  7. *********************************************************************************************************
    ' T2 l. ?/ O  z' _' W1 O
  8. */) D3 h$ X. y7 [# Q0 d, l; T
  9. void MainTask(void)
    9 l% W' p$ }; z8 @( K9 G; O- `) K9 ~9 R
  10. {
    $ Q" _6 F8 s' o+ m9 B
  11. GUI_Init();# k7 h4 r) O3 E2 |! p2 }
  12. GUI_SetTextMode(GUI_TM_TRANS);
    + y* C% G; \4 u9 z  M5 ~+ e0 m% @
  13. for (i = 0; i < 3; i++) # c5 l7 O1 \. e. U- L" U
  14. {- }. i# S6 D( ?' p% L+ \5 G9 N9 y
  15. GUI_SetColor(GUI_BLUE);
    ) S* {. e, S# Y8 T+ v% P1 u& A4 t
  16. GUI_FillRectEx(&Rect);
    + G% {2 ^- ~$ p0 h% x! F1 H$ c
  17. GUI_SetColor(GUI_WHITE);7 Q: c' x9 ]8 b- K
  18. GUI_DispStringInRectWrap(acText, &Rect, GUI_TA_LEFT, aWm[i]);
    9 `  f9 v! V! ^) V5 _4 t
  19. Rect.x0 += 60;# I8 I6 ]3 b+ }' Z
  20. Rect.x1 += 60;
    ( P1 O4 {3 {$ Q" ~8 d
  21. }% G9 ?( _* q. t; z
  22. while (1)$ q% x$ ]2 f& }$ w5 F
  23. {$ Z* a1 S" l2 t- z# D9 u! Y; s# n
  24. GUI_Delay(10);
    # J) i4 o; }3 }3 J: u
  25. }
    9 C- A. L3 d4 |5 b8 g: q
  26. }
复制代码
这个例子整体的显示效果如下:
29.3.png
7 h) z, J2 ^7 I9 Q' Q
baiyongbin2009 回答时间:2015-2-12 14:37:10
29.3 多任务系统:多个任务调用emWin
    这个例子也是分为三部分,内核接口和触摸任务跟上面讲的一样,这里主要说一下创建的三个GUI任务。
29.3.1 uCOS创建三个STemWin任务
这三个任务在main.c函数里面创建,三个任务的优先级看相应注释
  1. /*
    & O. o% t, @; [8 s# F5 b
  2. *********************************************************************************************************
    - K& i8 t) B" p  r1 T  b0 a
  3. *        函 数 名: AppTaskGUI
    7 ^1 G: B& a" ]9 s* L% a
  4. *        功能说明: GUI任务0
    3 y8 I6 _" q, x# Q; I% H
  5. *        形    参:p_arg 是在创建该任务时传递的形参
    0 n& a; r0 i6 g6 ?8 V
  6. *        返 回 值: 无
    4 ?  o6 ~, ~. S
  7. *   优 先 级:OS_CFG_PRIO_MAX - 6u
    # N% S% X; q+ G# x' F
  8. *********************************************************************************************************, d+ ^4 I' a) B
  9. */  y% u# d, E9 t+ {! W4 g
  10. extern void MainTask(void);0 H/ @; r% V, u" Z/ h
  11. static void AppTask0GUI(void *p_arg)
    % U% [9 G* O9 K2 x1 b
  12. {
    ) y$ s, |! ~3 ?) P5 b' Y
  13.     (void)p_arg;        /* 避免编译器告警 */3 V- Z, D4 N  n8 G. q
  14. while (1)
    9 W& b# q; A! |& C
  15. {
    ; a9 b9 j0 B1 P& p  q
  16. MainTask();
    / `8 D" A& q  B* E! M  [
  17. }2 l+ @; I- H+ k& i/ d9 G
  18. }
    8 j' E& M$ {* d7 ~, [4 g1 d

  19. 1 h0 R. m' S) a  P9 v
  20. /*
    3 W+ A0 o. k* |& X! r
  21. *********************************************************************************************************
      g" ]( r* Z$ H# c* K
  22. *        函 数 名: AppTaskGUI( f0 E& v" e4 p" T+ E, n
  23. *        功能说明: GUI任务15 q# y/ x6 q7 R  x% ~7 S7 W
  24. *        形    参:p_arg 是在创建该任务时传递的形参" }3 f5 e9 A" }
  25. *        返 回 值: 无. v9 J- H5 a* Y
  26. *   优 先 级:OS_CFG_PRIO_MAX - 5u$ _0 n7 C' X5 N/ O  r1 j/ K
  27. *********************************************************************************************************
    2 R. u9 ^. f7 A7 l, ~8 F$ w/ ~; |
  28. */3 `6 }5 o$ I5 ~) q$ w& Q
  29. extern void Task_1(void);3 N3 u2 _2 M# Y( J) f5 C5 b/ S
  30. static void AppTask1GUI(void *p_arg)
    1 ~' |# H2 F  y3 \6 n0 o
  31. {
    # E' _; Q  B  n/ A) c- c5 d
  32.     (void)p_arg;        /* 避免编译器告警 */5 N3 i) `( Q- Y! H0 [1 Y+ ^5 {
  33. while (1)
    % q! w& Z, z. `7 W; e3 ?
  34. {
    - B4 ^; A7 Z7 F) C
  35. Task_1();; X7 }- t( `+ L( ~
  36. }
    8 u7 z& |$ @+ ^  c
  37. }# [; `+ F  I) o* t+ `. d
  38. 1 j, F! h# o& g! i4 J
  39. /*
    ; M7 V- u' r5 R7 ?6 d. U* G/ w
  40. *********************************************************************************************************$ n( |1 S7 o# v; L5 P! j) `9 m( G, e
  41. *        函 数 名: AppTaskGUI. i1 U6 B: P- g$ a8 Q
  42. *        功能说明: GUI任务29 |7 P: p) k9 d8 N$ K4 y) [3 N: n6 U
  43. *        形    参:p_arg 是在创建该任务时传递的形参
    0 i3 y& Z4 M8 D1 a# V7 A% ?2 T: x. u
  44. *        返 回 值: 无) g& f8 T% ^* j$ W& w4 N
  45. *   优 先 级:OS_CFG_PRIO_MAX - 4u  g, v- A9 E3 P0 s
  46. *********************************************************************************************************
    # o5 @# `4 u" f% }
  47. */
    / `" ~# c  ?; w( m, k4 k  F
  48. extern void Task_2(void);
    " J5 I% N! x. P/ R- x
  49. static void AppTask2GUI(void *p_arg)
    * D: b8 l: F4 |, {& w- d$ I
  50. {% Z- ~* K6 p5 I4 p
  51.     (void)p_arg;        /* 避免编译器告警 */
    - [' s3 Z* E8 Z2 y, g: N( F) o
  52. while (1) / Q  o1 g  E0 a
  53. {
    , T# ?! r, s. t$ v7 q. M9 Z
  54. Task_2();
    1 F5 R8 R* ]. y! {/ z  Z+ Q1 Z8 R
  55. }
    ! s" V/ V4 V& f' ~
  56. }
复制代码
29.3.2 STemWin任务
建立的三个任务所在文件夹:
29.4.png
MainTask文件中的任务:
  1. #include "includes.h"& b- S3 E) M8 i8 g5 L
  2. #include "MainTask.h"% ^- Q* G6 A) z' ^* t1 C

  3. ' }3 Q" m( m( @9 ?# {( G$ p
  4. # f; x5 F/ q5 a3 w+ S- |+ v# Z. A; a/ z
  5. /*
    ; ~3 G3 h- S! a; t" f  |& B( i
  6. *********************************************************************************************************! w" U: s/ V6 e0 }( j" N
  7. *        函 数 名: _cbCallbackT07 p! {0 z+ _1 Q- _' k! X+ r
  8. *        功能说明: 任务0的回调函数2 M3 A# }7 {( _" x/ z* ^
  9. *        形    参:pMsg  消息指针- U  z9 u+ x, {
  10. *        返 回 值: 无4 h9 J8 z  D4 g2 U- C
  11. *********************************************************************************************************
    5 v% B* a% g5 U  t) E& E* {# H
  12. */
    / W! [* H  F& G- a
  13. static void _cbCallbackT0(WM_MESSAGE * pMsg) # H; ?0 ~: ~" [$ E2 _6 q2 n
  14. {
    ' h; o6 c" T% i# X/ S1 P
  15. switch (pMsg->MsgId)
    4 a7 m: [, Y9 f/ G3 {
  16. {
      |: m, \! a# z
  17. case WM_PAINT:
    & i" L# Z. Y- q0 }
  18. /* Handle the paint message */5 V- g) R$ Y5 [" P" [$ t/ D: S. M
  19. GUI_SetBkColor(GUI_RED);
    5 j7 N. k/ S3 O. w$ d2 x/ n
  20. GUI_SetColor(GUI_BLACK);
    ! O8 i6 T( u$ U" Q8 r! e
  21. GUI_SetFont(&GUI_FontComic24B_ASCII);
    # |* o* X0 J  u9 H3 S) a1 Y
  22. GUI_Clear();5 b& `( f5 f* e: n2 u3 G% `
  23. GUI_DispStringAt("Task0 Moving", 0, 0);
    ; V4 O- U4 Y! \, B3 r" r. q7 f
  24. break;
    2 Y, I8 o. @/ m- ^5 X( O  `" ?
  25. default:
    - ]& k) a# \8 l2 h' {6 b
  26. WM_DefaultProc(pMsg);3 o  B+ G+ ]6 t: G
  27. }
      y$ Q6 V' ^! s2 O% I
  28. }
    5 H" U. L5 Y3 H  d+ S( M# ^+ R$ e* B
  29. - H" A. `7 q7 n1 j/ ~% u
  30. /*' a- ^) T, d% O+ B8 n
  31. *********************************************************************************************************7 k; k7 |3 S, j0 L3 I
  32. *        函 数 名: _cbBackgroundWin
    " r$ S: q9 o6 Z6 v
  33. *        功能说明: 背景窗口的回调函数
    2 C' Z( R+ Q( ?
  34. *        形    参:pMsg  消息指针
    % ]0 v1 Z) }( m1 F( A0 K/ v
  35. *        返 回 值: 无# S- h5 p& e3 }) N* s0 Z: q
  36. *********************************************************************************************************# Q1 B# D0 ?2 O4 j$ Q8 N# A
  37. *// x3 \! `5 x7 h9 M% L/ @# u& e$ n
  38. static void _cbBackgroundWin(WM_MESSAGE* pMsg)
    9 K: R; j: n+ Q4 C
  39. {
    3 w- e% W8 q- _# o
  40. switch (pMsg->MsgId)
    ) j$ C- P  r% n& r) V
  41. {
    - E& R; @1 l8 g6 o# ~! e2 Y
  42. case WM_PAINT:/ r6 [9 l. G1 u- m! o9 B, Q, K
  43. /* Handle only the paint message */5 q% \, n9 y: p# I8 w# [
  44. GUI_SetBkColor(0x00CC00);& l  x: r6 {. |% A0 n1 `
  45. GUI_Clear();
    6 g( i3 A/ }2 S
  46. GUI_SetFont(&GUI_Font24_ASCII);8 a/ q* U8 a% r2 H2 ], `4 ]8 E
  47. GUI_DispStringHCenterAt("STemWin - multitasking demo\n", 159, 5);: L! N6 W- k' Y
  48. GUI_SetFont(&GUI_Font13_1);( w3 t3 U6 O/ W0 H2 P* k+ q
  49. GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35);) M  C0 N/ g$ P* u. x/ y6 b, w/ `
  50. default:
    ' w5 c. g0 @6 i/ }9 M$ m
  51. WM_DefaultProc(pMsg);
    ! j5 _9 s8 W! y; n% W) p6 u( V
  52. }
    # B  E+ N+ c. W8 d
  53. }  f2 m' ]" l$ z, X4 Q

  54. ! o& f+ L1 {! Z  f5 F
  55. /*3 a; U/ |9 I- Z. s' V1 f
  56. *********************************************************************************************************0 Z! T2 @# I: q; l' ?) k7 d
  57. *        函 数 名: Task_0+ m  L+ f0 E+ z2 k4 W
  58. *        功能说明: GUI任务0
    # Y* Q/ N+ Q( S) o1 O' t! t
  59. *        形    参:无7 M6 I/ Y3 M  z2 o# q, `
  60. *        返 回 值: 无! R1 L5 W# B# t8 u6 f- ^
  61. *********************************************************************************************************
    ' W0 ?/ ~, A. `
  62. */
    ; r; _$ @. e# |. ]$ S
  63. void Task_0(void)
    3 V! ?. T1 a0 }4 _; ?1 Y2 S
  64. {
    " c  ]/ C0 j; m% A* y
  65. /* Create frame window */
    ) H( D) Y: e( D5 _% o, c
  66. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 230, 200,5 ~4 c9 m, ?) L
  67. 40);1 ^% l& n: ~! o7 x( D. d' ]
  68. /* Create child window */
    : [2 O) k0 s" t
  69. WM_HWIN      hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),
    / v# H( q2 E5 j
  70.   WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT0, 0);
    6 \7 ?* r; L" K: e, n/ N
  71. FRAMEWIN_SetActive(hFrameWin, 0);: q: s- g/ B5 j  ^) b; M
  72. /* Make sure the right window is active... */
    5 o: [. o- D0 w' g( w+ D
  73. WM_SelectWindow(hChildWin);
    9 G' E8 i0 U/ C- t1 c( n9 i# X% `5 i7 j
  74. /* ...and the right font is selected */
    ( }0 E( b0 n: N3 n. z1 ]( d
  75. GUI_SetFont(&GUI_FontComic24B_ASCII);
    $ _4 m  X0 P. w
  76. while(1)
    8 [3 L  q3 p: q3 F  |  N
  77. {/ p' H  w% q* m! t) }* T
  78. int i;
    ; @8 T; {( C/ I
  79. int nx = 80;
    . P, l6 G  i; J" Q1 W
  80. /* Move window continously */  I; ^9 u8 I/ t1 E
  81. for (i = 0; i < nx; i++) 8 X9 O& K8 [0 {. k/ P  C5 \
  82. {# j; A; k* x* _! J$ M
  83. WM_MoveWindow(hFrameWin, 2, 0);) P5 ~3 M, @4 G$ d4 d
  84. GUI_Delay(50);
    $ c" K0 O8 I, G, I9 e2 ], S
  85. }
    5 h' H( [0 l. U' ^6 v! [' k
  86. for (i = 0; i < nx; i++) : z& I: \3 L, }" ^1 h
  87. {/ m9 g5 [6 O4 Z7 [% u* l+ \0 ]$ B5 T8 U: d
  88. WM_MoveWindow(hFrameWin, -2, 0);
    " R! i1 p0 a2 Q: Z; c
  89. GUI_Delay(50);) h" p* e; H' e; Q* J8 Z: Z  M
  90. }
    & K$ j  N% b0 h3 M8 `0 C) p0 L
  91. }
    5 B( c( N, q& n+ f2 W
  92. }* f5 V/ h" @, z$ H

  93. . E; {& S; ?* F1 L: k, x& T4 j
  94. /*
    # _' B! l3 |! j7 x+ m. L- Q; r  ~
  95. *********************************************************************************************************, W8 b& O. m! C, ~6 X( a
  96. *        函 数 名: MainTask" E6 T, c! o) A! d
  97. *        功能说明: GUI任务0
    5 E8 j: N9 |* I3 g" ]' i6 d
  98. *        形    参:无) O. ]% d8 b" O4 b
  99. *        返 回 值: 无9 K( _9 R- S3 X' D. k; s8 r
  100. *********************************************************************************************************
    ! Z7 v! F" c: e
  101. */) a% I$ O. @+ g# u
  102. void MainTask(void)
    8 D$ v  J2 B( |
  103. {
    ' l' n& h7 Y1 X3 z( X
  104. GUI_Init();/ \! T+ g% D, {2 P( ^4 K, G
  105. WM_SetCreateFlags(WM_CF_MEMDEV);                |( }7 U8 Y8 w
  106. WM_SetCallback(WM_HBKWIN, _cbBackgroundWin);
    " f6 H) B( D7 M' c: R$ O
  107. while(1)
    $ t7 c( L6 r1 \# p1 t  P
  108. {; O$ W8 A3 y6 ]* O2 `
  109. Task_0();" g/ e9 X3 u: e
  110. }
    ! `3 V. f6 V- M+ ]
  111. }
复制代码
App_Task1中的内容:
  1. #include "includes.h"  G9 o! F+ C+ s) K. L9 [- x4 y
  2. #include "MainTask.h"9 Z# u9 ?1 n. M7 ]( d0 S* J0 w

  3. 5 K: b& `: ?* H- U1 z6 p

  4. 2 {" I! h' T" U8 d; V
  5. /*  r% }" t' K) E
  6. *********************************************************************************************************
    1 @* {3 ?0 P- R* v, b
  7. *        函 数 名: _cbCallbackT14 S, h+ [' Q* ?% x* f1 A/ J
  8. *        功能说明: 任务1的回调函数
    8 ]1 ]+ U. m. B
  9. *        形    参:pMsg  消息指针
    & g4 j) A! ^2 K) C  w
  10. *        返 回 值: 无/ `. S5 j( @2 ]1 r2 b
  11. *********************************************************************************************************
    7 j! j& v9 ^. h- ?
  12. */
    8 `; M% s  {( w. J" z: q& J$ N
  13. static void _cbCallbackT1(WM_MESSAGE * pMsg)
    - p, c/ X2 W$ G( N! U1 E" Q
  14. {
    / R. I1 K; }" j
  15. WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);
    * F, I# ^) }4 s$ ]9 E5 Q
  16. switch (pMsg->MsgId) ! \& H( M! x! B& w) {- ]
  17. {
    . R& S7 m+ u8 d$ ~$ X! ^, {# k
  18. case WM_PAINT:
    ; [4 `$ B5 ~& y: \/ Q3 M$ n  t2 w
  19. /* Handle the paint message */
    9 t* Q4 ?2 \* r% J/ `1 l
  20. GUI_SetBkColor(GUI_BLUE);
    * }$ f7 b% L" v! v7 W) n
  21. GUI_SetColor(GUI_WHITE);
    9 f. S- w$ y/ |6 W
  22. GUI_SetFont(&GUI_FontComic24B_ASCII);, q8 l- T2 ?5 |2 \
  23. GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    $ J2 Z  G5 x  \0 {9 D
  24. GUI_Clear();' A  Z. R% j% d& n4 v
  25. GUI_DispStringHCenterAt("Task1 window...",
    + f, N$ w" K. Z9 r% |3 f2 v1 Z
  26. WM_GetWindowSizeX(hWin) / 2,
    0 z) e$ w4 v  Q/ X, r
  27. WM_GetWindowSizeY(hWin) / 2);
    + [0 W; U8 U# K! Y( i
  28. break;
    0 Y. H2 J- l' b
  29. default:; w# M  W+ h% r/ X
  30. WM_DefaultProc(pMsg);. u2 _: b  E. ]8 C0 A" ^
  31. }( `7 g& m# c. j3 R9 z
  32. }: D4 l5 Y( X6 x$ t8 J5 H9 a

  33. " g, Z0 {0 N( f1 I
  34. /*
    ! F# J8 Q# W, i. o% g8 h
  35. *********************************************************************************************************: A$ y( c! j( p- O$ @
  36. *        函 数 名: Task_1
    & A6 M2 Q/ s+ e! H- G% w( s
  37. *        功能说明: GUI任务01 p8 s1 _; i. E8 G# q' {- E, _
  38. *        形    参:无
    2 y  A/ Q* U/ e- z* a) R
  39. *        返 回 值: 无7 r6 V0 ^7 R- A" h+ y: ?5 F
  40. *********************************************************************************************************/ e6 z( C  `  }" s  G$ Y
  41. */
    & s" r" I) O3 V9 Z
  42. void Task_1(void)
    * D0 V5 C* L  X$ z, p" l
  43. {' V8 T4 }; p, K! K. V
  44. /* Create frame window */
    # D4 [8 u5 Q* g( D: l9 _
  45. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP, 2 x* f# O; z6 Y8 L/ W
  46. 20, 170, 200, 40);- H- J# T4 N' \8 \
  47. /* Create child window */
      U* h1 _! f) l& ]5 B4 i
  48. WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW |
    " X- T; e3 `) t$ R6 k6 @
  49. WM_CF_MEMDEV,_cbCallbackT1, 0);
    " \5 \# Q6 x1 {* ]# S0 k0 v) g2 n
  50. FRAMEWIN_SetActive(hFrameWin, 0);+ r3 ^* t  w- |2 @4 B) u6 \& X
  51. while(1)
    - j9 X, G+ a$ X5 k$ ]7 V
  52. {
    7 b* ?9 o+ u4 v# L) i( i
  53. int i;; y% e5 l  |1 C& V
  54. int nx = 80;
    ( L: b. |, j# R' F: ]4 d, g7 L8 u
  55. int ny = 90;
    4 D2 p' M0 Z5 O: z( h9 a; [
  56. /* Move window continously */
    $ s0 A) T+ w  u0 Z* N7 w/ W$ Y- w
  57. for (i = 0; i < ny; i++)
    ! P% g# `! ]$ i+ m
  58. {
    7 j7 w9 x, K0 R0 X) ~
  59. WM_MoveWindow(hFrameWin, 0, -2);
    $ @3 }, B; X$ p4 u) }
  60. GUI_Delay(50);, \+ e, N0 l) v
  61. }% i2 |" I( F5 o2 @0 F) i- w0 X
  62. for (i = 0; i < nx; i++)   i. \4 z/ R0 ~8 K
  63. {: e$ u( I8 b/ B  t  N7 B" u" k! I% p: m
  64. WM_MoveWindow(hFrameWin, 2, 0);
    9 W0 u3 B( x& R* L: H* l- q0 N& i) J
  65. GUI_Delay(50);/ G7 |1 u) h% S. e, Z) J$ N
  66. }& V( _# {1 b) @, O" W& x
  67. for (i = 0; i < ny; i++) / S' e! `: s+ C! w/ C
  68. {
      p; ?& J- q! ^9 `9 @& `. a$ E" e
  69. WM_MoveWindow(hFrameWin, 0, 2);. Y) Y* ~  F# Y0 u
  70. GUI_Delay(50);! C' Z- J& B' S% E" j( \0 `
  71. }
    ' F* y# C8 l+ c: r5 ?
  72. for (i = 0; i < nx; i++) 6 N# u4 a. s/ }- B6 i
  73. {  v' f, i' r* J" }; V
  74. WM_MoveWindow(hFrameWin, -2, 0);
    , c. S5 d. n2 O7 ^
  75. GUI_Delay(50);4 ^% l, z, z! }% X! v
  76. }
    # ^& T- \! Q. c
  77. }
    8 `3 P5 ]! e( O3 F* O1 p
  78. }
复制代码
App_Task2中的内容:
  1. #include "includes.h"
    2 T6 G+ v; `3 {! ^" v* o
  2. #include "MainTask.h"
    , z  H" w2 Y* ?& S

  3. 3 h# w) }8 G2 e
  4. /*
    % P  }5 Q, O# g
  5. *********************************************************************************************************
    2 @6 B+ H) ?* e0 {4 Q8 j8 X/ D
  6. *        函 数 名: _cbCallbackT2
    + R# N/ E; U9 d( b' _0 i
  7. *        功能说明: 任务2的回调函数- U4 ?1 p9 J! b7 q+ m' d
  8. *        形    参:pMsg  消息指针
    2 O' x3 q/ H' p7 D
  9. *        返 回 值: 无
    , m9 |6 R+ c/ a3 k7 @. B
  10. *********************************************************************************************************$ X% z- ^- C" L# _
  11. */, A: d% R7 D( ~! Q. G# b- Q8 s
  12. static void _cbCallbackT2(WM_MESSAGE * pMsg)
    0 C6 g- q+ E8 o7 G8 j* P
  13. {
    9 \* u# v1 O- G6 t& _  S. b
  14. switch (pMsg->MsgId)
      X. n+ C6 B, ^8 e5 @
  15. {! }& z7 X7 f$ R* r, U
  16. case WM_PAINT:
    $ f& T  Z' Y, C" W  d7 R& |# E8 {
  17. /* Handle the paint message */
    ( J4 v6 `7 c$ Q
  18. GUI_SetBkColor(GUI_YELLOW);$ \3 `$ _0 P2 y3 ^! R( ~6 G7 B9 `
  19. GUI_SetColor(GUI_BLACK);
    0 X4 K# G: e6 e6 [
  20. GUI_SetFont(&GUI_FontComic24B_ASCII);
    1 k( e* {" K: @" r
  21. GUI_Clear();$ s3 p8 i+ z  s' \9 T
  22. GUI_DispStringAt("Task2 Moving", 0, 0);: ]! L) b. n4 j
  23. break;7 ?9 n& F+ R7 ^, e& f$ ]7 B3 x: ?
  24. default:) m" h, N* K5 X& H3 E1 j
  25. WM_DefaultProc(pMsg);  |9 s9 `) o+ C
  26. }
    5 I9 z7 v* W0 ]& l/ a  B
  27. }
    ; Y( |, Y8 p$ ]7 Y$ d
  28. 0 x# n# ?5 g) L, a/ }- |& L
  29. /*
    * o) I+ Q/ n) p2 G6 V
  30. *********************************************************************************************************
    . n  U. T8 P( K3 R/ O  d
  31. *        函 数 名: Task_2
    4 _$ |; A& A/ ~& b9 V
  32. *        功能说明: GUI任务0' u& S) O+ r. |0 c
  33. *        形    参:无
    8 K1 x2 |# W3 |: u3 m
  34. *        返 回 值: 无
    - t; V5 I- ]% P
  35. *********************************************************************************************************2 @2 J. q6 g8 o6 X) [
  36. */
    / X  ^( X) T9 ^9 f2 X8 ]9 t
  37. void Task_2(void) " D; p6 C) b1 i- x" K/ K7 Q
  38. {/ \! f+ c' N. _9 u6 x  W
  39. /* Create frame window */
    : F% F9 U  L0 I( R- R- p& M
  40. FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 2",  NULL, WM_CF_SHOW | WM_CF_STAYONTOP,  0, 190, 200, 40);4 t* t& F( r7 p/ f1 k) n4 ^
  41. /* Create child window */
    6 u8 r( p% a3 p
  42. WM_HWIN         hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), . C! Z+ X) T( @  r+ M9 @
  43. WM_CF_SHOW | WM_CF_MEMDEV,  _cbCallbackT2, 0);1 z1 h' s: D. ?3 h& P5 e
  44. FRAMEWIN_SetActive(hFrameWin, 0);
      O& D$ u# z3 c9 ]; G
  45. /* Make sure the right window is active... */; H' u+ |$ b/ R) t% a  `( o- s; K+ j
  46. WM_SelectWindow(hChildWin);+ ?4 s& A: v) P4 q
  47. /* ...and the right font is selected */
    * v! M6 a8 ?. K6 o2 `  x5 S+ @! V* P
  48. GUI_SetFont(&GUI_FontComic24B_ASCII);
    * {3 [7 s- z# [) ?& |3 Z: j2 [
  49. while(1)
    3 M. a+ m9 F8 r& J8 i3 g  L
  50. {
    # D0 r: q4 y. N# `9 X
  51. int i;
    ! P3 o3 I! \2 [* U0 H
  52. int nx = 80;
    / ^4 a' g9 M4 |+ D4 h
  53. /* Move window continously */: y$ f+ l) {6 ~% r8 g
  54. for (i = 0; i < nx; i++)
    0 O. Y& n, `; ^
  55. {
    2 a# h2 ^  F1 K7 [# |$ m# M
  56. WM_MoveWindow(hFrameWin, 2, 0);
    $ u! p: N1 y) `6 f4 R9 Q$ e+ L2 N
  57. GUI_Delay(50);1 [1 ]4 `  G* R$ t, [$ x& \: X
  58. }
    0 q. E8 N( O6 V2 @( e4 T
  59. for (i = 0; i < nx; i++) ' ?- y  {" l0 ^5 ^0 f
  60. {
    # @) X2 n$ z/ b3 c/ K
  61. WM_MoveWindow(hFrameWin, -2, 0);; e8 f( m5 a9 ^) D
  62. GUI_Delay(50);
    . |% p$ E' h3 s* C
  63. }3 q2 C! l7 N, ?' W' x! ^: k5 Q8 M
  64. }3 v: z8 `; z1 A: H. J8 E/ j
  65. }
复制代码
这个例子的整体显示效果如下:
29.5.png
29.4 总结
    本期教程就跟大家讲这么多,希望通过创建的这三个DEMO让大家对STemWin创建裸机或者多任务系统有个整体认识,具体工程中用那种方式要根据实际的需求来决定。

$ H8 Z, t5 c" {$ [
wyxy163@126.com 回答时间:2015-2-12 14:59:17
提示: 作者被禁止或删除 内容自动屏蔽
lkl0305 回答时间:2015-2-12 16:58:02
多谢分享!!

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版