请问各位大侠,如何在嵌入式操作系统,如ucosii中实现任务的定时重置?

youfimiya 2014-11-15 09:29:13
在下遇到的问题是这样的:
在嵌入式操作系统中,建立两个不同优先级任务,每个任务最初要求是分别运行0.2s,高优先级的先运行。

当出现以下情况时:
先运行的高优先级任务提前运行完了——即在0.2s时限到来之前完成既定任务
则:
剩余的时间等待,直到0.2s耗完,再进行第二个任务
当出现以下情况时:
先运行的高优先级任务在0.2s时限到来之时还没有运行完
则:
则系统立即放弃第一个任务,开始运行第二个任务

第二个任务的调度也符合上面的规律,然后再是,当任务一/二再次开始运行时,重置这个任务,即从这个任务的第一条代码处开始运行。

请问各位大侠, 这个任务调度应该怎么实现?

还有一个问题,在嵌入式操作系统的时间片的轮询功能中,提到若一个任务在第一个时间片内没有运行完,当它的第二个时间片到来之时,是重新开始运行(重置这个任务)的,而不是接着第一个时间片的末尾开始运行的,请问,有没有大侠能够帮组在下解释一下其中的原理?


在此拜谢各位大侠了!
...全文
395 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
changing_better 2014-11-24
  • 打赏
  • 举报
回复
如果只是俩个task干嘛还用操作系统,如果是多task,在任务切换的地方判断是不是你要求的那个优先级,如果是你要求的优先级,则把要恢复的上下文变成你task刚开始运行的上下文,而不是任务切换时的上下文,这样可以做到任务重置,不管你task跑到什么地方。顺便说下,任务切换周期可以设置成0.2S,或者更低,看你们对精度的要求,其次不要做一些原子操作。
zhujinqiang 2014-11-19
  • 打赏
  • 举报
回复
楼上说得很对。 OS的切换一般都是保存上下文,切回来的时候,是任务继续运行。
zhujinqiang 2014-11-17
  • 打赏
  • 举报
回复
这个是教科书的题目? 每次遇到没执行完的任务都重置? 那要是一直遇到0.2s时限到来之前没有完成既定任务,下次又重置了,也就是永远没有完成? 实际项目会遇到这样的情况吗?
Heaven_Redsky 2014-11-17
  • 打赏
  • 举报
回复
“令当前正在运行的任务放弃处理器使用权的代码应该放在哪里?” 设置系统时钟中断的切换频率,也就是我们常说的时钟滴答频率,即每个时间片是1秒的多少分之一。一般的操作系统都应有类似的函数。 我这个思路是要修改系统的调度代码的,如果是开源的ucos之类,我想应该可以找到的。 另,如果你说的需求是要用于卫星相关项目,并且硬实时性要求很高的话,那么似乎只采用操作系统的时钟来控制任务的切换是不够安全的,毕竟操作系统自身也要占用时间来完成一些必要的维护工作,这样即使真的做到2个任务互相切换,也无法保证任务完全运行满0.2s。如果一定要保证0.2S的运行时间,那么采用一个单独的硬件时钟晶振模块来触发工作似乎更稳妥一些。 不了解你们的项目背景,仅供参考吧。
youfimiya 2014-11-17
  • 打赏
  • 举报
回复
引用 5 楼 zhujinqiang 的回复:
这个是教科书的题目? 每次遇到没执行完的任务都重置? 那要是一直遇到0.2s时限到来之前没有完成既定任务,下次又重置了,也就是永远没有完成? 实际项目会遇到这样的情况吗?
0.2s是这个任务组合的工作周期,每一个周期刚开始的时候,任务1都要从外部接受数据,然后开始新一轮的任务循环。 上面的任务描述简化自一个卫星相关的项目,卫星定时获取自身姿轨数据进行导航率计算不就是一个不断重复的任务调度流程么,而且一旦任务卡死到时限到来之时还没有完成,必须把他放弃,开始接下来的任务......
youfimiya 2014-11-16
  • 打赏
  • 举报
回复
引用 3 楼 Heaven_Redsky 的回复:
我的思路是这样的: 1. 把时间片设置成0.2s 2. 在任务开始阶段,把上下文全部保存在一个全局数据区里 3. 只有时间片中断可以出发任务调度 4. 修改任务调度程序,在任务切换的时候把步骤1中保存的任务初始时上下文重新加载,而不是把之前做任务切换的时候保存的上下文加载进去。 对于步骤4,似乎也可以采用在时间片中断来临时,直接把当前运行的任务杀死,以后每次都重新建立一个任务的方法。没细想,楼主参考吧。
定时0.2s令当前运行的任务放弃处理器使用权,开始运行下一个任务,下一个任务也按照这种方法调度。 应该是这样没错,那么这个令当前正在运行的任务放弃处理器使用权的代码应该放在哪里? 另,任务调度程序是由系统自动完成的,将加载当前就绪最高优先级任务的堆栈首地址,若是之前已经运行过得任务,则开始继续从断电运行——是不是要修改系统任务切换的代码,将任务切换时不在保存当前正在运行的任务当前的堆栈首地址而是初始化任务时的堆栈首地址? 不胜感激,谢谢!
Heaven_Redsky 2014-11-16
  • 打赏
  • 举报
回复
我的思路是这样的: 1. 把时间片设置成0.2s 2. 在任务开始阶段,把上下文全部保存在一个全局数据区里 3. 只有时间片中断可以出发任务调度 4. 修改任务调度程序,在任务切换的时候把步骤1中保存的任务初始时上下文重新加载,而不是把之前做任务切换的时候保存的上下文加载进去。 对于步骤4,似乎也可以采用在时间片中断来临时,直接把当前运行的任务杀死,以后每次都重新建立一个任务的方法。没细想,楼主参考吧。
youfimiya 2014-11-15
  • 打赏
  • 举报
回复
引用 1 楼 xuweiwei1860 的回复:
timer中断应该可以吧。
额,不好意思,请问,能更具体的讲一讲怎么用timer中断么? timer定时器是不是在主程序里安装? 两个任务的代码依旧是作为主程序的代码? timer中断中执行的是什么功能? 万分感谢!
fly 100% 2014-11-15
  • 打赏
  • 举报
回复
timer中断应该可以吧。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