老古开发网首页
导航:老古开发网首页文章索引索引第1848页文章分类AVR单片机第3页→[[转]44B0之bootloader理解]
| -文章搜索 - 最新文章 - |

[转]44B0之bootloader理解

发布时间:2006年4月1日 点击次数:4025
来源:   作者:
 
44B0的初始化程序就是初始化各个关键的寄存器,建立中断向量,然后转移到主函数去执行程序。
不过44B0不支持地址映射,所以程序不COPY到RAM种执行。44B0初始化对我们广大
初学者来说,比较难理解的是中断的处理和一些少见的操作符号,44b0的中断子程序地址存放在初始化程序最后就是HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
这一段,它的其实地址是ISR_STARTADDRESS,个人写中断程序的时候,子程序地址被编译器连放在相应的位置。初始化完成后,程序转通过BL Main 转到用户定义的主程序上执行。以下是我个人的一些理解,有错误的地方
希望大家指出来。


GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32

THUMBCODE SETL {FALSE}
]

[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
×××××××××××××××××××××××
其中[=IF , =ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。这些都是伪操作
这段我理解为设定THUMCODE的值,然后确定,用户的程序是在ARM状态还是THUM状态。不过不管THUMCODE是何值,下面代码都是ARM状态
这段没有什么很复杂的,就是这三个[, ,]操作符让我迷惑了半天,翻了半天书才找到解释


MACRO 宏 伪操作
$HandlerLabel HANDLER(宏的名称) $HandleLabel(宏的参数)

$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does''t push because it return to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
*******************************
这段当初我觉得比较难理解,不过通过看各种程序,对这段有了一个基本的理解。这个宏的作用是把各个中断程序的地址装入当前的PC,44B0有两种装断模式 一种是没有中断向量表,一种是使用中断向量表的
使用中断向量表只能是IRQ方式,当使用中断向量表的时候,中断发生时由44B0的中断控制器自动跳转到
相应的位置。比如在中断向量表的模式下,一个外部中断0发生程序自动跳转到 地址0X20处,0X20地址单元的指令时ldr pc,=HandlerEINT0
因而程序PC跳到HandlerEINT0处,执行这个宏操作,把外部中断的函数的地址赋给PC。 44B0里面定义了一个
#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84)) ,_ISR_STARTADDRES是中断程序地址的起始地址,_ISR_STARTADDRESS+0X84是HandleEINT0的地址
例如一个外部中断函数名void EXINT(),程序里执行 pISR_EINT0=(unsigned)EXIT,就把自己的函数地址赋给了标号为HandleEINT0处的内存单元
IMPORT Image$$RO$$Limit ; End of ROM code (=start of ROM data)
IMPORT Image$$RW$$Base ; Base of RAM to initialise
IMPORT Image$$ZI$$Base ; Base and limit of area
IMPORT Image$$ZI$$Limit ; to zero initialise
××××××××××××××××××××××××××××××××××
这段我个人的理解为这些是连接器生成的于输出段相关的符号,是在没有使用SCATTER文件的情况可以调用。这段指出了在ROM和RAM种的数据的地址,这些地址应该是连接器生成的,不过为什么能调用
连接器生产的符号,我不大明白其中的原因,还希望各位说说自己的理解
IsrIRQ ;using I_ISPR register.
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}

;IMPORTANT CAUTION
;if I_ISPC isn''t used properly, I_ISPR can be 0 in this routine.

ldr r9,=I_ISPR
ldr r9,[r9]
mov r8,#0x0
0
movs r9,r9,lsr #1
bcs %F1
add r8,r8,#4
b %B0

1
ldr r9,=HandleADC
add r9,r9,r8
ldr r9,[r9]
str r9,[sp,#8]
ldmfd sp!,{r8-r9,pc}
×××××××××××××××××××××××
这段是没有使用装断向量模式下如何装载中断子程序,因为44B0有30个中断源,所以需要程序处理以确定调用那个中断程序
0,1是局部标号,%B是向后搜索局部标号, %F是向前搜索局部标号 。都是伪操作
I_ISPR寄存器各位表明发生了应该调用那个中断子程序。只能1位置位,其它位为0,比如说串口1发送中断发生,这时I_ISPR的
值为0X04,ldr r9,=I_ISPR
ldr r9,[r9] 两条指令后,r9的内容为0X4 ,
movs r9,r9,lsr #1 r9内容右移一位
bcs %F1 判断是否把置位是否转移到C位,
add r8,r8,#4 如果没有的R8加4
如果r9内容为0x04 需要右移3次 ,之后r8的内容为8 然后HandleADC的地址 加上r8的值 就是串口1发送中断的地址,这个地址的内容是中断子程序的地址
再说明几个伪操作:^=MAP. #=field
别的方面我觉得比较容易理解了,就不多讲了。

:在设定THUMCODE的值的那一段,其中{CONFIG} = 16 中的CONFIG这个值是从哪得到的阿?

这个是汇编程序内定的变量,可以程序中测试它的值,以确定是正在以THUMB模式还是以ARM模式汇编指令,下面是从ARMASM手册时摘录的原文:

{CONFIG} Has the value 32 if the assembler is assembling ARM code, or 16 if it is assembling Thumb code.


欢迎进入老古论坛进行讨论
[AVR单片机] 相关文章:
关于ARM的汇编中分支结构的小技巧
简介:
最近学了点关于ARM的汇编中分支结构的小技巧,拿出来跟大家分享一下。如果您几百年前就看过了或早就精通了,不要笑话俺,俺是初学者:)如果大家也像偶一样是新手不妨看一下,应该没有坏处. 计算r1和r2的绝对值 对应的C伪指令为: if ( r1>r2 ) r0 = r1+r2; else r0 = r1-r2; 对应的ARM汇编为: cmp r1, r2 subgt r0, r1, r2 sublt r0, r2, r1 以上条件判断只适合简单的分支结构,复杂的分之结......

[转帖]ARM的生意经
Source Insight配置WinAVR的具体步骤
AVR应用经验
AVR芯片的ISP全攻略
 
下一个:[AVR单片机][转]如何开发arm
简介:
目前因为两台电脑都已经安装WINDOWS系统,又装了很多软件。为了没有什么风险,就装了VMWARE软件,就是虚拟机软 件,这个软件的虚拟速度确实快很多,它跑图形的操作系统也不慢。如果BOCHS,一运行图形的操作系统,就会很慢, 因此放弃了这个自由软件。如果我的电脑速度也很快,比如用AMD64位的最新CPU或许用BOCHS也不慢。 装好VMWARE软件,然后就是在里面安装LINUX,那么用什么LINUX比较好呢?目前,我是用最流行的REDHAT。并且用的 是9.......

上一个:[新闻热点]06国际平板显示大会成功举行 盛况空前

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:30分钟 执行时间:47毫秒