硬汉嵌入式论坛

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

[emWin教程入门篇] 【emWin实战教程V2.0】第32章      STemWin多任务设

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2017-2-10 16:01:39 | 显示全部楼层 |阅读模式
完整65章+12章附件教程下载地址:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834



第32章      STemWin多任务设计



    本章节主要为大家讲解STemWin的多任务设计方面的知识。STemWin支持单任务系统(即裸机使用)以及多任务系统,即一个任务调用STemWin或者多个任务调用STemWin。
    对于初学者来说,本章节的内容作为一个知识点了解下即可。
32.1 初学者重要提示
32.2  单任务系统(超级循环)
32.3 多任务系统:一个任务调用STemWin
32.4 多任务系统:多个任务调用STemWin
32.5 总结
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-10 16:02:35 | 显示全部楼层
32.1   初学者重要提示


u  对于初学者来说,本章节的内容作为一个知识点了解下即可。
u  emWin手册多任务设计讲解,下图是中文版的位置
32.1.png


下图是英文版的位置:
32.2.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-10 16:05:00 | 显示全部楼层
32.2单任务系统(超级循环)



32.2.1    单任务系统介绍


    STemWin可以配置为不使用RTOS,这种情况是整个程序在一个超级循环中运行。通常,软件的所有组件都进行周期性调用。因为未使用实时内核,需要实时执行的部分必须使用中断。此类型系统主要用于小型系统,或者实时特性无关紧要时。
    平时大家写裸机程序的时候基本都是下面这种方式:
  1. void main (void)
  2. {
  3.      /* 初始化硬件 */
  4. HARDWARE_Init();
  5. /* 初始化软件组件 */
  6. XXX_Init();
  7. YYY_Init();
  8. /* 超级循环: 规则的调用所以软件组件*/
  9. while (1)
  10. {
  11. /* 组件刷新 */
  12. XXX_Exec();
  13. YYY_Exec();
  14. }
  15. }
复制代码
    加入了STemWin的初始化函数后就是下面这样:
  1. void main (void)
  2. {
  3.      /* 初始化硬件 */
  4. HARDWARE_Init();
  5. /* 初始化软件组件 */
  6. XXX_Init();
  7. YYY_Init();
  8. /* 初始化emWin */
  9. GUI_Init();
  10. /* 超级循环: 规则的调用所以软件组件*/
  11. while (1)
  12. {
  13. XXX_Exec();
  14. YYY_Exec();
  15. /* emWin刷新 */
  16. GUI_Exec();
  17. }
  18. }
复制代码
    关于STemWin的使用没有实际的限定,但是需要在调用GUI_Init()之后才能使用相关函数。如果使用了窗口管理器的回调机制,则必须定期调用STemWin更新函数,通常通过在超级循环内周期调用GUI_Exec()来完成。使用单任务系统有以下优缺点:
优点
    因为未使用实时内核,所以不存在使用RTOS时的抢占或者同步问题。
缺点
    如果超级循环类型程序的代码量较大,会变得很难维护,实时特性较差,因为一个软件组件无法被任何其它组件中断(只能通过硬件中断)。这意味着一个软件组件的反应时间取决于系统中所有其它组件的执行时间。
    使用单任务系统的话,用户需要将GUIConf.h文件中如下的宏定义配置为0,即不使用OS。
    #define GUI_OS   0

32.2.2  单任务系统的实现


    前面章节配套的裸机例子全是单任务系统,即裸机方式,工程代码的结构如下:
32.3.png

关于单任务系统的框架和接口函数在前面移植章节已经讲解了,这里不再赘述。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-10 16:05:48 | 显示全部楼层
32.3 多任务系统:一个任务调用STemWin


    说明,本教程配套的RTOS版本例子全是采用的这种方式。
    使用了RTOS,用户应用程序在不同的任务中执行,这些任务通常具有不同的优先级。一般情况下,对于emWin这种用户界面操作任务,设置为最低优先级任务即可,仅比空闲任务优先级高,因为用户界面不需要什么实时性。如果使用了窗口管理器的回调机制,则必须在emWin的任务里面定期调用emWin更新函数WM_Exec,GUI_Exec()、GUI_Delay()等。另外由于emWin仅由一个任务调用,所以对于emWin而言,它与在单任务系统中的使用是相同的,且使用的RTOS没有限制。使用多任务系统有以下优缺点:
优点
    emWin刷新复杂些的界面非常耗时间,用了RTOS后,将其设置为最低优先级,那么需要实时执行的高优先级任务就能够得到及时执行,这样就使得系统的实时性有了保证,而且使用了RTOS后,就可以将不同任务交给团队不同的开发人员去完成,提高工作效率。
缺点
    用户需要拥有实时内核(RTOS),如果是商用的RTOS还需要付费,且使用RTOS要额外耗费ROM和RAM空间。此外,还必须考虑任务的同步,以及如何将信息从一个任务传输到另一个任务。
    使用多任务系统的话,用户需要将GUIConf.h文件中如下的宏定义配置为1,即使用OS。由于我们仅使用了一个任务操作emWin,配置为0也是可以的,但是鉴于教程配套例子中使用的库是带RTOS的版本,所以统一配置成1。
    #define GUI_OS   1
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-10 16:06:07 | 显示全部楼层
32.4   多任务系统:多个任务调用STemWin


这种方式不推荐用于项目中,实际测试发现这种方式不容易控制,而且有一些莫名其妙的问题不容易排查,所以不推荐大家在项目中使用,如果要学习的话,可以看我们第1版STemWin教程的第28章和第29章。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2017-2-10 16:06:25 | 显示全部楼层
32.5   总结


    本期教程就跟大家讲这么多,实际项目中推荐使用裸机方式或者多任务系统,但只有一个任务调用STemWin。多个任务调用STemWin的方式不推荐,出了问题不容易排查。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 02:15 , Processed in 0.280430 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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