首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

讨论] 中断嵌套的运行时间问题

讨论] 中断嵌套的运行时间问题

我用8路定时器做喷油控制,两路采集转速,6路控制喷油,其中在一个转速采集中允许实现中断嵌套,现在的问题是当转速信号频率低时,控制没问题,但频率高了以后,转速采集和喷油控制都有问题,是不是中断嵌套时堆栈来不及清,下一个又来了?还是又别的原因?难道进堆栈的数据定义的类型占存储空间太大了?也请高人指点,在线等.
飞思卡尔带我走进神奇的单片机世界
都有可能。中断最好还是不要嵌套。
海纳百川  有容乃大
多谢斑竹回复!
飞思卡尔带我走进神奇的单片机世界
QUOTE:
以下是引用strongchen在2006-8-9 11:57:00的发言:
都有可能。中断最好还是不要嵌套。

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

中断运行时间应该不是固定的吧?你想测试这个时间可以使用对另外一个可操作的IO口给高低电平,使用示波器观察!时间有长有短.一般应该看的是最长的那个吧!
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;
}

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;
}

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

有时间帮忙看看吧

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

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

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

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

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

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

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

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

返回列表