[C语言] 请教,资源紧张的情况下用什么样的程序结构?

[复制链接]
 楼主| winter1999 发表于 2014-10-15 23:56 | 显示全部楼层 |阅读模式
老菜鸟请教下大伙,有这么个活,我始终想不出一个合适的程序结果去写,故写出来请教下:

MCU: MEGA8,8M晶振。
1、任务A需要每500us调用一次,任务执行周期350us,无法分解。
2、串行通讯,接收周期20ms,100ms, 200ms, 500ms, 1000ms。发送周期20ms,100ms, 200ms, 500ms, 1000ms。
3、输入捕捉中断。输入周期最小大约40us。
4、输入捕捉中断,周期最小256us。
5、需要驱动外围的芯片有HT1621和595x3,24C02。

---------------
单片机已经不能更改。
目前用最原始的前后台方法。定时器中断500us一次,任务A放在中断里执行,剩下的150us计算定时时基,
主要的矛盾在于,有些任务需要时间比较准确,当在主程序中扫描时,定时不准确,分析是执行任务的时间太长,比如
驱动595和读写24c02这些任务都需要时间,往往影响时基,请问,这种情形有没有什么好的程序结构来解决?
谢谢大家!
nyszx 发表于 2014-10-16 08:00 | 显示全部楼层
帮顶
 楼主| winter1999 发表于 2014-10-16 08:25 | 显示全部楼层
谢楼上
ayb_ice 发表于 2014-10-16 08:47 | 显示全部楼层
这个没有基本没有其它办法

必须500US定时中断一次,MS级的任务放在主循环。。。

MS级的任务可能会有些抖动,但不会有累计误差,这个是容易做到的,对中断计数就可以了

评分

参与人数 1威望 +3 收起 理由
winter1999 + 3

查看全部评分

 楼主| winter1999 发表于 2014-10-16 08:55 | 显示全部楼层
ayb_ice 发表于 2014-10-16 08:47
这个没有基本没有其它办法

必须500US定时中断一次,MS级的任务放在主循环。。。

是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就是利用示波器来校正时间,但这样程序一变又要重新调,头痛中
ayb_ice 发表于 2014-10-16 09:16 | 显示全部楼层
winter1999 发表于 2014-10-16 08:55
是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就 ...

主循环不要调用MS级的延时,抖动最大应该可以做到几个MS,也就是3~5个中断周期
ayb_ice 发表于 2014-10-16 09:16 | 显示全部楼层
winter1999 发表于 2014-10-16 08:55
是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就 ...

主循环不要调用MS级的延时,抖动最大应该可以做到几个MS,也就是3~5个中断周期
 楼主| winter1999 发表于 2014-10-16 09:22 | 显示全部楼层
ayb_ice 发表于 2014-10-16 09:16
主循环不要调用MS级的延时,抖动最大应该可以做到几个MS,也就是3~5个中断周期 ...

谢谢,ms级的延时是没有的。但是有的任务执行起来耗费的时间比较多,已经尽量的拆分。但还是做不到us级别。比如任务B执行耗费20~30ms不等,那么对紧跟着的任务C就有了影响,而刚好任务C里面有个功能是需要200ms定时,这样基本定时器中断里计数,那么任务C的定时也会抖动。这个矛盾我还找不到好方法来解决。
受不了了 发表于 2014-10-16 09:26 来自手机 | 显示全部楼层
200毫秒,得多大任务啊
ayb_ice 发表于 2014-10-16 09:32 | 显示全部楼层
winter1999 发表于 2014-10-16 09:22
谢谢,ms级的延时是没有的。但是有的任务执行起来耗费的时间比较多,已经尽量的拆分。但还是做不到us级别 ...

执行操作10MS的任务都要分片,改成状态机。。。

除非是偶而超过10MS。。。
 楼主| winter1999 发表于 2014-10-16 09:39 | 显示全部楼层
受不了了 发表于 2014-10-16 09:26
200毫秒,得多大任务啊

是定时,不是任务执行时间
 楼主| winter1999 发表于 2014-10-16 09:41 | 显示全部楼层
ayb_ice 发表于 2014-10-16 09:32
执行操作10MS的任务都要分片,改成状态机。。。

除非是偶而超过10MS。。。 ...

是,已经尽量拆分了,但是有部分实在拆不开。。。
qbasicljx 发表于 2014-10-16 10:03 | 显示全部楼层
ucos 500us 的最高优先级
不过500us 的确时间太短了 不好处理
状态机,500us 的采用时间中断吧 呵呵
qbasicljx 发表于 2014-10-16 10:07 | 显示全部楼层
没有看到 CPU是 mega8 呵呵
zhaoyu2005 发表于 2014-10-16 10:25 | 显示全部楼层
595x3,是3片595吧,如果是,这个执行用硬件spi很方便也节省时间。至于对时间有严格要求的,就用定时器中断处理吧,参考操作系统的处理方式
车彦锋 发表于 2014-10-16 10:25 | 显示全部楼层
 楼主| winter1999 发表于 2014-10-16 10:29 | 显示全部楼层
zhaoyu2005 发表于 2014-10-16 10:25
595x3,是3片595吧,如果是,这个执行用硬件spi很方便也节省时间。至于对时间有严格要求的,就用定时器中断 ...

thx,是3片595级联。硬件上并没有利用硬的SPI,而是IO模拟,同样还有一路IIC也是IO模拟,总之硬的SPI,IIC全都没用都是IO模拟的。
zhaoyu2005 发表于 2014-10-16 10:36 | 显示全部楼层
winter1999 发表于 2014-10-16 10:29
thx,是3片595级联。硬件上并没有利用硬的SPI,而是IO模拟,同样还有一路IIC也是IO模拟,总之硬的SPI,II ...

你这不是自找麻烦么,有硬件资源的当然硬件资源优先,没有的才模拟。比如595你用硬件spi,发送数据不用管,发完了(中断或者定时)发个锁存信号,占用很少的时间,i2c也是同样的道理。
ayb_ice 发表于 2014-10-16 10:53 | 显示全部楼层
winter1999 发表于 2014-10-16 09:41
是,已经尽量拆分了,但是有部分实在拆不开。。。

拆不开的就是中断驱动机制,
比如通信,把数据存入队列缓冲区,然后通过中断发送,

一般情况下CPU是足够快的,只是与CPU打交道的外设不够快,这时就需要协调了,CPU只管调度与协调了。。。
 楼主| winter1999 发表于 2014-10-16 11:03 | 显示全部楼层
ayb_ice 发表于 2014-10-16 10:53
拆不开的就是中断驱动机制,
比如通信,把数据存入队列缓冲区,然后通过中断发送,

嗯,关键是有些数据计算很耗时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

136

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

37

主题

136

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部