当前位置: 代码迷 >> 单片机 >> 高分!(答好了给全分)
  详细解决方案

高分!(答好了给全分)

热度:118   发布时间:2016-04-28 16:17:01.0
高分求助!!(答好了给全分)
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.这个太多可能了,仿真不是好的学习方法,我学习开发板半年也没有学到什么。主要要做项目。
  相关解决方案