打印
[C语言]

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

[复制链接]
6452|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
5
winter1999|  楼主 | 2014-10-16 08:55 | 只看该作者
ayb_ice 发表于 2014-10-16 08:47
这个没有基本没有其它办法

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

是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就是利用示波器来校正时间,但这样程序一变又要重新调,头痛中

使用特权

评论回复
6
ayb_ice| | 2014-10-16 09:16 | 只看该作者
winter1999 发表于 2014-10-16 08:55
是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就 ...

主循环不要调用MS级的延时,抖动最大应该可以做到几个MS,也就是3~5个中断周期

使用特权

评论回复
7
ayb_ice| | 2014-10-16 09:16 | 只看该作者
winter1999 发表于 2014-10-16 08:55
是的,现在就是ms级的任务有抖动,有的任务不太介意,但有的要求就要相对严格些。我暂时用了最笨的方法就 ...

主循环不要调用MS级的延时,抖动最大应该可以做到几个MS,也就是3~5个中断周期

使用特权

评论回复
8
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的定时也会抖动。这个矛盾我还找不到好方法来解决。

使用特权

评论回复
9
受不了了| | 2014-10-16 09:26 | 只看该作者
200毫秒,得多大任务啊

使用特权

评论回复
10
ayb_ice| | 2014-10-16 09:32 | 只看该作者
winter1999 发表于 2014-10-16 09:22
谢谢,ms级的延时是没有的。但是有的任务执行起来耗费的时间比较多,已经尽量的拆分。但还是做不到us级别 ...

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

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

使用特权

评论回复
11
winter1999|  楼主 | 2014-10-16 09:39 | 只看该作者
受不了了 发表于 2014-10-16 09:26
200毫秒,得多大任务啊

是定时,不是任务执行时间

使用特权

评论回复
12
winter1999|  楼主 | 2014-10-16 09:41 | 只看该作者
ayb_ice 发表于 2014-10-16 09:32
执行操作10MS的任务都要分片,改成状态机。。。

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

是,已经尽量拆分了,但是有部分实在拆不开。。。

使用特权

评论回复
13
qbasicljx| | 2014-10-16 10:03 | 只看该作者
ucos 500us 的最高优先级
不过500us 的确时间太短了 不好处理
状态机,500us 的采用时间中断吧 呵呵

使用特权

评论回复
14
qbasicljx| | 2014-10-16 10:07 | 只看该作者
没有看到 CPU是 mega8 呵呵

使用特权

评论回复
15
zhaoyu2005| | 2014-10-16 10:25 | 只看该作者
595x3,是3片595吧,如果是,这个执行用硬件spi很方便也节省时间。至于对时间有严格要求的,就用定时器中断处理吧,参考操作系统的处理方式

使用特权

评论回复
16
车彦锋| | 2014-10-16 10:25 | 只看该作者

使用特权

评论回复
17
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模拟的。

使用特权

评论回复
18
zhaoyu2005| | 2014-10-16 10:36 | 只看该作者
winter1999 发表于 2014-10-16 10:29
thx,是3片595级联。硬件上并没有利用硬的SPI,而是IO模拟,同样还有一路IIC也是IO模拟,总之硬的SPI,II ...

你这不是自找麻烦么,有硬件资源的当然硬件资源优先,没有的才模拟。比如595你用硬件spi,发送数据不用管,发完了(中断或者定时)发个锁存信号,占用很少的时间,i2c也是同样的道理。

使用特权

评论回复
19
ayb_ice| | 2014-10-16 10:53 | 只看该作者
winter1999 发表于 2014-10-16 09:41
是,已经尽量拆分了,但是有部分实在拆不开。。。

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

一般情况下CPU是足够快的,只是与CPU打交道的外设不够快,这时就需要协调了,CPU只管调度与协调了。。。

使用特权

评论回复
20
winter1999|  楼主 | 2014-10-16 11:03 | 只看该作者
ayb_ice 发表于 2014-10-16 10:53
拆不开的就是中断驱动机制,
比如通信,把数据存入队列缓冲区,然后通过中断发送,

嗯,关键是有些数据计算很耗时。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

136

帖子

2

粉丝