实验环境:
Keil MDK 5.23 + stm32f103vct6 + 未开启优化。
实验缘由:
实验中需要用到一个数据,该数据参与运算,并通过lcd进行显示。
实验描述:
1》该数据是一个只读数据,并不会被修改。
2》该数据出现在2个地方:1》定时时间为1秒的l中断服务函数中(通过
snprintf()将该数据转换为字符串送给lcd显示)。 2》while(1)计算函数中(该数据仅仅作为右值参与计算)。
实验现象:
lcd显示该数据现象为:随机情况下正确,随机情况为0(我通过串口printf()该数据现象也是如此)。
调试经过:
前面的各种debug过程我就略过。最终我考虑到是否为函数重入问题。以下是我的解决办法:
使用MDK自带的microLIB库中的snprintf()取代defaultC库中的
snprintf()。问题最终解决。
请教问题:
问题虽然解决,但是我感觉还有很多疑惑,如下:
1》如何查找snprintf()在defaultC下的源码,难道defaultC库并不确保所有库函数都是可重入的?microLIB中的所有库函数确保都是可重入的?
2》microLIB和defaultC还有哪些差别(下图是MDK手册对microLIB的相关说明,其中根本没有提到reentrant相关问题)?
000.png (16.22 KB, 下载次数: 0)
下载附件
2018-3-12 12:53 上传
恳请大神指教,不胜感激!
如果你的线程创建时,堆栈指针不是指向8字节对齐地址,或者是调用汇编实现的代码并且该代码并没有遵守8字节来处理栈指针时,就会悲剧的。
如果你碰到这种现象:同样的代码重新编译,或者随便改改重新编译,总是时好时坏。那就是堆栈对齐问题导致的。
重新编译时链接器会重新分配各种数据的内存地址,这就造成了时好时坏的现象。
一周热门 更多>