主题中讨论的其他器件:MSP430-GCC-OPENSOURCE、
MSP430-GCC-OPENSOURCE 编译器有一个关于全局变量的看似奇怪的行为(有时)。
附件中的示例项目是来自我一直使用的代码库的简化示例。 在"twi.c"文件中、有一个名为"myvar"的全局变量。 当用一些值(0x0040、0x0140、0x0240、...)初始化该变量时 0x0F40)生成的程序被"破坏"。
BROKEN 意味着(使用调试器确定):
- 该程序从不执行到 main
- 程序按预期达到__ crt0_start
- 程序会将其添加到__ crt0_init_BSS 中的调用指令
- 然后程序在地址0x0004 (PC = 0x0004)结束、这是一个到自身的跳转
- 在0x0004的调用和首次到达之间有516、095个时钟周期(非即时跳转)
令人困惑的是、访问全局变量的看门狗 ISR (请参阅"wiring.c")也是代码"broked"所必需的。
重现步骤(使用 BugExample.zip)
- 将 BugExample 项目导入 CCS
- 确保看门狗 ISR 在 wiring.c 中增加"WDT_overflow_count"
- 确保在 twi.c 中将一个"broked"值分配给"myvar"(请见针对被破坏和工作值的注释)
- 清理和构建工程
- 开始调试会话
- 请注意、程序从未使其成为 main
如果"myvar"不是损坏的值之一、或者如果 WDT ISR 不递增(访问?)、程序将按预期工作 "wDT_overflow_count"。
移植到 TI 编译器的相同程序(也作为 BugExampleTI.zip 随附)不会发生这种情况
e2e.ti.com/.../BugExample.zipe2e.ti.com/.../BugExampleTI.zip