3541|16

333

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

msp430同时执行多少任务最稳定? [复制链接]

我做的msp430F149单片机,同时执行以下任务:
1.TXD0和RXD0连接GPRS模块进行指令发送。
2.TXD1和RXD1连接485和其他模块进行通信。
3.A/D测量模拟量。
4.同时液晶显示。
这个任务量多不多啊?现在感觉程序很不稳定啊,时不时就不按照预定的效果进行,有时候中断都进不去。

最新回复

呵呵,谈不上解答,我也是略懂皮毛,大家一起探讨。        我的心跳时间一般设置为1ms,任务到底分配多少时间,到底多久执行一次,这就要根据你的需要了。比如说数码管需要动态扫描,要使人看起来不闪烁,那就要保证数码管扫描这个任务至少20ms执行一次。        按键嘛,你可以建立一个缓冲队列(FIFO),按键检测任务每20ms(软件消抖)执行一次,按键检测函数里就判断按键先前状态和当前状态是否满足条件(我是判断下降沿是否到来),符合条件就将键值压入队列。在每一次的按键检测任务都要保存一次按键先前的状态和当前状态哦。每次都从队列中读取键值,这样就不会有漏检了。 还有长短键也可以用类似的方法来实现。   详情 回复 发表于 2014-9-17 12:10
 
点赞 关注

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

推荐
 
while(1);//这就是阻塞语句
while(flag);//这还是阻塞语句

int main()
{
while(1)
{
   if(flag==1){do_something_1();flag=2;}
   if(flag==2){do_something_2();flag=4;}
   if(flag==3){do_something_3();flag=5;}
   if(flag==4){do_something_4();flag=0;}
   if(flag==5){do_something_5();flag=6;}
   if(flag==6){do_something_6();flag=0;}
}
}
//类似上面这样,在中断里i就设置flag的值就好了,设置完就退出中断,由于flag初始为0,上面的所有语句都不执行,知道flag=1,才开始依次执行1-2-4,然后flag回到0。
//还有,某些时候我们看到delay延时函数是用for(;i>0;i--);这样的方式实现的。其实是让单片机空跑N个循环,虽然单片机在空跑,但是CPU资源依旧被占用着不能执行其他的任务。如果把这部分时间拿出来好好利用好,也可以提高多任务执行的效果。
举例说一下:
还是上面的状态机,我们看到flag的执行顺序是1-2-4-0,假定只有1-4两个任务,中间是需要延时1秒。那么我们可以这么做:
1.设置一个定时器中断,中断周期1ms,中断服务里写if(delay>0)delay--;这里的delay是一个全局无符号整形变量。
2.
if(flag==1){do_something_1();delay=1000;flag=2;}
if(flag==2){do_something_2();}
do_something_2()
{
if(!delay)flag=4;
}
delay会从1000往下减,每1ms减1,知道0的时候符合flag==2且!delay=true条件,flag=4跳转到下面的语句。在这之前flag=2,且if(flag==2)的语句很快就执行完,不会耽误CPU执行其他的任务(例如if(flag2==1)之类的)

 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
不执行任务最稳定,即使程序跑飞了你也不知道。
执行N个任务也能很稳定,只要单片机有足够的周期完成所有的任务。

给几个提醒:
1.中断要短
2.尽可能用中断唤起程序,不要把程序阻塞住
3.在主函数里执行需要的任务,必要的时候把任务分解成状态机的形式
 
 
 

回复

1042

帖子

6

TA的资源

纯净的硅(中级)

板凳
 
如楼上所说,中断程序要断;
各模块尽量用查询的方式,不要用WHILE等一些延时循环;
 
 
 

回复

2856

帖子

260

TA的资源

五彩晶圆(高级)

4
 
430不适合你的任务应用。
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

5
 
qiushenghua 发表于 2014-9-10 21:08
不执行任务最稳定,即使程序跑飞了你也不知道。
执行N个任务也能很稳定,只要单片机有足够的周期完成所有 ...

您好,请教下
1.程序阻塞住是什么意思?是中断里有大量程序导致程序一致在中断里跑而导致不能及时出来执行其他中断的程序或者main程序吗?
2.分解成状态机第一次听见,是怎么个模式?
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

6
 
music_586 发表于 2014-9-10 21:19
如楼上所说,中断程序要断;
各模块尽量用查询的方式,不要用WHILE等一些延时循环;

您好,请教下,查询方式是怎么个意思?
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

7
 
ltbytyn 发表于 2014-9-10 21:21
430不适合你的任务应用。

为什么啊?
 
 
 

回复

391

帖子

1

TA的资源

一粒金砂(高级)

8
 

从功耗方面考虑吧,MSP430是低功耗单片机,所以尽可能的使用较低的频率,以降低功耗。看了你的应用,我也觉得不适合。
 
