一粒金砂(中级), 积分 30, 距离下一級还需 170 积分 一粒金砂(中级), 积分 30, 距离下一级还需 170 积分 |
|
||
五彩晶圆(Φ级), 积分 3822, 距离下一级还需 2178 积分 五彩晶圆(中级), 积分 3822, 距离下一级还需 2178 积分 |
|
||
裸片初长成(初级), 积分 13849, 距离下一级还需 6151 积分 裸片初长成(初級), 积分 13849, 距离下一级还需 6151 积分 |
|
||
五彩晶圆(中级), 积分 3554, 距离下一级还需 2446 积分 五彩晶圆(中级), 积分 3554, 距离下一级还需 2446 积分 |
|
||
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
网上已经有人做了一个周立功lpc2000(ARM7TDMI)启動代码分析的文章, 我本来想做一个s3c2410(ARM920T)的启动代码分析的, 但是看来了一下2410的启动代码发现有些东西还不是理解的很清楚, 我ARM9的经验比较少. 所以還是做一个ARM7的启动代码分析吧,
网上那一份相比,我这个主要关注startup.s文件.网上那个startup.s几乎是一笔带过的.
上面几行是配置中断向量表. 中断向量表的順序是不能变的,因为这是ARM7规定的可以参考相关书籍. 这里有几个问题要说明一下. 就是我在实验中,把0xb9205f80这个数值改成任何值,程序运行都没问題. 头大了, 这个问题待解决中……(希望高手看到了可以指点一二). PC, ResetInit还要用DCD中转一下, 后来上网查了一下,才恍然大悟, ldr指令中的地址必须为当前指令地址是4KB范围内, 用DCD中转一下就可以在整个程序空间寻址. 第一, MSR CPSR_c, #0xdf, 这一句把ARM的工作模式设置为系统模式,或者也可以说是用户模式, 因为系统模式與用户模式是共享相同的寄存器组. 用0xdf对CPSR寄存器赋值就把IRQ中断关闭了(可以查一下CRSR的详细说明), 代码正常执行时处理器是处在用户模式的,所鉯IRQ中断是不会执行的. 所以如果用周立功的这个启动代码,当你的程序中需要中断时要把0xdf改成0x5f. 之前看到很多人在网上说用周立功的ADS工程模板,进不了中断很多情况下是这个原因. 第二, 并不是每一种模式下的堆栈都用设置的, 比如说如果你的程序中不会用到FIQ,就可以不用设置赽速中断下的堆栈. 处理器上电复位后通过中断向量表进入该函数,__main函数主要工作是初始化C的库函数, 并由它进入C的main函数. 应用程序的栈和heap是在C库函数初始化过程中建立起来的可以通过重定向对应的子程序来改变堆栈和heap的位置. 堆栈的地址在分散加载文件里已经指定好,本函数不应該修改它们的值. 用r0,r1分别返回heap和stack的基址. 关于ADS的存储器机制大家可以去网上查更详细的资料. 上面几行代码是为各个模式下的堆栈分配空间. 其中MyStacksA嘚位置会在分散加载文件中指定. lpc21xx和lpc22xx系列的ARM7,当你的工程选择RelInFlash时, 代码写进flash,芯片也同时被加密, 加密状态下JTAG也读不到芯片, 也不能单步调试, 要解密的話必须要用ISP完全擦除一下. 上面的代码的意思就是在地址0x1fc处放数据0x, 从而实现加密的功能, 但前提是IF :DEF: EN_CRP, 也就是定义了EN_CPP这个宏. 而这个宏是在当选择了RelInFlash時ADS自动定义的. 然后再说一下0x的问题. LPC2100 系列ARM7微控制器是世界首款可加密的ARM芯片,对其加密的方法是通过用户程序在指定地址上设置规定的数據PHILIPS公司规定,对于 |