UCOS应用 | 任务的设计

任务函数的结构

单次执行的任务

含义:此类任务只执行一次,执行结束后即自行删除。通常用于“启动任务”。单次执行的任务采用“创建任务函数”来启动

用处:每当需要执行该任务时,就将该任务创建一次,由键盘操作启动你的任务通常采用这种结构。

注意:采用此种方式来启动一个任务,除了实时性差意外,还可能有一些后遗症:

  • 占用共享资源未释放
  • 积压信号量或者消息
  • 可能留下未删除干净的废弃变量

适合采用“创建任务”的方式来启动的任务,通常时孤立任务,他们不和其他任务进行通信,只使用共享资源来获取信息和输出信息。

周期性执行的任务

含义:通过合理设置OSTimeDly()和OSTimeDlyHMSM的参数值可以调整任务的执行周期。当任务执行周期远大于系统时钟节拍时,任务执行周期的相对误差就比较小。

用处:实际应用中很多任务具有周期性,如键盘扫描,动态显示刷新任务,模拟信号采样任务等。同时如果希望有很高的周期稳定性,可以采用独立定时器触发任务。

事件触发执行的任务

含义:此类任务创建后很快可以获得运行权,但是执行实体任务需要等待某种事件的发生,在相关事件发生之前,则被操作系统挂起,相关之间发生一次,就执行一次。

用处:例如用一个“发送”按钮启动串口通信任务,则将数据发送到上位机,在键盘任务中,按下”发送“按钮之后就发出信号量。

注意:当触发条件为事件间隔,则该任务具有周期性,这种任务函数结构适用于执行周期小于一个时钟节拍或者不是时钟节拍的整数倍的周期性任务。

有些触发任务得事件属于信号类(信号量),其作用仅仅是启动任务的运行。有些属于信息类(邮箱中的消息),可以启动 任务,也可为该任务提供原始数据和资料。

任务优先级安排

  • 中断关联性:与中断服务程序有关联的任务尽可能高
  • 紧迫性:对响应时间有要求
  • 关键性
  • 频繁性
  • 快捷性:在前面各项相近,耗时较少的任务可以安排高一点优先级
  • 传递性:信息传递的上游任务优先级高于下级任务

优先级安排比较宽松时,新增任务就比较方便,在不改变现有优先级的情况下,很容易更具需要找到一个合适的空闲任务。

任务函数设计中的问题

公共函数的调用

如果一个任务正在调用某个公共函数,被高优先级任务打断,则很有可能会破坏原任务的数据。通常采取两种措施:互斥调用和可重入设计。

  • 互斥调用:将公共函数作为一种共享资源,如果执行时间段,则可关中断或者关调度,再调用公共函数。否则需要配备一个互斥信号量。
  • 可重入设计:公共函数不适用全局资源,所有变量均为局部变量。同时可重入函数中的调用的其他函数也应该为可重入函数。

与其他任务的协调

采用操作系统提供的同步和通信机制来进行任务之间的协调运行。详见后续的行为同步章节。

共享资源的访问

任务应该要保护共享资源不被破坏,详细见后续资源同步章节。

与其他任务进行数据通信

各个任务,中断之间必然伴随数据通信,操作系统中有多种方法实现,如何选择最合适的通信方式,详细见后续数据通信章节。

任务函数的代码设计过程

凡是操作系统提供了的服务功能,必须调用相应的服务函数,使用自己定义的服务函数是很冒险的。

任务之间不仅有数据流动,还有行为互动,而且互动之间的作用是通过操作系统的服务来实现的。

系统钟体关联图

一个任务代码的色痕迹过程是重上到下的,我们首先需要知道各个任务再系统中的位置和角色,再将一个个任务进行详细关联分析,画出任务流程图,再按照流程图编写代码。

完成了任务的划分之后,就必须把这些任务之间的相互关系搞清楚,可以使用总体任务关联图来表示各个任务(ISR)之间的相互关系。

例:

image-20210429160333028

任务关联分析

任务函数一个个编写,每一个都必须非常清楚地掌握它与其他任务的关系。一般有两种关系,行为同步关系,资源同步关系。

一个是需要考虑它与其他任务的制约与控制,一个是需要考虑与其他任务的数据交互。

任务的程序流程图

复杂的应用必须要画出程序流程图,简单的可以直接编写。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值