个人签名尽善尽美
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

10
 
hh376158101 发表于 2014-9-10 22:00
从功耗方面考虑吧,MSP430是低功耗单片机,所以尽可能的使用较低的频率,以降低功耗。看了你的应用,我也 ...

我觉得如果仅有这4个任务,430还是可以胜任的。
首先,两个串行任务都可以通过中断来完成,完成后可以进入低功耗模式。
其次,ADC不一定要求以200k的速率进行采样,完全可以用定时器触发采样,采样完成继续进入低功耗模式。
还有,液晶显示就更好说了,只有在刷新的时候需要唤醒CPU,刷新完成可以继续进入低功耗模式。

串行任务如果波特率不大于9600,可以进入LPM3并在LPM3模式下直接完成发送接收。波特率如果大于9600,则只能进入LPM0。
 
 
 

回复

391

帖子

1

TA的资源

一粒金砂(高级)

11
 
qiushenghua 发表于 2014-9-10 22:24
我觉得如果仅有这4个任务,430还是可以胜任的。
首先,两个串行任务都可以通过中断来完成,完成后可以进 ...

我的意思是说,你的其他模块功耗比单片机的还高这么多,可以不用考虑低功耗单片机的,MSP430的价格比较高。如果任务多的话,可以使用定时器设定一个心跳时间 ,每个任务根据这个心跳时间有规律的去执行。
 
个人签名尽善尽美
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

12
 
qiushenghua 发表于 2014-9-10 22:17
while(1);//这就是阻塞语句
while(flag);//这还是阻塞语句


您的编程思路确实清晰,我向您学习!我是名新手,有很所不懂之处,周围做单片机的人太少,有也水平和我差不多,交流起来也得不到什么,发现这个论坛的人很活跃和乐于解答,所以一直在这个论坛提问。虽然我的问题都很低端,但是在各位的指导下也逐步提升水平,希望有一天我也能向您一样用自己的能力为其他进入坛子的新手解答。谢谢!
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

13
 
qiushenghua 发表于 2014-9-10 22:17
while(1);//这就是阻塞语句
while(flag);//这还是阻塞语句


当flag为1的时候,是不是while(flag);在执行等待,同时其他程序也在执行,当有flag为0的时候,就执行while(flag);的下一条程序?
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

14
 
面纱如雾 发表于 2014-9-11 13:14
当flag为1的时候,是不是while(flag);在执行等待,同时其他程序也在执行,当有flag为0的时候,就执行whil ...

阻塞语句的意思是while(flag);在执行等待,同时其他程序就不执行了,注意这里有一条空语句在。

这里举的两个都是不恰当的例子,使用这样的语句会让程序停在while处等待。如果设计合理的话可以让单片机在这个原本处于等待的时间干其他活,或者直接进入低功耗状态以节省能耗。

 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(初级)

15
 
qiushenghua 发表于 2014-9-10 22:17
while(1);//这就是阻塞语句
while(flag);//这还是阻塞语句


解释的好详细啊
 
 
 

回复

977

帖子

4

TA的资源

纯净的硅(中级)

16
 
hh376158101 发表于 2014-9-10 22:47
我的意思是说,你的其他模块功耗比单片机的还高这么多,可以不用考虑低功耗单片机的,MSP430的价格比较高 ...

你的说法我赞同,有一个问题我想请教一下,使用定时器设置心跳时间这个不用说,那我每个任务分配多少时间?还有一个就是在检测独立按键的时候,如何实现消抖和松手检测?这几个问题是我之前做东西的时候遇到的,一直没有完美解决,能否解答一下,非常感谢!
 
 
 

回复

391

帖子

1

TA的资源

一粒金砂(高级)

17
 
MrKingMCU 发表于 2014-9-17 09:04
你的说法我赞同,有一个问题我想请教一下,使用定时器设置心跳时间这个不用说,那我每个任务分配多少时间 ...

呵呵,谈不上解答,我也是略懂皮毛,大家一起探讨。
       我的心跳时间一般设置为1ms,任务到底分配多少时间,到底多久执行一次,这就要根据你的需要了。比如说数码管需要动态扫描,要使人看起来不闪烁,那就要保证数码管扫描这个任务至少20ms执行一次。
       按键嘛,你可以建立一个缓冲队列(FIFO),按键检测任务每20ms(软件消抖)执行一次,按键检测函数里就判断按键先前状态和当前状态是否满足条件(我是判断下降沿是否到来),符合条件就将键值压入队列。在每一次的按键检测任务都要保存一次按键先前的状态和当前状态哦。每次都从队列中读取键值,这样就不会有漏检了。
还有长短键也可以用类似的方法来实现。

 
个人签名尽善尽美
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表