- UID
- 114293
|
从0X3F FFC0处复位→执行0X3F FC00地址处的初始化引导函数(Initboot) →根据GPIO选择引导模式→确定用户程序入口地址→从入口处开始执行用户程序。  
      输入外部引脚为/XRS, 当/XRS为低电平时,DSP终止执行,PC指向地址:0x3FFFC0,当/xRS变成高电平时,DSP开始执行0x3FFFC0中存放的指令。这条指令是条跳转指令或者说是复位中断向量,这个中断向量指向地址0X3F FC00处的初始化引导函数(Initboot),即将地址0x3FFC00(函数initboot的首地址)发给PC,值得注意的是:地址0X3F FFC0也有片内、片外两种,具体的选择情况是:当系统上电运行时,根据XMP/MC引脚的状态决定是从片外的3fffc0处读取复位向量或者时从片内的rom的3fffc0处读取复位向量。低电平方式下从片内读取,高电平方式下从片外读取。InitBoot 函数所做工作有:1.初始化状态寄存器;2.将堆栈指针设为0x400(0x400 - 0x44F作为启动过程中的堆栈);3.读CSM密码保护部分;如果是从片内读取的,则以上程序都是被固化在rom中的,无法更改,4.调用
SelectBootMode;模式的选择是由四个引脚GPIOF4(SCITXDA), GPIOF12(MDXA), GPIOF3
(SPISTEA), GPIOF2(SPICLK5).的状态决定的,若为1xxx则跳转到FLASH地址0x3F7FF6, 0010为H0 SARAM地址为0x3F8000. 调用ExitBoot
以上是BootROM完成的工作。从entrypoint开始,就进入用户程序区了。对于汇编程序,可以在程序起点处写一条跳转到Start(如果 程序起点是Start)的指令。汇编情况比较简单,跳转到Start后,各项初始化代码工作都由自己完成。对于C语言程序,通常的做法是在程序起点处放置 一条跳转指令,转到_c_init0。 这个程序可在
DSP281x_CodeStartBranch.asm中找到,然后程序的执行分为使用或不使用BIOS两种情况。  
  
从rts.src中提取boot28.inc文件,其中包括对于不使用BIOS的情况下,启动后从_c_init0到main函数中间所做的工 作。因为这段代码是由C编译器自动运行的,因而常被初学者忽视,以致对其后自己编写的C代码的运行环境不清楚。这一段程序主要完成以下工作: ◇ 分配C堆栈;
◇ 建立C运行环境(CPU寄存器和模式寄存器的配置); ◇ 复制cinit、pinit表、.const、.econst常量到工作区; ◇ 跳转到main函数。
  这段代码声明了2个全局变量:__stack,系统堆栈栈底;_c_int00,启动函数。下面列出了C运行环境的初始化程序部分代码:   C28OBJ;选择C28x对象模式 C28ADDR;清除地址模式位 C28MAP;设置M0M1模式
CLRCPAGE0;使用堆栈寻址模式
MOVWDP,#0;初始化DP指向低64K地址 CLRCOVM;关闭溢出模式 ASP;确保SP对齐
  这些代码设置了C语言的运行环境。在用户程序中编写的汇编代码不应该破坏这个环境,否则C语言将无**常运行。
boot rom中存放的bootloader源文件可在文件TMS320x281x DSP Boot ROM Reference Guide的附件中找到,可从TI网站上搜索该文件
PC的作用:为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又 称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第 一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行 的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。
来自网络收集  供大家学习使用 |
|