我的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
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才无奈转到嵌入式领域。
至于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单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断
我怀疑是定时器配置的问题
并不是时间太短造成的,再短你也有个10ms-20ms单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断
#13
各位:问题已解决
是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler
subs lr,lr,#4 ;//原来没有这句
stmfd sp!,{LR}
....
ldmfd sp!,{pc}^
是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler
subs lr,lr,#4 ;//原来没有这句
stmfd sp!,{LR}
....
ldmfd sp!,{pc}^
#14
1. 中断处理太长,占用了所有CPU运行时间,不过这样应该任务一直无法运行,不该一直打印。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。
#15
一直在关注这个问题,很有收获!我怎么就没有想到呢!
#1
应该是定时器中断时间太短,另外或许还有中断嵌套的问题。即进入中断没有关闭中断。
#2
如果是定时器中断太短的话,那么为什么从打开定时器到剩余的初始化这段过程没有错误呢?
而且进入中断处理程序时,做了禁止定时器中断的操作
而且进入中断处理程序时,做了禁止定时器中断的操作
#3
帮顶
#4
volatile int k;
for(k = 0; k < 500000000; k++) //延时一段时间,挺长的
;
帅哥楼主,你不觉得你的程序有问题吗?
请问,你的程序是怎么跳出这个循环的?int型最高取值是多少?
目前我就发现有这个问题,至于怎么重复调用这个串口输出,另查中
外:能不能把T-KERNAL的源码给我一份?
谢谢
lbing7@mail.csdn.net
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才无奈转到嵌入式领域。
至于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单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断
我怀疑是定时器配置的问题
并不是时间太短造成的,再短你也有个10ms-20ms单位吧
用户程序有没有参与定时器再配置过程?
请查看在问题下的中断源标志是否配置了多种模式,产生的是否是同一种定时中断
#13
各位:问题已解决
是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler
subs lr,lr,#4 ;//原来没有这句
stmfd sp!,{LR}
....
ldmfd sp!,{pc}^
是我在IRQ/FIQ的中断处理代码中未正确计算返回地址造成的,请看下面
IRQ_Handler
subs lr,lr,#4 ;//原来没有这句
stmfd sp!,{LR}
....
ldmfd sp!,{pc}^
#14
1. 中断处理太长,占用了所有CPU运行时间,不过这样应该任务一直无法运行,不该一直打印。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。
2. 中断中有一些内核函数是不能调用的,派查一遍看是否正常。
3. 中断的优先级是否有问题?这个操作系统我不知道,有的操作系统需要时钟中断进行任务切换……
无论如何,应该是中断本身的问题。
#15
一直在关注这个问题,很有收获!我怎么就没有想到呢!