1.中断问题
今天小弟我看到了中断这一章了, 但是到现在还搞不清楚SWI的一些地方, 特请教各位高手, 谢谢!
问题就是在加载中断这个地方
unsigned Install_Handler(unsigned routine, unsigned *vector)
{
vec = (routine - (unsigned)vector -8 ) > > 2;//问题1:我知道这里是要求出定义的中断的地址偏移量, 但是减去0x08就可以了, 但是为什么还要减去8, 而且还要向右移两位??
if(vec & 0xff000000)
{
//greater than 32MBytes
return ;
}
vec = 0xea000000 | vec; //问题2:这里得到了偏移的地址后为什么要跟0xea000000相或??
*vector = vec;
return (old_vec);
}
2.ARM问题
今天拿自己写好的程序拷到另一台机子上去运行, 但是运行不通过, 提示不能打开一个.o文件,感觉是原来的路径和现在的路径可能不一样而出错的, 但是不知道在哪里改正过来。
还有个问题就是:在ASM和C混用的时候,为什么总是要从ASM先运行起来才能转入C语言,能不能先从C开始,然后转入ASM呢??
3.例子运行不了了
装了ADS之后,每个例子都可以运行,但是过了一段时间,自己做了点小程序之后,有个例子运行不了了,(SWI)这个例子,但是我没有改动什么地方,可能是设置的问题造成的。问题是:进入AXD调试后,按直接运行,但是没有运行到main()函数里,直接到最后的swi就停止了。
请问各位高手这是怎么回事?
------解决方案--------------------
你的描述不够清楚
问题1可能是依赖硬件的
问题2 通常ARM需要你提供一个汇编的模块来进行处理器的初始化,虽然有些工具可帮你
做到,但通常都仍需要这一步,所以总是从一个asm开始,然后转入c
------解决方案--------------------
你应该描述
ARM芯片型号、开发环境、开发平台之类的详细信息
这样有利于解决问题
1、与硬件寄存器相关,无论是-8还是>2都是因为其硬件寄存器每个bit对应的值含义有关系,
可以翻资料看看。
2、vec = 0xea000000 ¦ vec; //这里0xea000000段基址,vec是偏移地址,两者之和才是真正的物理地址
如果不懂,可以查看微机原理或者任何一本ARM书籍里关于 寻址方面的资料。
3、可以这样理解,汇编语言运行,是给C语言搭建平台,当然汇编得先运行。
4、可能是SWI刚好中断,软中断后程序停止,不进入main()。
------解决方案--------------------
1.vec = (routine - (unsigned)vector -8 ) > > 2;应该是求中断号,SWI有多个中断。
vec = 0xea000000 ¦ vec; //问题2:这里得到了偏移的地址后为什么要跟0xea000000相或??
这个是ARM的硬件决定的,我也不是很清楚,只是看过,没记住。中断的入口是在后面而不在0x00000000
2.把O文件全删再编译整个工程,而不是修改过的文件,MAKE
ARM的每个程序必须有个入口,是ARM伪指令做的,C能做到?没有必要花太多的时间在BOOTLOAD上,主要要学习实践。
3.这个太多可能了,仿真不是好的学习方法,我学习开发板半年也没有学到什么。主要要做项目。