sprintf在IAR微控制器中破坏arrays
我目前正在学习嵌入式编程,因此使用带有ARM架构的TI微控制器在IAR平台上工作。 由于我完全不熟悉与此类编程或C编程相关的技术,我想问一个基本问题:
我有以下简单的代码片段:
int i; for(i = 0; i < NUM_SAMPLES; i++) { sinTable[i] = sinf(2*i*dT*PI); } for(i = 0; i < NUM_SAMPLES; i++) { char out[32]; sprintf(out,"sin: %.7f, %.7f;", i*dT, sinTable[i]); putString(out); delay(DELAY_100US); }
其中sinTable[]
是一个大小为NUM_SAMPLES
的全局变量, NUM_SAMPLES
putString(*char)
是一个写入RS232端口的函数,而delay(float)
是一个简单的延迟函数。
我的问题是,一旦sprintf(...)
被调用,它就会破坏sinTable
,当在COM信号的接收器端绘制表格时会给出一些非常特殊的结果。
我不希望我的内存不足,因为MC有64KB SRAM。
有人有想法吗?
达到main
时,确保堆栈指针位于64位边界上。
您看到的症状是典型的在奇数32位边界上对齐的堆栈。 在将double用作variadac参数之前,一切似乎都能正常工作。 当代码期望这些参数在8字节边界上时,这会中断。
经过进一步审核:我怀疑Michael Burr关于堆栈利用率的回应是在正确的轨道上。 选择较小的printf库可能就足够了,但是如果你可以增加堆栈大小,这似乎更安全。 请注意,IAR C / C ++开发指南包含有关链接器堆栈使用情况分析的信息。
原文:当我从IAR 6.1(许可)升级到6.4(kickstart)时,我遇到了类似的问题 – vsnprintf正在编写“全部RAM”,即使返回值表明写入的字符数在目标范围内也是如此。 “解决方案”是为了避免具有多字节支持的printf库。
项目选项>常规>库选项> printf small w / o多字节
可能还想取消选中
项目选项> C / C ++编译器/语言2 /启用多字节
我试图向IAR报告此事,但由于我的支持合同已过期……
不幸的是,类似的问题又回到了IAR 7.3.4,多字节“修复”似乎不够。 与sprintf()和snprintf()一起发生,尽管这两者之间的越界损坏并不相同。
你似乎非常确信你的结果字符串只有31个字符。 使用sprintf语句破坏另一个变量的唯一方法是结果字符串超过32个字节(31个字符和一个空字节),因此会覆盖其他内存部分。 使您的数字更小或使您的临时缓冲区更大。
感谢任何建议解决此问题的人。 我最终写了一个转换方法,它给出了字符串的hex表示,然后传输,完全省略了sprintf(...)
。
它很粗糙,但适合我的需要。