2425|3

6828

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

MSP430移植uCOS [复制链接]

不带操作系统的程序,所有的代码、任务都是放在一个大循环下的。这种情况如果工程里任务不多,那问题不大。但如果项目是多任务,那在最后组合程序的时候会比较棘手。因为在单独调试每一个模块的时候,模块程序之间是相互独立的死循环。但最后要把所有单独的模块任务整合到一个大循环下,这时会出现各种各样的问题。有时甚至程序结构都要调整。这个弊端任务越多越明显。

但uCOS可以直接实现死循环和死循环之间的调用(通过设置各个任务的优先级与挂起时间)。这样一来,应对多任务的工程时会有以下好处:

1、将多任务明确地模块化,使工程代码更规整,阅读与调试起来更方便,多任务代码的最后整合非常简单;
2、使整个系统更稳定。(普通的程序,如果在哪一个任务那里陷入死循环或者跑飞,就会一直卡在那里,没法往下运行了。但uCOS不会,一个任务出现问题不会影响其他任务的进行。因为如果哪个任务死循环了,时间一到你反正要OUT,让其他进程运行的。)

但记住,任何操作系统都是牺牲效率来换取其他方面的便利的。所以单任务或者任务较少时,不推荐用操作系统。只有在多任务实时调度时,uCOS才能发挥出它的优势

最新回复

一般情况,用状态机比较好  详情 回复 发表于 2015-7-5 16:23
 
点赞 关注(3)

回复
举报

3238

帖子

5

TA的资源

五彩晶圆(中级)

推荐
 
qiushenghua 发表于 2015-6-30 07:48
完全可以不用uCOS也能实现轮询,并且很好的调度好任务来的。
我说说我的做法吧:

首先,我会在主函数里 ...

基于时间片的方法还是挺不错的,现在我的MSP430项目代码就是这样的结构,这样比起上UCOS好多,毕竟这个占用资料多,也运行不了多少个任务。
 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
完全可以不用uCOS也能实现轮询,并且很好的调度好任务来的。
我说说我的做法吧:

首先,我会在主函数里设定各个子任务的轮询:
  1. int main()
  2. {
  3.         init();
  4.         while(1)
  5.         {
  6.                 function1();
  7.                 function2();
  8.                 function3();
  9.                 ……
  10.         }
  11. }
复制代码

接下来,在子任务里,我会要求每个子任务的执行时间不能超过某个限度,否则会影响其他任务的实现。
那么如果子任务需要耗时比较久怎么办?
简单,将子任务分解成多个片段,然后通过状态机来实现。
一次没有完成的任务放到下一个状态来完成。只要状态分得够细,那么多任务就不会相互冲突。
以function1为例,说说状态机的写法,以及实现延时的方式:
  1. void function1()
  2. {
  3.         if(function1_delay);
  4.         else
  5.         switch(function1_state)
  6.         {
  7.                 case 0:
  8.                         do_something_here_0();
  9.                         function1_state=1;
  10.                         function1_delay=1000;
  11.                         break;
  12.                 case 1:
  13.                         do_something_here_1();
  14.                         function1_state=2;
  15.                         function1_delay=300;
  16.                         break;
  17.                 case 2:
  18.                 ……
  19.                 default:
  20.                         break;
  21.         }
  22. }

  23. #pragma vector=TIMER0_A0_VECTOR
  24. __interrupt void Timer_A (void)
  25. {
  26.         if(function1_delay)function1_delay--;
  27.         if(function2_delay)function2_delay--;
  28.         if(function3_delay)function3_delay--;
  29.         ……
  30. }
复制代码

只要将所有的子任务全部用状态机的形式来实现,然后主函数的轮询间隔足够短,轮询频率足够高,那么多任务是很容易实现的事情。
这其中的关键就在于写好每一个状态机。
与操作系统相比,这样的轮询方式优点在于没有保护现场的出入栈操作,提高了效率,缺点在于每个任务都变得比较抽象,很难理解使用状态机来编写子任务的意义。
还有一个缺点是没法调度任务的优先级,所有的任务都按照一定的次序进行,每个任务都会占用一定的时间片段来执行。
因此也不存在哪个任务优先级较高,阻塞其他任务进行的情况。

在这样的模式下,将时间片拆分得越短,任务的实时性就越好。

点评

基于时间片的方法还是挺不错的,现在我的MSP430项目代码就是这样的结构,这样比起上UCOS好多,毕竟这个占用资料多,也运行不了多少个任务。  详情 回复 发表于 2015-7-5 11:29

赞赏

2

查看全部赞赏

 
 
 

回复

2886

帖子

0

TA的资源

五彩晶圆(初级)

4
 
一般情况,用状态机比较好
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表