完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
在PIC32 MZ EF项目中,用XC32 1.43/MplabX 3.60,我似乎从sprintf得到一些奇怪的输出。作为例证,我有“v”是DWORD。在原始的PIC32 MX项目中,这是从XC1.00移植过来的,如果v==0我们会得到0.0现在我们得到0u.0u如果我使用0u.编译器还抱怨,'format%u期望类型'unsigned int'的参数,但是参数3具有类型'long unsigned int'。其他可编译的'u'置换和一个或多个'l'的置换似乎表现相似-函数只吞噬第一个类型代码字符,并将其他的包含在输出字符串。对我来说,这似乎是一个bug,这很痛苦,因为比起等待他们修复他们的代码,修复我的代码要快得多,也更容易!任何人都发现类似的行为,或解决办法,或可以建议什么格式编码应该是,如果是问题?
|
|
相关推荐
9个回答
|
|
|
我有一个更好的,支持案例#00223502,我的pic32mx270f256d在尝试打印浮点时崩溃了,早期的证据表明它的值为-0.0024左右。这里是details的简短版本:crashes位于内存位置0x9d007608,根据我的映射文件位于“_f.”:map文件.:.text._fconvert0x9d007504 0xf2c 3884.text._fconvert0x9d007504 0xf2c.text._fconvert0x9d007504 0xf2c:/程序文件(x86)/microhip/xc32/v1.43/bin/bin/.././lib/gcc/pic32mx/4.8.3/././.././../../pic32mx/lib/.liblega-c.a(_doprnt.o)我的日志文件以行(现在是时间戳)数据作为前缀,3个“真实”数据点跟在“S,7,”之后。崩溃始终是“数据总线错误”。错误日志:
|
|
|
|
|
|
“L”实际上是不需要的,因为无符号和无符号long都是32位。然而,我已经复制了结果。这似乎是一个libc bug。要修复,要么删除项目属性的XC32(Global Options)页面中的冗余的“l”,要么去掉“Use Legacy libc”,希望它不会引入其他错误;-|并且提出一个支持票,让编译器人员知道。你永远不知道,今年你可能会听到。
|
|
|
|
|
|
忘记我的代码行:sprintf(et,“%03d,S,%1d,%+0.4f,%+0.4f,%+0.4f,%+0.3f,”),a,(int)s,i[0],i[1],c);(变量名已更改以保护无辜者)还有一个前缀和一个CRC,在从UART发货之前附加,但是这些与“_f.”调用无关
|
|
|
|
|
|
对于XC32,整数是32位的量,长整数是32位的量,长的长整数是64位的量。即使int和long的大小相同,printf希望unsignedlong为“%u”,unsignedlong为“%lu”。您不必按我的方式去做,但我认为通过使用
|
|
|
|
|
|
注意,未选中的选项(v1.43及更高版本)有几个LSB的浮点舍入错误,所以如果按下浮动的精度限制(https://commons.wikimedia.org/wiki/File:IEEE754.png),则可能没有这个选项。(支持案例00221415)
|
|
|
|
|
|
这一切都很有帮助。使用uint32_t并移除'l's可以解决问题,而不会产生歧义或编译器发出的哔哔声,并且希望别处出现新错误的风险最小。支持票提高了,不要屏住呼吸。虽然它本身是一个小毛病,但这是一个不受欢迎的分心,因为要让新的硬件和新的CPU在一个相当复杂的项目中很好地一起工作。所以我们非常感谢你们的帮助和关心。谢谢大家。
|
|
|
|
|
|
以下来自Microchip的答复可能有用,Paul---- Microchip关于类似问题的回复----请确保在项目中使用“.y-libc”。在MPLAX IDE中使用“传统LIBC”选项在“XC32(全局选项)”对话框中。传统LIBC是与XC32 V1.41和更高版本链接的默认C库。编译器中的这个更改在编译器自述文件中记录为:Legacy LibC default——遗留的标准C Lib现在是默认libc。这种LIBC实现为STDIO函数(如Prtff())和SCAN()提供了改进的功能。这个库已经被增强以支持XC32的智能IO V2特性。此外,这个LibC实现提供了更健壮的malloc()算法,包括防碎片化和改进的局部性机制。如果您希望使用与早期XC32版本相同的LibC,那么在编译和链接时将新的-no-.y-libc选项传递给xc32-gcc。还可以在“XC32 GCC”“附加选项”下使用“-FNO短双”选项。(-FNO短双):默认情况下,编译器使用与浮点相当的双类型。此选项使双等效为长双倍。如果模块直接通过参数通道或间接通过共享缓冲区空间共享双倍数据,则跨模块混合此选项可能产生意想不到的结果。图书馆提供了具有开关设置的产品功能。如果您还有问题,请将示例项目放在zip文件中(包含c文件、asm文件、h文件、MPLAB X项目),以便我们对问题进行评估。请发送一个演示项目的削减项目。如果缩减项目是不可能的,请发送复制项目的完整项目。该项目将用于调试目的并复制该问题。-----
|
|
|
|
|
|
“F-短双”对我来说是新的…我没有使用编译器指令,那么为什么我得到以下警告:sprintf(._float,“%+03.4f,”),f_value);warning:format“%f”期望类型“double”的参数,但是参数3具有类型“float”[-Wformat=]……如果它们是相同的?
|
|
|
|
|
|
“有效地相同”和“命名相同”之间似乎有区别。编译器似乎带有一个更安全的选项,即将它们标记为不同的(如果不是完全相同的名称/类型)。我建议您尝试将变量更改为double或使用%lf。使用的LER版本是预期的,鉴于我在互联网上看到的关于不同GNU C和C89/C99…版本很有趣!(我感到沮丧,最近我在使用微芯片的时候发出奇怪的咯咯声!)保罗
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:08 , Processed in 0.820986 second(s), Total 60, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2353