单片机/MCU论坛
直播中

微风挽雨

10年用户 1014经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术
私信 关注
[问答]

如何使TC1796运行在RAM?

Hello,我目前正在寻找一种方式,能让我的代码运行在TC1796的RAM上,请问有人能帮助我吗?
IDE环境:HighTec
调试环境:UDE
硬件环境:Triboard-TC1796B
代码生成工具:DAvE2
目前我用同一份代码,在HighTec选择iROM的情况下,去进行编译调试,可以正常的运行;
但在选择iRAM的情况下,去编译调试,调试日志显示无法读取DBGSR,这应该是出现了程序跑飞了;
从调试界面看,UDE似乎是帮我把FW加载到了FLASH区域,但我并不知道该怎么去限制它。
                                                                                                                                                               

回帖(1)

李华

2025-8-18 16:40:53

要让代码在TC1796的RAM中运行,需要解决链接配置、启动流程和调试器设置等问题。以下是详细的步骤和解决方案:




核心问题分析



  1. 链接脚本配置错误:iRAM模式下未正确将代码段映射到RAM地址。

  2. 启动代码未适配RAM运行:Flash初始化、硬件初始化等流程不适用于RAM运行。

  3. 调试器错误加载到Flash:UDE默认可能将代码加载到Flash而非RAM。

  4. 中断向量表位置错误:未将中断向量重定位到RAM。




解决方案步骤


1. 修改HighTec链接脚本(.ld文件)



  • 定位HighTec工程中的链接脚本(通常为.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
    }



2. 重构启动代码(Cstart)



  • 删除Flash初始化代码(如IfxScuWdt_disableCpuWatchdog可能依赖Flash)。

  • 简化启动流程
     void __start(void) {
       // 仅初始化必要硬件(时钟/PLL已在调试器预配置)
       initClockFromScu();       // 如果必须,确保不依赖Flash
       initDataSections();        // 初始化.data和.bss段(需手动实现)
       main();                    // 跳转到用户main函数
    }


3. 配置UDE调试环境



  • 设置加载地址

    1. 在UDE的Project Settings > Load中,取消勾选"Erase Flash before loading"。

    2. .elf文件加载地址强制设为RAM地址(如0xD0000000)。


  • 修改调试脚本
    在UDE的CPU Configuration Script中添加:
     # 设置PC指向RAM入口
    setreg PC 0xD0000000
    # 初始化SP(如果启动代码未处理)
    setreg SP (0x70000000 + 128K - 4)


4. 中断向量表重定位


   // 在main()初始化代码中
   #include
   void remapInterrupts() {
     // 设置BIV(Base Interrupt Vector)到PSPR
     IfxScuWdt_clearCpuEndinit();
     __mtcr(0xFE04, 0xD0000000); // 写BIV寄存器
     IfxScuWdt_setCpuEndinit();
   }

5. 验证内存初始化




  • 确保.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;
    }





调试技巧



  1. 检查反汇编

    • 在UDE中查看0xD0000000处是否有代码(如__startmain)。


  2. 最小化测试代码
    void main() {
    volatile unsigned int *led = (void*)0xF0000000; // Triboard LED地址
    *led = 0x1; // 点亮LED
    while(1);
    }

  3. 监视寄存器

    • 在UDE中检查PCSPBIV的值是否指向RAM地址。





常见错误处理
































现象 可能原因 解决方案
DBGSR读取失败 PC未指向有效RAM代码 检查启动代码和PC初始值
运行后立即崩溃 栈指针(SP)未初始化 在启动代码中显式设置SP
全局变量值错误 .data/.bss未正确初始化 实现initDataSections()
中断触发崩溃 BIV未重定位到RAM 调用remapInterrupts()


关键点:HighTec的"iRAM"配置可能需要手动适配启动流程,调试器的加载行为需明确指向RAM。通过链接脚本重定向+启动代码简化+调试器配置,可确保完整运行在RAM中。



如果仍有问题,建议检查Triboard的初始化脚本(.bmm文件),确保调试器未强制配置Flash区域。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分