TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6727B: 二次Bootloader后的地址与值

Part Number:TMS320C6727B

我使用的DSP型号是TMS320C6727B,对应的内部RAM地址为0x10000000——0x1003FFFF,对应Flash的地址为0x90000000——0x9FFFFFFF,自己编写C语言与汇编语言程序进行二次引导操作。C语言程序是将hex文件中的数据按地址写进Flash中。汇编语言程序进行二次引导操作,即EMIF配置、将Flash数据拷贝到RAM相应的位置、跳转至C语言程序入口。C6727.cmd文件修改部分如图所示:

如果二次引导成功,那么:

①内部RAM中地址为0x10000000——0x10000400的数据应该与Flash地址为0x90000000——0x90000400中的数据对应相同。

②内部RAM中地址为0x10000400之后的数据应该与Flash地址为0x90000400之后的数据对应相同(Flash中未写入数据的部分不算)。

想问下,这个说法是正确的吗?

如果上面的①②是对的,那么想问下出现以下问题的原因:

将汇编文件boot.asm单独放到一个工程中,分别进行单步运行与全速运行,发现均可以将0x90000400之后的数据成功赋给0x10000400后对应的位置。但是将C语言与汇编语言程序放到一个工程中,全速运行后发现(此时无法对汇编文件单步运行),RAM对应地址上会出现Flash中的数据,但是会出现数据错误与丢失现象。0x400之后的数据错误与丢失现象尤为明显。我在汇编程序中加入了很多延时语句,没有效果。

请问出现这个问题的原因以及可能的解决方法,谢谢。

Shine:

建议把二次bootloader和应用程序分两个工程。

Jack Chen 说:此时无法对汇编文件单步运行

设断点可以跟踪二次bootloader代码吗?

,

Jack Chen:

现有两个工程,第一个是led.prj,功能是小灯闪烁5次,里面主要包括.c文件、.cmd文件、vectors.asm文件(该工程没有使用中断,所以只在RESET部分做了修改)、boots.asm文件。

第二个是二次引导程序bootloader.prj,里面主要包括.c文件(功能是将.hex文件按地址写进Flash中)、.cmd文件、vectors.asm文件、boots.asm文件。其中两个工程的后三个文件完全相同。

.cmd文件如图所示:

为了将led.prj烧进电路板,也就是实现重新上电后小灯闪烁5次的功能,我的操作是这样的:

①编译led.prj生成led.out和led.map,然后用hex6x生成led.hex文件,并将led.hex复制到bootloader.prj所在的Debug文件夹下。

②编译并运行bootloader.prj,运行完毕后发现led.hex文件已经成功被写入Flash所在地址。但是却并没有将这些数据复制到内部RAM所在地址,也就是说boots.asm文件并未生效。

之后我将boots.asm单独放到一个工程中,对其分别进行单步运行与全速运行,发现可以将flash的0x90000400后的数据成功复制到内部RAM的0x10000800地址。但0x10000000——0x10000400上的数据与0x90000000——0x90000400上的数据并不相同。我查阅资料发现,前0x400个数据的复制是芯片自带的一次引导程序完成的,所以我编写的boots.asm代码应该完成了二次引导的任务。

设置断点无法跟踪boots.asm代码,只能跟踪C语言代码。

,

Shine:

我觉得分三个工程比较好1. led.prj工程2. 二次bootloader工程:负责初始化EMIF和从flash里搬移代码到RAM。

3. 烧写工程:负责把二次bootloader和应用程序led.out烧写到flash。

,

Jack Chen:

按照您的回复,我尝试了一下。

我发现我的二次bootloader工程,也就是.asm文件,如果不做修改会有报错。修改之后,我还在代码的结尾加上一个“RET”,程序无法自己结束运行。所以我就在结尾加了一个死循环。这样运行一段时间后停止,我发现已经运行到死循环处,便停止运行代码。查看了一下RAM对应地址的值,发现这次都是正确的。于是我退出Debug。对电路板重新上电,发现还是没有任何现象,并且Flash中的数据全为FFFF,RAM中的代码也发生了变化,也就是二次引导还是未成功。

