搜索
bottom↓
回复: 19

请教:这种程序结构怎么安排比较合理

[复制链接]

出0入0汤圆

发表于 2009-8-31 16:54:02 | 显示全部楼层 |阅读模式
程序结构:

中断1
{
中断1标志位=1;
}
中断2
{
中断2标志位=1;
}

main()
{
程序3;

if(中断1标志位==1)
{
中断1对应的数据处理;//涉及大量数据计算,而且引用很多数字滤波函数
}

if(中断2标志位==1)
{
中断2对应的数据处理;
}

}

程序要求:
程序3计算周期长,非实时计算,而两个中断都要求实时响应处理,其中中断1的计算量较大。所以,放入

中断处理函数里进行不合适,故采取中断函数只设置标志位,数据处理在主函数内进行。现在问题是当执

行程序3时,一旦进入中断1,返回后不能立即执行中断1对应的处理程序

请教大家有何良策?谢谢

--------------------------------补充说明:
中断1是AD转换结束,然后紧接着SPI读取数据,并进行低通高通陷波等数字滤波程序,计算量大,变量多,引用的函数也很多,而且这一部分要求实时处理,所以感觉都放在中断里面不合适。

中断2是串口接收中断,优先级低于中断1,但等不及程序3执行完一次

程序3是FFT运算,时间很长,其中AD可能要中断几十次,但FFT不要求实时处理。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-8-31 17:25:41 | 显示全部楼层
所以,放入中断处理函数里进行不合适

为什么不合适?
你放在外面在执行中断1的处理的时候中断2也只能等着呀。

何况,你可以在处理中断1的时候允许中断2啊

出0入0汤圆

发表于 2009-8-31 17:32:19 | 显示全部楼层
把中断标志位改成计数器,在中断里+1,在main()里-1。
不过这样做的话要注意:main()里-1是临界操作,须关中断后执行。

出0入0汤圆

发表于 2009-8-31 17:51:44 | 显示全部楼层
把每个程序拆分成100份,或者更多。然后3个函数轮流执行,每次轮到自己时就处理完自己的N分之一,然后退出让下一个程序执行,如此循环下去则3个程序都有很强的实时性,实时性取决于其N分之一的执行时间,而和任务总执行时间无关。拆分的思想可以用状态机来实现。

出0入0汤圆

发表于 2009-8-31 18:02:55 | 显示全部楼层
我的理解是:你的程序3计算周期很长,中断1即便是响应了,程序3也未必能及时处理,也就是说可能中断1已响应了N次,程序3才执行过1次,又因为你在中断1和中断2里面只是放置一个标志,未进行实质性处理,所以中断1的处理工作从理论上讲并无实时性可言,它的响应周期是你的程序3的执行周期。想实现中断1的实时性,程序结构必须有所改动

出0入0汤圆

 楼主| 发表于 2009-8-31 18:46:16 | 显示全部楼层
谢谢楼上各位,可能我表述的不清楚,先详细说下:
中断1是AD转换结束,然后紧接着SPI读取数据,并进行低通高通陷波等数字滤波程序,计算量大,变量多,引用的函数也很多,而且这一部分要求实时处理,所以感觉都放在中断里面不合适。
中断2是串口接收中断,优先级低于中断1,但等不及程序3执行完一次
程序3是FFT运算,时间很长,其中AD可能要中断几十次,但FFT不要求实时处理。

出0入0汤圆

 楼主| 发表于 2009-8-31 18:52:56 | 显示全部楼层
2楼】 holycat 仙猫
把中断标志位改成计数器,在中断里+1,在main()里-1。
不过这样做的话要注意:main()里-1是临界操作,须关中断后执行。
------------------------------------------------------------
谢谢,不过不是很明白,还请详细说说,注意:中断1对应的处理程序要实时处理的

【3楼】 huangliumei 黄柳梅
把每个程序拆分成100份,或者更多。然后3个函数轮流执行,每次轮到自己时就处理完自己的N分之一,然后退出让下一个程序执行,如此循环下去则3个程序都有很强的实时性,实时性取决于其N分之一的执行时间,而和任务总执行时间无关。拆分的思想可以用状态机来实现。
-----------------------------------------------------------
谢谢,听起来是个不错的方法,但是实现起来好像不是很容易

