《FreeRTOS内核实现与应用开发实战指南:基于STM32》 —3.2 多任务系统

举报
华章计算机 发表于 2019/12/07 11:50:40 2019/12/07
【摘要】 本节书摘来自华章计算机《FreeRTOS内核实现与应用开发实战指南:基于STM32》一书中第3章,第3.2节,作者是刘火良 杨 森。

3.2 多任务系统

相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中,任务与中断一样,也具有优先级,优先级高的任务会被优先执行。当一个紧急事件在中断中被标记之后,如果事件对应的任务的优先级足够高,就会立刻得到响应。相比前后台系统,多任务系统的实时性又被提高了。多任务系统大概的伪代码具体参见代码清单3-3。

代码清单3-3 多任务系统伪代码

 1 int flag1 = 0;

 2 int flag2 = 0;

 3 int flag3 = 0;

 4

 5 int main(void)

 6 {

 7     /* 硬件相关初始化 */

 8     HardWareInit();

 9

10     /* RTOS初始化 */

11     RTOSInit();

12

13     /* RTOS启动,开始多任务调度,不再返回 */

14     RTOSStart();

15 }

16

17 void ISR1(void)

18 {

19     /* 置位标志位 */

20     flag1 = 1;

21 }

22

23 void ISR2(void)

24 {

25     /* 置位标志位 */

26     flag2 = 2;

27 }

28

29 void ISR3(void)

30 {

31     /* 置位标志位 */

32     flag3 = 1;

33 }

34

35 void DoSomething1(void)

36 {

37     /* 无限循环,不能返回 */

38     for (;;) {

39         /* 任务实体 */

40         if (flag1) {

41

42         }

43     }

44 }

45

46 void DoSomething2(void)

47 {

48     /* 无限循环,不能返回 */

49     for (;;) {

50         /* 任务实体 */

51         if (flag2) {

52

53         }

54     }

55 }

56

57 void DoSomething3(void)

58 {

59     /* 无限循环,不能返回 */

60     for (;;) {

61         /* 任务实体 */

62         if (flag3) {

63

64         }

65     }

66 }

相比前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的、无限循环且不能返回的小程序,这个小程序我们称之为任务。每个任务都是独立的、互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程时不需要精心地设计程序的执行流,不用担心每个功能模块之间是否存在干扰,编程反而变得简单了。整个系统的额外开销就是操作系统占据的少量FLASH和RAM。现如今,单片机的FLASH和RAM越来越大,完全足以抵消RTOS的开销。

无论是裸机系统中的轮询系统、前后台系统还是多任务系统,我们不能简单地说孰优孰劣,它们是不同时代的产物,在各自的领域都还有相当大的应用价值,只有合适的才是最好的。有关这三者的软件模型的区别如表3-1所示。

表3-1 轮询系统、前后台系统和多任务系统软件模型的区别

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。