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.
工具/软件: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]