c语言多任务+51单片机,基于51单片机多任务嵌入式操作系统模型.doc

基于51单片机多任务嵌入式操作系统模型

这个操作系统很给力一种裸奔多任务模型 一个网友的总结:stateMachine?+?timerTick?+?queue。 在RTOS环境下的多任务模型: 任务通常阻塞在一个OS调用上(比如从消息队列取数据)。 外部如果想让该任务运转,就要向消息队列发送消息。 任务收到消息时,根据当前状态,决定如何处理消息。这就是状态机。 任务将消息队列中的消息处理完毕后,重新进入阻塞状态。 任务在处理中,有时要延时一段时间,然后才继续工作: ????为了充分使用CPU,可以通过OS调用让其它任务去工作。 ????OS通常会提供一个taskDelay调用。 ????当任务调用taskDelay时,即进入阻塞状态,直到超时,才重新进入可工作状态(就绪状态)。 下面说说裸奔环境下的多任务模型: 裸奔也可以多任务,但调度是由用户自主控制。 在RTOS环境下,一般提供抢占式调度。在裸奔时,一般是任务在处理告一段落后,主动结束处理。 RTOS环境下的任务,一般处于一个while(1)循环中。 ????while(1){ ????????从消息队列接收消息。如果没有,将阻塞。 ????????处理消息。 ????????} 裸奔下的任务,一般采用查询方式: { ????查询是否有待处理的事件。 ????如果没有,返回。 ????如果有,根据任务的当前状态,进行处理。处理完毕后,可能返回,也可能将待处理事件全部处理完毕后再返回。 } 裸奔任务其实也处于一个while(1)循环中,只不过这个循环在任务外部。 main() { ????A_taskInit();????????//任务的初始化 ????B_taskInit(); ????... ????while(1){ ????????A_taskProc();????//任务的处理 ????????B_taskProc(); ????????} } 状态机既适用于OS环境,也适用于裸奔环境。 但在裸奔环境下,状态可能被切分得更细。例如后面讲的如何在裸奔环境实现taskDelay()。 消息队列既适用于OS环境,也适用于裸奔环境。 在OS环境下,消息队列机制由OS提供。 在裸奔环境下,消息队列要自己来实现。如果对队列的概念不清楚,可参考《数据结构》教材。 这个队列机制,可做成通用模块,在不同的程序中复用。 消息队列用于缓冲事件。事件不知道什么时候会到来,也不能保证来了就能迅速得到处理。 ????使用消息队列,可以保证每个事件都被处理到,以及处理顺序。 一般在两种情况下会用到消息队列: ????存储外部事件:外部事件由中断收集,然后存储到队列。 ????????串口接收程序中的接收循环缓冲区,可理解为消息队列。 ????任务间通讯:一个任务给其它任务发送消息。 timerTick,就是系统中的时钟基准。OS中总是有一个这样的基准。 在裸奔时,我们要用一个定时器(或RTC或watchdog)来建立这个时间基准。 一个tick间隔可以设置为10ms(典型RTOS的缺省设置)。让定时器10ms中断一次,中断发生时给tickNum++。 ????以前,我在定时器中断中设置1S标志、200ms标志等等。时间相关的任务根据这些标志判断是否要执行。 ????近来,一般让任务直接去察看tickNum。两次相减来判断定时是否到达。 ????也可以在系统中建立一个通用定时器任务,管理与不同任务相关的多个定时器;在定时到达时,由定时器任务去调用相应的callback。 系统时钟基准是所谓“零耗时裸奔”的基础。 timerTick的分辨率,决定了只适于于较大的时间延时。 ????在做时序时的小延时,用传统方法好了。 OS中的taskDelay()在裸奔环境下的一种实现: OS环境: void?xxxTask(void) { ????while(1){ ????????//waitEvent ????????//do?step_1 ????????taskDelay(TIME_OUT_TICK_NUM); ????????//do?step_2 ????} } 裸奔环境: void?xxxTask(void) { ????static?unsigned?int?taskStat?=?STAT_GENERAL;????//任务状态变量 ????static?timer_t?startTick; ????timer_t?currTick; ???? ????if?(taskStat?==?STAT_GENERAL) ????{ ????????//check?ev

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值