中国Linux公社论坛's Archiver

thecrazyboy 发表于 2012-11-17 11:16

关于 MINIOS 在SKYEYE下的仿真

大家好
   目前在skyeye1.2.6上调试杨铸老师的MINIOS的时候,发现一打开定时中断TIMER0,就进入的中断ISR,从INTOFFSET读到的值为0X0F,而不是10,很奇怪。而且不断地进入ISR,导致正常程序无法正常运行。
在硬件上调试和运行一切正常。
该OS,使用MMU做进程地址映射。
OS 的网页 [url]http://blog.csdn.net/mr_raptor/article/details/7677992[/url]
下载源代码之后,将函数CopyCode2Ram() 代码 if (isBootFrmNORFlash()) 注释掉。即可在SKYEYE下仿真

此外我尝试了其他版本的SKYEYE,也不能正常运行。
希望能得到你们的帮助。谢谢

附件是我为了调试而修改的MINIOS的源代码,skyeye程序,和 skyeye的调试脚本(双击其中的RUN.BAT即可运行,DEBUG.bat用于调试)。
对OS感兴趣的朋友也可以试一下。
[local]1[/local]

ksh 发表于 2012-11-17 19:12

根据我们现在的代码,应该只有Timer4实现了,Timer0没有实现,具体如下(soc/arm/s3c2410x/skyeye_mach_s3c2410x.c):
150 static int s3c2410x_scheduler_id = -1;
151 static void s3c2410x_timer_callback(generic_arch_t* arch_instance)
152 {
153         RW_WRLOCK(lock);
154 #if 0
155                 io.timer.tcnt[4] = io.timer.tcntb[4];
156                 /*timer 4 hasn't tcmp */
157                 //io.timer.tcmp[4] = io.timer.tcmpb[4];
158                 io.timer.tcnto[4] = io.timer.tcntb[4];
159                 io.srcpnd |= INT_TIMER4;
160                         s3c2410x_update_int (arch_instance);
161 #endif
162                 io.timer.tcnt[4] -= 100;
163                 if (io.timer.tcnt[4] < 0) {
164                         io.timer.tcnt[4] = io.timer.tcntb[4];
165                         /*timer 4 hasn't tcmp */
166                         //io.timer.tcmp[4] = io.timer.tcmpb[4];
167                         io.timer.tcnto[4] = io.timer.tcntb[4];
168                         io.srcpnd |= INT_TIMER4;
169                         s3c2410x_update_int (arch_instance);
170                 }
171         RW_UNLOCK(lock);
172 }

thecrazyboy 发表于 2012-11-18 10:31

谢谢,老大。
前几天我确实搞得我没有办法了,就在skyeye的源代码中中断相关的地方加入了打印信息。
确实代码中发现了只有TIMER4中断。
加上参考一步一步写嵌入式操作系统的那本书,例子中也只有使用TIMER4。这个肯定是由原因的。哈哈。
之后修改为TIMER4中断,也没正常运行。(主要我对具体厂商的CPU 一点也不熟悉)
SKYEYE的源代码对我一个新手来说,要有个熟悉的过程。

thecrazyboy 发表于 2012-11-18 10:39

昨天比较顺利的是,我在QEMU-MINI2440上,顺利调试成功了MINIOS
QEMU-2440也是有点小问题的,在咨询了作者以后。
我修改了一下加载地址,和部分MINIOS的源代码,就可以正常运行了。
相比而言,skyeye的conf文件就好多,可以自由设定加载地址。

thecrazyboy 发表于 2012-11-18 10:40

发现QEMU MINI2440的速度比SKYEYE快很多。
skyeye是解释执行的吧?
DBCT是不是编译执行的?

thecrazyboy 发表于 2012-11-18 11:31

最新实验结果

将代码修改为TIMER4触发定时中断,QEMU-MINI2440运行成功。
但是SKYEYE还是有问题。

ksh 发表于 2012-11-18 17:12

回复 6# thecrazyboy 的帖子

大概什么问题?

thecrazyboy 发表于 2012-11-19 11:22

简单来说:
不带调试模式运行:
应该是执行 使能TIMER0或者TIMER4中断的代码(timer4,SFR_VA(INTMSK) &= ~(1<<14);或者TIMER0,SFR_VA(INTMSK) &= ~(1<<10);)之后,(其实就是执行完该C语句的最后一条汇编指令之后,或者说对寄存器INTSK做写之后),系统不断进入IRQ中断(感觉像是中断标志没有被清除,导致中断反复进入。其他正常代码得不到执行),但是寄存器 INTOFFSET的值非14,也非10.而是15.

调试模式运行:
运行结果和不带调试模式不一样。最终出现DATAabort异常。
不知道为什么无法上传图片。手动描述下吧
在某次利用insight+ skyeyedebug模式的调试中,发现
当主程序执行完SFR_VA(INTMSK) &= ~(1<<10); 即启动定时中断之后
此时PC值为0x800f0280,CPSR值为0x6000005f,SP=0X800FDFF8
si(单步执行汇编指令)之后,即执行0x800f0280处指令,SP=[color=red]0x800f8000,CPSR=0X600000D2[/color],(SP确实是IRQ的SP,CPSR的值也表示是IRQ模式),但是此时PC还是0x800f0280[color=red]???我觉得pc应该为IRQ中断向量[/color]
再次执行SI,PC=0x800f0284,SP未变,但是堆栈是用的IRQ的堆栈,所以以后导致程序出错。

粗鄙的认为,SKYEYE没有让PC正确的进入中断向量。
但是调试模式和非调试模式运行结果不一样,也搞得我挺痛苦的。
现在基本上同样的代码,在硬件和QEMU-MINI2440都能跑了。

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.