以tms320f28377d为例:
假设我们创建工程test;
该项目中需要注意的文件包括(见图1):
1、 main.c文件;
2、 DSP用于连接.coff(可执行文件)的 .cmd文件;
3、 28377型号相适配的 F2837xD_CodeStartBranch.asm文件
图1
main程序具体内容如下(见图2):仅为一个主应用程序,内容随意;
图2
当我们将该工程烧写进入dsp芯片中的片上FLASH时,dsp上电是如何执行芯片中的代码的(代码的执行流程);
首先,在dsp在线调试状态下,进入debug界面,打开view菜单栏中的Disassembly选项(见图3);这里我们可以查看片内flash上不同地址中对应的汇编代码;
图3
打开之后如下:我们点击debug界面中的CPU Reset之后;
此时芯片重启;重启后代码的运行位置为片内flash地址0x3ff16a(见图4),该位置处的代码是Ti出厂前已经固化好的程序,功能是完成底层的寄存器,堆栈等的环境配置;
图4
接下来,等待Ti底层的boot程序完成初始化之后,DSP芯片会跳转至0x80000去执行用户的第一条指令;我们在地址0x80000处设置一个断点;点击继续运行(见图5);
图5
此时,程序停止在了设置的断点0x80000处,这是dsp底层执行完上电boot之后,执行的第一条用户指令的地址;DSP默认flash启动,dsp启动完成boot初始化后,程序PC设置到flash地址的0x80000处去执行用户的第一条指令,即F2837xD_CodeStartBranch.asm文件中的code_start函数(见图6); 观察flash在0x80000处的内存内容,程序在该处仅存在一条跳转指令0048 201C (机器码意思为004/跳转至8201C处);即LB _c_int00,跳转至函数 _c_int00;(注意:假设我们配置cmd文件;BEGEIN: origin=0x082000,length=0x000002;我们连接仿真器在线运行时,程序是可以正常运行的,但是当我们不连接仿真器时,保持dsp芯片在未连接仿真器的状态下通电,此时,程序的确已经烧写进入dsp的flash芯片当中,但是芯片上电后无法正常运行;因为,dsp在完成boot后会跑到0x80000处去执行用户的第一条指令,而我们的cmd文件中:code_start:>BEGIN 将上电运行的第一条指令烧写在了flash 0x82000处,而0x80000处没有可执行代码,因此我们芯片上电后不会运行)
图6
在Disassembly处点击单步运行,程序运行的下一条指令即为 _c_int00函数;该函数地址为
0x8201C,与机器码的跳转地址一致(见图7);该函数的主要作用为:为用户编写的应用层代码初始化寄存器以及堆栈等;继续单步向下运行;(_c_int00保存在boot28.asm中,该文件为库文件,不在用户创建范围内)
图7
可以发现程序运行到了 LCR __args_main这条汇编指令(仍在_c_int00函数中);该汇编语句的意思是跳转至__args_main函数并返回(若main函数无法返回则该函数也无法返回);
继续点击单步运行,进入__args_main函数中去(见图8);
图8
可以发现,__args_main函数执行的最后一条指令就是用户编写的 main函数;(__args_main函数保存在args_main.c中,该文件为库文件,不在用户创建范围内)(见图9)
图9
至此,我们可以将DSP上电运行的流程整理如下:
图10