请教:这种程序结构怎么安排比较合理
程序结构:中断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不要求实时处理。 所以,放入中断处理函数里进行不合适
为什么不合适?
你放在外面在执行中断1的处理的时候中断2也只能等着呀。
何况,你可以在处理中断1的时候允许中断2啊 把中断标志位改成计数器,在中断里+1,在main()里-1。
不过这样做的话要注意:main()里-1是临界操作,须关中断后执行。 把每个程序拆分成100份,或者更多。然后3个函数轮流执行,每次轮到自己时就处理完自己的N分之一,然后退出让下一个程序执行,如此循环下去则3个程序都有很强的实时性,实时性取决于其N分之一的执行时间,而和任务总执行时间无关。拆分的思想可以用状态机来实现。 我的理解是:你的程序3计算周期很长,中断1即便是响应了,程序3也未必能及时处理,也就是说可能中断1已响应了N次,程序3才执行过1次,又因为你在中断1和中断2里面只是放置一个标志,未进行实质性处理,所以中断1的处理工作从理论上讲并无实时性可言,它的响应周期是你的程序3的执行周期。想实现中断1的实时性,程序结构必须有所改动 谢谢楼上各位,可能我表述的不清楚,先详细说下:
中断1是AD转换结束,然后紧接着SPI读取数据,并进行低通高通陷波等数字滤波程序,计算量大,变量多,引用的函数也很多,而且这一部分要求实时处理,所以感觉都放在中断里面不合适。
中断2是串口接收中断,优先级低于中断1,但等不及程序3执行完一次
程序3是FFT运算,时间很长,其中AD可能要中断几十次,但FFT不要求实时处理。 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的实时性,程序结构必须有所改动
-----------------------------------------
你说的正是我发愁的地方,呵呵 实时性高的部分(多次)嵌入到实时性低的部分。
低实时性f(x)
高实时性g(x)
f(x)
{
…………
g(x);
…………
g(x);
…………
g(x);
…………
} 如果是我理解的那样,你的程序可以改为如下结构:
1、中断1里面其实就是AD转换,转换结果存储用一个序列,也就是用数组存储;当然,要记录数组中的AD有效值有几个--做法就不说了,弄个全局变量。
2、SPI不建议用扫描方法,如果你要在主程序里用扫描法处理SPI,肯定很累!SPI中断接收的数据存在数组中,供主程序根据情况处理。
3、主程序处理:
子函数A、检查AD转换数据有效个数,如果是0,直接返回,如果大于0,进行相应AD处理。
子函数B、检查SPI,是否有要处理的命令,如果没有,直接返回。
子函数C、检查是否够条件进行低通高通陷波等数字滤波程序,如是......否则.....
子函数D、检查是否够条件进行你的海量计算,如是.... 如果计算量太大,就如9楼上官大侠所言,中间不同程度地去调A、B、C子函数; 对了,你还有串口处理中断,接收数据也存于数组中(接收缓冲),并记录收到有效数据个数。
主程序里面再增加一个
子函数E:检查串口接收缓冲区,(应该根据你的协议进行校验--略)是否有要处理的串口命令,如有...如无,返回 谢谢楼上各位。
【7楼】 topdog
将定时器时间分片,长时间片3使用标志,主程序扫描3的标志,才执行一次程序3。
--------------------------------------
谢谢,现在还不是很懂
9楼 上官大侠 的注意,很好理解,可是实现起来……比如说几十毫秒的FFT程序中怎么能要响应到每1毫秒的AD中断?
【10楼】 flywater 落叶 的方法也很有道理,谢谢。
明天再好好理解下以上的方法,谢谢大家。 很明显要用操作系统的任务切换才能解决的问题 谢谢【14楼】 topdog 大哥的详细讲解,可是俺太笨了,还是没理解透
主程序扫描标志,并清除。us级标志后执行最快的中断,ms级次之,s级别的标志后执行一些实时
要求不高的函数……
-----------------------
如果正在执行S级的FFT运算,怎么保证正确响应Ms级的中断,还是没能理解定时器分片的精华所在
topdog方便的话留下EMail,我的联系方式:
QQ:277565600
Email:ch2003_23@163.com
谢谢 微型操作系统:任务切换 关于黄健昌先生《建立一个属于自己的AVR的RTOS》代码难理解部分的解释 认真学习 关键问题还是程序3运行时间太长。把程序3分片,状态机实现是保证其他任务实时性的不错选择。
页:
[1]