Board logo

标题: 讨论] 中断嵌套的运行时间问题 [打印本页]

作者: yjbmtc    时间: 2006-8-9 11:49     标题: 讨论] 中断嵌套的运行时间问题

我用8路定时器做喷油控制,两路采集转速,6路控制喷油,其中在一个转速采集中允许实现中断嵌套,现在的问题是当转速信号频率低时,控制没问题,但频率高了以后,转速采集和喷油控制都有问题,是不是中断嵌套时堆栈来不及清,下一个又来了?还是又别的原因?难道进堆栈的数据定义的类型占存储空间太大了?也请高人指点,在线等.
作者: strongchen    时间: 2006-8-9 11:57

都有可能。中断最好还是不要嵌套。
作者: yjbmtc    时间: 2006-8-9 14:19

多谢斑竹回复!
作者: fjczd    时间: 2008-12-26 12:18

QUOTE:
以下是引用strongchen在2006-8-9 11:57:00的发言:
都有可能。中断最好还是不要嵌套。

如何在cw4.7 PE,记录中断运行的时间呢


作者: kent8411    时间: 2008-12-27 13:59

中断运行时间应该不是固定的吧?你想测试这个时间可以使用对另外一个可操作的IO口给高低电平,使用示波器观察!时间有长有短.一般应该看的是最长的那个吧!
作者: fjczd    时间: 2008-12-27 21:00

QUOTE:
以下是引用kent8411在2008-12-27 13:59:00的发言:
中断运行时间应该不是固定的吧?你想测试这个时间可以使用对另外一个可操作的IO口给高低电平,使用示波器观察!时间有长有短.一般应该看的是最长的那个吧!

我不想用示波器来看,我想通过定时器子类的取出这个值来。这是判断外设的一个标志
我现在是这样用的
但是,在中断中却读不出数来,在main函数中是可以的

我现在用的是cw4.7里的PE



想记录中断发生了多长时间,中断名为EInt1_OnInterrupt

我在个中断发生后,用如下方式实现记录其运行了多久.如果这段代码(如下)

FC161_Reset(); // reset the counter
Cpu_Delay100US(500);//
延迟,做中断处理等等

if(FC161_GetTimeUS(&bbb) == ERR_OK) {//记录从reset到当前的时间


ccc = bbb / 60000.0;

放在main(),是可以记录运行时间的,bbb里有数据.但是如果把上述代码放到名为EInt1_OnInterrupt的中断中,同样的代码,bbb却始终为0.

是不是在中断中不能有类似FC161_Reset()之类的函数呢?还是要进行别的什么设置呢?






这是含有FC161_Reset()等语句的中断函数void EInt1_OnInterrupt(void)
{
/* place your EInt1 interrupt procedure body here */


FC161_Reset(); // reset the counter
Cpu_Delay100US(500);//
延迟,做中断处理等等

if(FC161_GetTimeUS(&bbb) == ERR_OK) {//记录从reset到当前的时间


ccc = bbb / 60000.0;
}


作者: fjczd    时间: 2008-12-27 21:01

QUOTE:
以下是引用kent8411在2008-12-27 13:59:00的发言:
中断运行时间应该不是固定的吧?你想测试这个时间可以使用对另外一个可操作的IO口给高低电平,使用示波器观察!时间有长有短.一般应该看的是最长的那个吧!

我不想用示波器来看,我想通过定时器子类的取出这个值来。这是判断外设的一个标志
我现在是这样用的
但是,在中断中却读不出数来,在main函数中是可以的

我现在用的是cw4.7里的PE



想记录中断发生了多长时间,中断名为EInt1_OnInterrupt

我在个中断发生后,用如下方式实现记录其运行了多久.如果这段代码(如下)

FC161_Reset(); // reset the counter
Cpu_Delay100US(500);//
延迟,做中断处理等等

if(FC161_GetTimeUS(&bbb) == ERR_OK) {//记录从reset到当前的时间


ccc = bbb / 60000.0;

放在main(),是可以记录运行时间的,bbb里有数据.但是如果把上述代码放到名为EInt1_OnInterrupt的中断中,同样的代码,bbb却始终为0.

是不是在中断中不能有类似FC161_Reset()之类的函数呢?还是要进行别的什么设置呢?






这是含有FC161_Reset()等语句的中断函数void EInt1_OnInterrupt(void)
{
/* place your EInt1 interrupt procedure body here */


FC161_Reset(); // reset the counter
Cpu_Delay100US(500);//
延迟,做中断处理等等

if(FC161_GetTimeUS(&bbb) == ERR_OK) {//记录从reset到当前的时间


ccc = bbb / 60000.0;
}


作者: fjczd    时间: 2008-12-27 21:05

QUOTE:
以下是引用kent8411在2008-12-27 13:59:00的发言:
中断运行时间应该不是固定的吧?你想测试这个时间可以使用对另外一个可操作的IO口给高低电平,使用示波器观察!时间有长有短.一般应该看的是最长的那个吧!

有时间帮忙看看吧


作者: kent8411    时间: 2008-12-28 22:00

看过了!你的这个程序看着似乎没有什么问题!只是不知道你使用的FC161_GetTimeUS(&bbb)函数的源代码你有没有?可能是这个函数的使用范围的问题吧!

还有就是FC161_Reset(); 函数确定是放在中断里面而不是主函数中的吗?


作者: fjczd    时间: 2008-12-29 08:48

QUOTE:
以下是引用kent8411在2008-12-28 22:00:00的发言:

看过了!你的这个程序看着似乎没有什么问题!只是不知道你使用的FC161_GetTimeUS(&bbb)函数的源代码你有没有?可能是这个函数的使用范围的问题吧!

还有就是FC161_Reset(); 函数确定是放在中断里面而不是主函数中的吗?

我想把它放在中断里,因为我是记录中断发生的时间.这个FC161_GetTimeUS函数,是PE自带的,源码是有的.

可能如你所说,是使用范围的问题.

但我个人总感觉是什么中断嵌套之类的影响了吧






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0