这是哪里出了问题呢?会和中断向量表有关吗?如图所示是我的vectors.asm文件。

,

Shine:

Jack Chen 说:并且Flash中的数据全为FFFF,RAM中的代码也发生了变化,也就是二次引导还是未成功。

这个应该是烧写工程烧写的吧?

建议先把烧写工程调试通过,然后把led应用代码烧写到flash,再在仿真模式下调试二次bootloader,看是否能去flash中搬移应用程序到RAM并且运行。

如果上面都调通了,再把二次bootloader烧写到flash,看是否能脱机运行。

下面的二次bootloader应用文档可以参考一下。https://www.ti.com/lit/an/spra999a/spra999a.pdf8080.spra999a.zip

,

Jack Chen:

您好,现在的情况是这样的:

烧写工程完全正常,可以把hex文件成功烧写到Flash对应位置,并且重新上电之后Flash数据不会丢失。

二次bootloader程序也完全正常,可以将Flash中的数据搬移到RAM对应位置。但是没有对应现象(小灯闪烁)。重新上电后,发现Flash中的数据正确,但是RAM中的数据是错误的,也没有对应现象(小灯闪烁)。

,

Shine:

建议用仿真器跟踪一下二次bootloader代码boot过程 连上仿真器,板子上电,打开CCS, load symbols,然后可以设置硬件断点跟踪boot过程。 "Load Symbols" instead of "Load Program" When debugging an application from flash, you want to let the application boot in its normal manner. If you select "load program" in CCS then you are overwriting the application that loaded from flash and not debugging the code as it runs normally. You should instead do "load symbols" in CCS and then select your .out file. This will allow you to debug your code using variable/function names without overwriting the code that boots from the flash. CCS 3.3: Go to File -> Load Symbols -> Load Symbols Only CCS 4.x: Right-click on the project and select Debug Options. On the "Debugger" tab choose "Load Symbols" instead of "Load Program" CCS 5.x: In the "Debug View" tab choose "Run"–> "Load" –> "Load Symbols"

,

Jack Chen:

您好,谢谢您的回复。

①将电路板上电,CCS软件进入Debug后,这段汇编代码是自动运行的吧,也就是说不需要点击“运行”,这段汇编代码就已运行完毕?

②刚才又进行了以下测试:

工程中的C语言文件如下:

int main()

{

    return 0;

}

工程中的汇编语言文件如图所示:这个汇编文件不为了完成二次bootloader功能,只是为了测试文件是否运行。

测试结果发现:当工程中既有C语言文件又有汇编语言文件时,点击“运行”,寄存器的值并未改变,也就是说汇编语言文件实际上没有运行。这个是什么问题呢?

,

Jack Chen:

还有一个问题就是,我的CCS是7.4版本的,我用“load symbols”也无法对boot过程进行调试,点击“load symbols”后,代码就直接运行到主函数处了。

然后我对软件进行了设置,如图所示:我将这里的“main”改成了代码中boot过程的入口“_boot”。

随后我想单步运行或全速运行都不能进行,就直接卡在_boot这里了。

所以我想问,是还要做其他的设置吗?

,

Shine:

Jack Chen 说:①将电路板上电,CCS软件进入Debug后,这段汇编代码是自动运行的吧,也就是说不需要点击“运行”,这段汇编代码就已运行完毕?

从flash中把二次bootloader搬移到片上RAM是硬件做的,看一下能否在RAM 0x10000004处设置硬件断点。

Jack Chen 说:也就是说汇编语言文件实际上没有运行

建议跟踪一下代码,看程序跳到哪里去了。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6727B: 二次Bootloader后的地址与值
分享到: 更多 (0)