DSP芯片上电后在执行main函数前的执行流程

以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

  • 21
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ah_yl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值