日期:20200215
1、启动过程概述
一般的C语言运行环境启动过程都于此类似。首先C6701上电复位,按照默认时序读取CE1空间的数据(一般这个接口连接的是外部PROM存储芯片),以地址一对一的方式将外部PROM的程序数据拷贝到C6701内部RAM存储器前64KB的程序存储区。数据拷贝完成后,回到程序存储区地址0x0处,进入程序入口函数c_int00()。
在c_int00函数下将进行以下四步工作:
- 初始化系统堆栈和系统寄存器
- 根据程序配置,将cinit段内容拷贝到bss段初始化全局变量和静态变量
- 拷贝pinit段内容,执行全局变量构造函数初始化
- 通过以上三步建立了C语言运行环境,进入main函数执行用户程序。
函数调用关系为:C_int00()->auto_init()->main()
2,cinit段的处理方式
对于CCS来说,是否处理cinit段取决于CCS连接器配置中选择-c或-cr模式(ccs3.3->project->build option->linker->basic->Autoinit mode)。Cinit段用于存放全局变量初始化的值,其数据结构如下图。
-c模式指运行时初始化,run-time autoinitization。在这种模式下,编译器根据cmd文件中cinit段的指向地址产生一个标记(该标记就是cinit的起始地址)放置于最终的目标文件中,C6701加载程序完毕,执行完第一步初始化系统堆栈后,进入auto_init()函数,读取固定地址的值得到cinit的初始地址(标记),然后根据以上cinit数据结构复制cinit数据到目标地址(bss段),直到最后检查到本字段字节数为0为止,接着初始化pinit段的构造函数,最后进入main函数执行用户程序。这种模式在外部烧写PROM模式下常用。Cinit加载方式如下图所示。
-cr模式指加载初始化,load-time autoinitization。在这种模式下,不管cmd设置的cinit地址是什么,编译器都将目标文件中的标记设定为-1,在程序加载后进入auto_init函数时,检查到该标记为-1,就跳过cinit段的复制工作,直接进入用户程序main函数。这种模式在调试模式下常用。加载方式如下图所示。
3,在带有仿真器的情况下,两种加载模式的区别
在带有仿真器调试的情况下,仿真器相当于上图的加载器。
当选择-cr模式时,不管cinit段设定指向数据存储区还是程序存储区,调试电脑充当加载器的控制器,将cinit段直接下载到bss段,完成全局变量初始化,进入main函数。
当选择-c模式时,若cinit段设定指向数据存储区,下载程序时,仿真器会将cinit段数据下载到数据存储区,然后进入c_int00入口函数,auto_init函数读取到cinit的起始地址后,到数据存储区复制数据到bss段,完成全局变量初始化,然后进入main函数。
4, 烧写模式下的-c与-cr选择
在使用烧写的时候,应该选择-c模式,让DSP将cinit段的数据拷贝到bss段完成全局变量初始化,进入main函数。