4楼】 flywater 落叶
我的理解是:你的程序3计算周期很长,中断1即便是响应了,程序3也未必能及时处理,也就是说可能中断1已响应了N次,程序3才执行过1次,又因为你在中断1和中断2里面只是放置一个标志,未进行实质性处理,所以中断1的处理工作从理论上讲并无实时性可言,它的响应周期是你的程序3的执行周期。想实现中断1的实时性,程序结构必须有所改动
-----------------------------------------
你说的正是我发愁的地方,呵呵
头像被屏蔽

出0入0汤圆

发表于 2009-8-31 19:50:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2009-8-31 19:53:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2009-8-31 20:09:40 | 显示全部楼层
实时性高的部分(多次)嵌入到实时性低的部分。

低实时性f(x)
高实时性g(x)

f(x)
{
   …………
   g(x);
   …………
   g(x);
   …………
   g(x);
   …………
}

出0入0汤圆

发表于 2009-8-31 20:46:42 | 显示全部楼层
如果是我理解的那样,你的程序可以改为如下结构:
1、中断1里面其实就是AD转换,转换结果存储用一个序列,也就是用数组存储;当然,要记录数组中的AD有效值有几个--做法就不说了,弄个全局变量。
2、SPI不建议用扫描方法,如果你要在主程序里用扫描法处理SPI,肯定很累!SPI中断接收的数据存在数组中,供主程序根据情况处理。
3、主程序处理:
   子函数A、检查AD转换数据有效个数,如果是0,直接返回,如果大于0,进行相应AD处理。
   子函数B、检查SPI,是否有要处理的命令,如果没有,直接返回。
   子函数C、检查是否够条件进行低通高通陷波等数字滤波程序,如是......否则.....
   子函数D、检查是否够条件进行你的海量计算,如是.... 如果计算量太大,就如9楼上官大侠所言,中间不同程度地去调A、B、C子函数;

出0入0汤圆

发表于 2009-8-31 20:56:39 | 显示全部楼层
对了,你还有串口处理中断,接收数据也存于数组中(接收缓冲),并记录收到有效数据个数。

主程序里面再增加一个
子函数E:检查串口接收缓冲区,(应该根据你的协议进行校验--略)是否有要处理的串口命令,如有...如无,返回

出0入0汤圆

 楼主| 发表于 2009-8-31 21:55:49 | 显示全部楼层
谢谢楼上各位。

【7楼】 topdog
将定时器时间分片,长时间片3使用标志,主程序扫描3的标志,才执行一次程序3。  
--------------------------------------
谢谢,现在还不是很懂

9楼 上官大侠 的注意,很好理解,可是实现起来……比如说几十毫秒的FFT程序中怎么能要响应到每1毫秒的AD中断?

【10楼】 flywater 落叶 的方法也很有道理,谢谢。

明天再好好理解下以上的方法,谢谢大家。

出0入0汤圆

发表于 2009-8-31 22:24:49 | 显示全部楼层
很明显要用操作系统的任务切换才能解决的问题
头像被屏蔽

出0入0汤圆

发表于 2009-8-31 22:44:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2009-9-1 08:52:23 | 显示全部楼层
谢谢【14楼】 topdog 大哥的详细讲解,可是俺太笨了,还是没理解透

主程序扫描标志,并清除。us级标志后执行最快的中断,ms级次之,s级别的标志后执行一些实时
要求不高的函数……
-----------------------
如果正在执行S级的FFT运算,怎么保证正确响应Ms级的中断,还是没能理解定时器分片的精华所在

topdog方便的话留下EMail,我的联系方式:
QQ:277565600
Email:ch2003_23@163.com
谢谢

出0入0汤圆

发表于 2009-9-1 09:27:43 | 显示全部楼层
微型操作系统:任务切换

出0入0汤圆

发表于 2009-9-1 09:29:11 | 显示全部楼层
关于黄健昌先生《建立一个属于自己的AVR的RTOS》代码难理解部分的解释

出0入0汤圆

发表于 2010-7-24 22:52:01 | 显示全部楼层
认真学习

出0入0汤圆

发表于 2013-12-23 21:24:26 | 显示全部楼层
关键问题还是程序3运行时间太长。把程序3分片,状态机实现是保证其他任务实时性的不错选择。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表