QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1914|回复: 7

关于 MINIOS 在SKYEYE下的仿真

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

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

附件是我为了调试而修改的MINIOS的源代码,skyeye程序,和 skyeye的调试脚本(双击其中的RUN.BAT即可运行,DEBUG.bat用于调试)。
对OS感兴趣的朋友也可以试一下。
[local]1[/local]
发表于 2012-11-17 19:12:51 | 显示全部楼层
根据我们现在的代码,应该只有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 }
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2012-11-18 10:39:16 | 显示全部楼层
昨天比较顺利的是,我在QEMU-MINI2440上,顺利调试成功了MINIOS
QEMU-2440也是有点小问题的,在咨询了作者以后。
我修改了一下加载地址,和部分MINIOS的源代码,就可以正常运行了。
相比而言,skyeye的conf文件就好多,可以自由设定加载地址。
回复

使用道具 举报

 楼主| 发表于 2012-11-18 10:40:23 | 显示全部楼层
发现QEMU MINI2440的速度比SKYEYE快很多。
skyeye是解释执行的吧?
DBCT是不是编译执行的?
回复

使用道具 举报

 楼主| 发表于 2012-11-18 11:31:46 | 显示全部楼层

最新实验结果

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

使用道具 举报

发表于 2012-11-18 17:12:54 | 显示全部楼层

回复 6# thecrazyboy 的帖子

大概什么问题?
回复

使用道具 举报

 楼主| 发表于 2012-11-19 11:22:36 | 显示全部楼层
简单来说:
不带调试模式运行:
应该是执行 使能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=0x800f8000,CPSR=0X600000D2,(SP确实是IRQ的SP,CPSR的值也表示是IRQ模式),但是此时PC还是0x800f0280???我觉得pc应该为IRQ中断向量
再次执行SI,PC=0x800f0284,SP未变,但是堆栈是用的IRQ的堆栈,所以以后导致程序出错。

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-25 10:00 , Processed in 0.116938 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表