This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C129ENCPDT:来自 RAM 的 TM4C129ENCPDT ISR

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/721378/ccs-tm4c129encpdt-tm4c129encpdt-isr-from-ram

器件型号:TM4C129ENCPDT

工具/软件:Code Composer Studio

您好!

在我的代码中  、.intvecs 存储器部分链接到闪存。 在初始化期间、矢量表没有复制到 RAM。 例如,我也可以使用 C2000系列中的 MCU,其中 memcpy ((void *) 0x000D00,&PieVectTableInit……) 用于复制中断矢量表。 在这种情况  下、中断表位于 RAM 中、因此必须对其进行复制才能正常运行、而在 TM4C129表中、中断表位于片上闪存0x0000.0000的开头。   

 TM4C129是否支持一些允许从闪存快速执行中断例程的优化预取机制? 数据表提到了向量表位置引入偏移的可能性、但是、TivaWare 示例(我特别查看 enet_lwip)不使用偏移选项、这意味着从闪存中提取 ISR。

/*内存中的段分配*/

段
{
.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
} 

在 startup_ccs.c 中定义的矢量表链接到.intvecs 段:

#pragma DATA_SECTION (g_pfnVectors、".intvecs") 

我将感谢您对经验丰富的用户的深入了解。


谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Lukasz:

     矢量表是可重定位的。 这是通过在 M4处理器中对 VTABLE 寄存器进行编程来完成的。 有关详细信息、请参阅数据表。 如果您想了解如何完成、可以参阅引导加载程序的 BL_STARTUP_CCS.s 文件。 下面是一个有关如何完成的片段。该文件可在<TivaWare_Installation/boot_loader. 中找到 闪存控制器具有预取功能。 它将一次预取256位。 预取缓冲区允许使用适合预取缓冲区的线性代码或循环来保持120MHz CPU 速度的最大性能。 因此、从性能角度来看、我不会看到闪存或 RAM 中的 VTABLE 之间有太大的差异、除非您尝试创建一个引导加载程序、您可能需要在其中擦除 VTABLE 所在的第一个闪存扇区。  

    ProcessorInit:.asmfunc
    ;
    ;;将代码映像从闪存复制到 SRAM。
    ;
    MOV r0、#0x0000
    MOV R1、#0x0000
    MOVt R1、#0x2000
    LDR R2、BSS_START
    COPY_LOOP:
    LDR r3、[r0]、#4
    结构 R3、[R1]、#4
    CMP R1、R2
    BLT COPY_LOOP
    
    ;
    ;零填充.bss 段。
    ;
    MOV r0、#0x0000
    LDR R2、BSS_END
    ZERO LOOP:
    结构 R0、[R1]、#4
    CMP R1、R2
    BLT zero_loop
    
    ;
    ;;将矢量表指针设置为 SRAM 的开头。
    ;
    movw r0、#(NVIC_vtable & 0xFFFF)
    movt r0、#(NVIC_vtable >> 16)
    MOV R1、#0x0000
    MOVt R1、#0x2000
    结构 R1、[r0]