主题中讨论的其他器件:MSP430F5437A、 MSP430WARE
工具/软件:Code Composer Studio
您好!
我最近将 CCS 从7.x 升级到8.1.0、并首次启用空存储器访问中断。 这样做之后、每次 执行从地址 0x25BFF 取指令的函数时、我都会遇到非常常规和奇怪的 SYSNMI_Vector 中断。
在每次编译时尝试调试问题、它会随着放置在末尾位置的函数的更改而不断移动。 得出这一结论需要许多红色的鲱鱼和死鱼路径。
从.cmd 文件执行的命令现在读取;
内存 { SFR :origin = 0x0000、length = 0x0010 外设_8位 :origin = 0x0010,length = 0x00F0 外设_16BIT :origin = 0x0100,length = 0x0100 BSL0 :origin = 0x1000、length = 0x0200 BSL1 :origin = 0x1200,length = 0x0200 BSL2. :origin = 0x1400、length = 0x0200 BSL3 :origin = 0x1600,length = 0x01F0 /*这将完全固定 BSL,而不是让其启动。 *在 BSL3区域的下一个擦除周期时、将设置此值 将*更改为0xFFFF、这是一个可接受的值。 它必须为0xFFFF 或0x0000。 如果情况并非如此、则器件变为 *不可操作。 这将是坏的:) * *侧注;这还确保 BSL 永远不会识别 *已输入。 * BSLZ :origin = 0x17F0、length = 0x0010、fill = 0x0000 信息系统 :origin = 0x1800,length = 0x0080 信息系统 :origin = 0x1880、length = 0x0080 信息 :origin = 0x1900,length = 0x0080 INFOA :origin = 0x1980,length = 0x0080 //RAMZ:origin = 0x1C00,length = 0x0100,fill=0xA0A0 RAM :origin = 0x1C00,length = 0x4000 闪存 :origin = 0x5C00,length = 0xA380,fill = 0x3FFF FLASH2 :origin = 0x10000、length = 0x15B80、fill = 0x3FFF //将这些字节保留为空。 在上一节中提出了 VMAI 错误 FLASH3 :origin = 0x25B80,length = 0x80,fill = 0x3FFF … 部分 { .TI.noinit:{}>RAM /*用于#pragma noinit * .bss :{}> RAM /*全局和静态变量 * .data :{}> RAM /*全局和静态变量 * .cio :{}> RAM /* C I/O 缓冲器 * dbg :{}> RAM sysmem :{}> RAM /*动态内存分配区域*/ /******** 内存孔 / 堆栈 :{}> RAM (高) /*软件系统堆栈 // #ifndef __large_code_model__ .text :{}>闪存 /*代码 */ #else .text :{}>> FLASH2 | FLASH /*代码 */ #endif .text:_ISR:{}> FLASH /* ISR 代码空间 * .cinit :{}>闪存 /*初始化表 */ #ifndef __large_data_model__ .const :{}>闪存 /*常量数据 */ #else .const :{}>> FLASH | FLASH2 /*常量数据 */ #endif .pinit :{}>闪存 /* C++构造函数表 * 二进制文件 :{}>闪存 /*引导时初始化表*/ init_array:{}> FLASH /* C++构造函数表 * .mspabi.exidx:{}>闪存 /* C++构造函数表 * .mspabi.extab:{}> FLASH /* C++构造函数表 */ #ifdef __TI_Compiler_version__ #if __TI_Compiler_version__>=15009000 #ifndef __large_code_model__ .TI.ramfunc:{} load=flash,run=RAM,table (BINIT) 其他 .TI.ramfunc:{} load=flash | FLASH2、run=RAM、table (BINIT) endif #endif #endif #endif .bsl0.noinit :{}> BSL0,type=NoLoad .bsl1.noinit :{}>BSL1, type=NoLoad .bsl2.noinit :{}>BSL2, type=NoLoad .bsl3.noinit :{}>BSL3, type=NoLoad /* Nerf BSLZ 区域保持 BSL 被禁用和 JTAG 访问 *支持开发/发布 * bslz :{}> BSLZ、fill=0x0000 信息 A :{}>INFOA /* MSP430 INFO 闪存段*/ 信息 B :{}>INFOB .infoC :{}>INFOC 信息 D :{}>INFOD
我将使用0x3FFF 填充所有未使用的闪存、以确保在执行繁重的任务时实现正确的代码跳转。 放置在最后几个字节中的函数是
proof_outc 位于地址范围的末尾;
0x025BE2 _outc 0x025BE2 9D9D 0002 0004 2C07 4D2E 0ECF 531F 0x025BF0 4F8D 0000 4CCE 0000 0x025BF8 $C$L6 0x025BF8 539D 0004 4C4C 0110
使用链接器指令;
内存 {... FLASH3 :origin = 0x25B80,length = 0x80,fill = 0x3FFF... }
部分{... VMI.endFlash:{--library=rts430x_lc_sd_eabi.lib (.text:_outc)}> FLASH3 (HIGH)...}
在程序地址0x25BEE 之后设置断点、以便能够在运行时单步执行代码。
在启动时执行此代码;
/*启用闪存和存储器访问中断 * / SFR_clearInterrupt (SFR_空置 的存储器访问中断| SFR_FLASH_CONTROLLER_ACCESS_ACCESS_violation_interrupt); SFR_enableInterrupt (SFR_空置 的存储器访问中断| SFR_FLASH_CONTROLLER_ACCESS_CONTROLLER_ACCESS_CONTRAL_INTERRUVE_INTERRUPT);
如果我在 MSP430F5437A 上运行相同的十六进制文件、我不会获得相同的中断。 我假设这是因为下一个0x25C00闪存地址有效、并且在不检查闪存边界限制的情况下进行某种预取操作。
如果在闪存的最后0x08字节中执行任何取指令操作、则发生 VMA 中断。 (我已经从闪存末尾测试了0x10到0x01缓冲区)
这将失败;少于8个字节
//将这些字节保留为空。 在上一节中提出了 VMAI 错误
FLASH3:origin = 0x25B00,length = 0xFA,fill = 0x3FFF
FLASH4:origin = 0x25BFA,length = 0x06,fill = 0x3FFF
这是正常的;等于或大于8字节
//将这些字节保留为空。 在上一节中提出了 VMAI 错误
FLASH3:origin = 0x25B00,length = 0xf8,fill = 0x3FFF
FLASH4:origin = 0x25BF8,length = 0x08,fill = 0x3FFF
e2e.ti.com/.../lnk_5F00_msp430f5418a.7z
MSP430F5418a 项目的有效链接器文件
这是我所有构建选项和包含项的链接器行。
"c:/ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/bin/cl430 /ti/ccsv8/ccs_base/msp430/include /ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/include -vmspx --data_model=small -o0 --opt_for_speed=1 --align_for_power --use_hw_mpy=F5 --define=_MSP430F5418A_--c99 --float_operations_allow=all --use_printf_support=full --gen_mpy=fb --define=atterms-ins-iclif_ipot-at_ine-reguls=-at_ips=-ines=-ina-cs=-ine-ment-cs=-in-in-in-at_ipot_in-in-in-in-in-at_in-at_in-in-in-at_ins-ine-reguli=-ins-ins-over-ment-link=cand-ines=cat_ins-ins-ins-intrad_ines=-ines=-ins-ins-inattrad_ines=-ines=cat_ins-ins-ins-ins-ins-ins-out-ines=-at_at /ti/msp/MSP430Ware_3_80_04_05/iqmathlib/libraries/CCS/MPY32/5xx_6xx /ti/ccsv8/ccs_base/msp430/lib/5xx_6xx_FRxx /ti/ccsv8/tools/compiler/ti-cgt-msp430_18.1.2.LTS/lib ###"../lnk_msp430f5418a.cmd"-llibc.a -llibmath.a -lIQmathLib.a -lIQmathLib_ccs_MPY32_5xx_6xx_CPUx_large_code_small_data.lib