要让代码在TC1796的RAM中运行,需要解决链接配置、启动流程和调试器设置等问题。以下是详细的步骤和解决方案:
.ld或.lsl文件)。关键修改:
MEMORY {
/* 删除或注释Flash区域 */
/* iROM : ORIGIN = 0xA0000000, LENGTH = 2M */
/* 定义RAM区域 */
iRAM (w!x) : ORIGIN = 0xD0000000, LENGTH = 128K // PSPR起始地址
local_dsram (w!x) : ORIGIN = 0x70000000, LENGTH = 128K // DSPR起始地址
}
SECTIONS {
/* 将所有代码段(.text)和只读数据(.rodata)映射到PSPR */
.text : {
*(.text) // 用户代码
*(.text.*) // 库代码
*(.rodata) // 常量数据
} > iRAM
/* 数据段(.data/.bss)映射到DSPR */
.data : { ... } > local_dsram
.bss : { ... } > local_dsram
}IfxScuWdt_disableCpuWatchdog可能依赖Flash)。 void __start(void) {
// 仅初始化必要硬件(时钟/PLL已在调试器预配置)
initClockFromScu(); // 如果必须,确保不依赖Flash
initDataSections(); // 初始化.data和.bss段(需手动实现)
main(); // 跳转到用户main函数
}Project Settings > Load中,取消勾选"Erase Flash before loading"。.elf文件加载地址强制设为RAM地址(如0xD0000000)。CPU Configuration Script中添加: # 设置PC指向RAM入口
setreg PC 0xD0000000
# 初始化SP(如果启动代码未处理)
setreg SP (0x70000000 + 128K - 4) // 在main()初始化代码中
#include
void remapInterrupts() {
// 设置BIV(Base Interrupt Vector)到PSPR
IfxScuWdt_clearCpuEndinit();
__mtcr(0xFE04, 0xD0000000); // 写BIV寄存器
IfxScuWdt_setCpuEndinit();
}确保.data(初始化全局变量)和.bss(未初始化全局变量)在启动代码中被正确初始化:
extern unsigned int __data_start, __data_end, __data_load;
extern unsigned int __bss_start, __bss_end;
void initDataSections() {
// 复制.data段从加载地址到RAM
unsigned int *src = &__data_load;
unsigned int *dst = &__data_start;
while (dst < &__data_end) *dst++ = *src++;
// 清零.bss段
dst = &__bss_start;
while (dst < &__bss_end) *dst++ = 0;
}0xD0000000处是否有代码(如__start或main)。void main() {
volatile unsigned int *led = (void*)0xF0000000; // Triboard LED地址
*led = 0x1; // 点亮LED
while(1);
}PC、SP、BIV的值是否指向RAM地址。| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| DBGSR读取失败 | PC未指向有效RAM代码 | 检查启动代码和PC初始值 |
| 运行后立即崩溃 | 栈指针(SP)未初始化 | 在启动代码中显式设置SP |
| 全局变量值错误 | .data/.bss未正确初始化 | 实现initDataSections() |
| 中断触发崩溃 | BIV未重定位到RAM | 调用remapInterrupts() |
✅ 关键点:HighTec的"iRAM"配置可能需要手动适配启动流程,调试器的加载行为需明确指向RAM。通过链接脚本重定向+启动代码简化+调试器配置,可确保完整运行在RAM中。
如果仍有问题,建议检查Triboard的初始化脚本(.bmm文件),确保调试器未强制配置Flash区域。
举报
更多回帖