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(...)

它很粗糙,但适合我的需要。