中断处理导致的程序异常,谁能回答出来说明他对OS和硬件已相当的熟悉了,高分求教

时间:2021-07-23 14:39:57
我的系统不是vxworks,但我觉得凡是带OS的,应该都差不多,问题是这样:

我的OS:T-kernel (可能大家都没听说过这个RTOS,它是日本的,在日本相当流行)
CPU:S3C4510B
系统运行结果输出:通过串口(非中断模式)
任务调度采用定时器1的中断处理程序来进行

本来的系统运行流程:OS初始化1->打开定时器中断->OS初始化2->执行用户程序

现在的问题是:一直到OS初始化2时,一切正常,但开始执行用户程序时,便开始不正常,现象是用户程序不执行,处于停止状态(表面上看起来是这样),如果在定时器中断中加一条输出一个字符的语句,会发现此时串口不断地输出这个字符,好象是系统不断地进入中断,而用户程序一直得不到执行了。

   --如果在系统初始化时一直不打开定时器中断,则用户程序执行非常正常。
   --如果将定时器打开,且延长定时器的中断时间间隔,则用户程序正常
   --如果在用户程序的某几处地方加入几个从串口输出的语句(即输出一些与程序无关的信息),程序正常

还可以提供的信息是,假如用户程序是这样:
void mtask2(void)
{
   volatile int k;
   while(1)
   {
       comProgress((char *)"matsk is running!\n"); // 从串口输出一条消息
       for(k = 0; k < 500000000; k++)  //延时一段时间,挺长的
;   
   }
}
很简单吧,现在问题是,如果不打开定时器中断,正常,一打开定时器,延时就好象不起作用了,串口连续的输出,根本没有延时,好象程序被加速了一样。

现在,各位高手,你们对这个问题怎么看,能不能提个建议,思路也行,先谢谢了。

15 个解决方案

#1


应该是定时器中断时间太短,另外或许还有中断嵌套的问题。即进入中断没有关闭中断。

#2


如果是定时器中断太短的话,那么为什么从打开定时器到剩余的初始化这段过程没有错误呢?

而且进入中断处理程序时,做了禁止定时器中断的操作

#3


帮顶

#4


volatile int k;
for(k = 0; k < 500000000; k++)  //延时一段时间,挺长的
;   

帅哥楼主,你不觉得你的程序有问题吗?
请问,你的程序是怎么跳出这个循环的?int型最高取值是多少?

目前我就发现有这个问题,至于怎么重复调用这个串口输出,另查中

外:能不能把T-KERNAL的源码给我一份?
谢谢

lbing7@mail.csdn.net

#5


楼上仁兄,500000000换算成十六进制是0x1dcd6500,int型最大的取值可以是0x7FFFFFFF吧,跳出是没有问题的,如果你还嫌大,我可以将500000000少两个零,5000000这可以了吧,便结果是一样的

至于T-kernel源码,T-engine论坛主张源码统一,不应由用户私下传播,我想我还是遵守规定,你可以到www.t-engine.org注册下载,现在的版本好象是1.02.02了

题外说一下,此OS很好,如果不是微软当年干涉,可能今天PC机上的主流OS,就不是Windows了,正因为1984年微软对日本*的威胁,使得T-kernel才无奈转到嵌入式领域。

#6


楼主,对不起.我用的平台上的int是16位的,以这个观念带到了你的机器上.

呵呵,勿见怪哈,同样,学习!!

#7


谢谢,对知识产权的尊重,敬之

#8


关中断
...
开中断

#9


楼上,你说的是中断处理程序的过程吧,这个在定时器的中断处理程序中已经有了,我写出的是主程序的代码

#10


#11


你把volatile去掉试试

#12


-如果将定时器打开,且延长定时器的中断时间间隔,则用户程序正常

我怀疑是定时器配置的问题
并不是时间太短造成的,再短你也有个10ms-20ms单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断

#13


各位:问题已解决

是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler 
    subs lr,lr,#4        ;//原来没有这句
    stmfd sp!,{LR} 
     ....
    ldmfd sp!,{pc}^

#14


1. 中断处理太长,占用了所有CPU运行时间,不过这样应该任务一直无法运行,不该一直打印。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。

#15


一直在关注这个问题,很有收获!我怎么就没有想到呢!

#1


应该是定时器中断时间太短,另外或许还有中断嵌套的问题。即进入中断没有关闭中断。

#2


如果是定时器中断太短的话,那么为什么从打开定时器到剩余的初始化这段过程没有错误呢?

而且进入中断处理程序时,做了禁止定时器中断的操作

#3


帮顶

#4


volatile int k;
for(k = 0; k < 500000000; k++)  //延时一段时间,挺长的
;   

帅哥楼主,你不觉得你的程序有问题吗?
请问,你的程序是怎么跳出这个循环的?int型最高取值是多少?

目前我就发现有这个问题,至于怎么重复调用这个串口输出,另查中

外:能不能把T-KERNAL的源码给我一份?
谢谢

lbing7@mail.csdn.net

#5


楼上仁兄,500000000换算成十六进制是0x1dcd6500,int型最大的取值可以是0x7FFFFFFF吧,跳出是没有问题的,如果你还嫌大,我可以将500000000少两个零,5000000这可以了吧,便结果是一样的

至于T-kernel源码,T-engine论坛主张源码统一,不应由用户私下传播,我想我还是遵守规定,你可以到www.t-engine.org注册下载,现在的版本好象是1.02.02了

题外说一下,此OS很好,如果不是微软当年干涉,可能今天PC机上的主流OS,就不是Windows了,正因为1984年微软对日本*的威胁,使得T-kernel才无奈转到嵌入式领域。

#6


楼主,对不起.我用的平台上的int是16位的,以这个观念带到了你的机器上.

呵呵,勿见怪哈,同样,学习!!

#7


谢谢,对知识产权的尊重,敬之

#8


关中断
...
开中断

#9


楼上,你说的是中断处理程序的过程吧,这个在定时器的中断处理程序中已经有了,我写出的是主程序的代码

#10


#11


你把volatile去掉试试

#12


-如果将定时器打开,且延长定时器的中断时间间隔,则用户程序正常

我怀疑是定时器配置的问题
并不是时间太短造成的,再短你也有个10ms-20ms单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断

#13


各位:问题已解决

是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler 
    subs lr,lr,#4        ;//原来没有这句
    stmfd sp!,{LR} 
     ....
    ldmfd sp!,{pc}^

#14


1. 中断处理太长,占用了所有CPU运行时间,不过这样应该任务一直无法运行,不该一直打印。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。

#15


一直在关注这个问题,很有收获!我怎么就没有想到呢!