Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
浮点数打印
想用sprintf打印浮点数时出现问题
发布于 2011-04-11 23:12:38 浏览:11990
订阅该版
大家好,刚接触RTT,第一感觉shell做的很好,调试起来很方便,所以开始在这个平台上做一些东西。 现在我遇到一个问题: 我想用sprintf把浮点数打印出来的时候就出现hard fault。 代码如下: ```c void ds18b20_thread_entry(void * parameter) { char __string[10]; float __T; ds18b20_init(); while(ds18b20_check() == 0) { lcd_showString(30,110,"DS18B20 detecting.."); rt_thread_delay(100); } lcd_showString(30,110,"DS18B20 detected "); lcd_showString(30,130,"Temperate:"); while(1) { __T = ds18b20_getTemp(); sprintf(__string, "%f", __T); lcd_showString(110,130,(const char*)__string); rt_thread_delay(200); } } ``` 编译器:Sourcery G++ Lite 2009q3-68 注:线程创建时使用动态内存方式。 使用sprintf打印浮点编译时提示缺少函数_sbrk。于是从网上找了一下这个函数。加进去重新编译通过,但运行完sprintf(),再接着跑rt_thread_delay()的时候就出现hard fault了。 ```c #include
extern int __HEAP_START; caddr_t _sbrk ( int incr ) { static unsigned char *heap = NULL; unsigned char *prev_heap; if (heap == NULL) { heap = (unsigned char *)&__HEAP_START; } prev_heap = heap; /* check removed to show basic approach */ heap += incr; return (caddr_t) prev_heap; } ``` __HEAP_START在linkerscript里面定义的 ```c ...... /* This is used by the startup in order to initialize the .bss secion */ _ebss = . ; _estack = .; *(.bss.init) } > DATA __bss_end = .; _end = .; PROVIDE(__HEAP_START = _end ); /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } ...... ``` 不知道是不是`_sbrk ()`定义的heap跟系统用的heap重叠了,请问问题主要出在哪里,还有其他方法打印浮点数吗? 谢谢 ![file.png](/uploads/2392_1bd2f84b86fdf84ce755f22d2daca095.png) ![file.png](/uploads/2392_2a53336e39358ad2860ffb161b5f46a3.png)
查看更多
8
个回答
默认排序
按发布时间排序
bernard
2011-04-12
这家伙很懒,什么也没写!
你用的是哪个分支?_sbrk是不能这么用的,这样使用系统会出现错误(因为动态堆内存管理已经被RT-Thread接管了)。
020gzh
2011-04-12
这家伙很懒,什么也没写!
>你用的是哪个分支?_sbrk是不能这么用的,这样使用系统会出现错误(因为动态堆内存管理已经被RT-Thread接管了)。 --- 谢谢bernard的回复 我现在用的是 URL :http://rt-thread.googlecode.com/svn/trunk Revision: 1364 我尝试过rt_sprintf,但发现rt_sprintf不支持%f。请问现在打印浮点数是怎样处理的呢?是不是只能把浮点数转换成整数(循环乘以10,取整数部分)再打印出来呢?
bernard
2011-04-12
这家伙很懒,什么也没写!
[s:180] 硬件平台是什么? newlib的sprintf可能与_sbrk有关系;另外,ARM平台在MDK中,浮点数需要线程栈向8对齐,但对于newlib, gcc还不知道是否也相类似。你先需要把你的硬件平台说说
020gzh
2011-04-12
这家伙很懒,什么也没写!
我的开发平台: eclipse+ CDT + GNU ARM Eclipse Plug-in 编译器: arm-none-eabi-gcc(Sourcery G++ Lite 2009q3-68) 硬件: ALIENTEK的板子,MCU是STM32F103RBT6的 现在我只拷贝了kernel以及finsh的代码来用,其他部分没加进来。 据我了解,amr-none-eabi-的编译器不像amr-elf-的,它没有包含完整的nwelib部分,所以用到库函数时,经常会提示某些函数没主体,主体还需要自己实现。 我想如果用MDK不会出现这样的问题,因为armcc已经把newlib做好了。
bernard
2011-04-12
这家伙很懒,什么也没写!
所以说,下次有问题一定需要讲清楚硬件平台,当然还有编译器,配置情况等。 你这个问题是,你的newlib根本没做移植,所以肯定出问题!既然你是用arm-none-eabi-,那么你就把RT-Thread中的RT_USING_NEWLIB打开吧,并编译libc/newlib下的代码。 arm-none-eabi-是包含newlib的,没包含的话,你的sprintf就无法链接成功了。
020gzh
2011-04-13
这家伙很懒,什么也没写!
我把RT_USING_NEWLIB给define了,然后再把componentslibc ewlib下的代码加入,重新编译。得到很多implicit declaration of function 的警告以及以下的错误: ``` undefined reference to `mkdir' syscalls.c /STM32_test/program/os/components/libc/newlib line 0 C/C++ Problem undefined reference to `rt_console_init' libc.c /STM32_test/program/os/components/libc/newlib line 0 C/C++ Problem ``` 下面是rtconfig.h的内容 ``` /* RT-Thread config file */ #ifndef __RTTHREAD_CFG_H__ #define __RTTHREAD_CFG_H__ /* RT_NAME_MAX*/ #define RT_NAME_MAX 10 /* RT_ALIGN_SIZE*/ #define RT_ALIGN_SIZE 4 /* PRIORITY_MAX */ #define RT_THREAD_PRIORITY_MAX 32 /* Tick per Second */ #define RT_TICK_PER_SECOND 100 /* SECTION: RT_DEBUG */ /* Thread Debug */ #define RT_DEBUG #define RT_THREAD_DEBUG #define RT_USING_OVERFLOW_CHECK /* Using Hook */ //#define RT_USING_HOOK /* Using Software Timer */ /* #define RT_USING_TIMER_SOFT */ #define RT_TIMER_THREAD_PRIO 4 #define RT_TIMER_THREAD_STACK_SIZE 512 #define RT_TIMER_TICK_PER_SECOND 10 /* SECTION: IPC */ /* Using Semaphore*/ #define RT_USING_SEMAPHORE /* Using Mutex */ #define RT_USING_MUTEX /* Using Event */ #define RT_USING_EVENT /* Using MailBox */ #define RT_USING_MAILBOX /* Using Message Queue */ #define RT_USING_MESSAGEQUEUE /* SECTION: Memory Management */ /* Using Memory Pool Management*/ #define RT_USING_MEMPOOL /* Using Dynamic Heap Management */ #define RT_USING_HEAP /* Using Small MM */ #define RT_USING_SMALL_MEM /* SECTION: Device System */ /* Using Device System */ #define RT_USING_DEVICE #define RT_USING_UART1 /* SECTION: Console options */ #define RT_USING_CONSOLE /* the buffer size of console*/ #define RT_CONSOLEBUF_SIZE 128 /* SECTION: finsh, a C-Express shell */ #define RT_USING_FINSH /* Using symbol table */ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION /* SECTION: the runtime libc library */ /* the runtime libc library */ #define RT_USING_NEWLIB #define RT_USING_DFS_DEVFS /* SECTION: device filesystem */ //#define RT_USING_DFS //#define RT_USING_DFS_ELMFAT /* the max number of mounted filesystem */ //#define DFS_FILESYSTEMS_MAX 2 /* the max number of opened files */ //#define DFS_FD_MAX 4 /* the max number of cached sector */ //#define DFS_CACHE_MAX_NUM 4 /* SECTION: lwip, a lighwight TCP/IP protocol stack */ //#define RT_USING_LWIP /* LwIP uses RT-Thread Memory Management */ //#define RT_LWIP_USING_RT_MEM /* Enable ICMP protocol*/ //#define RT_LWIP_ICMP /* Enable UDP protocol*/ //#define RT_LWIP_UDP /* Enable TCP protocol*/ //#define RT_LWIP_TCP /* Enable DNS */ //#define RT_LWIP_DNS /* the number of simulatenously active TCP connections*/ //#define RT_LWIP_TCP_PCB_NUM 5 /* ip address of target*/ //#define RT_LWIP_IPADDR0 192 //#define RT_LWIP_IPADDR1 168 //#define RT_LWIP_IPADDR2 1 //#define RT_LWIP_IPADDR3 30 /* gateway address of target*/ //#define RT_LWIP_GWADDR0 192 //#define RT_LWIP_GWADDR1 168 //#define RT_LWIP_GWADDR2 1 //#define RT_LWIP_GWADDR3 1 /* mask address of target*/ //#define RT_LWIP_MSKADDR0 255 //#define RT_LWIP_MSKADDR1 255 //#define RT_LWIP_MSKADDR2 255 //#define RT_LWIP_MSKADDR3 0 /* tcp thread options */ //#define RT_LWIP_TCPTHREAD_PRIORITY 12 //#define RT_LWIP_TCPTHREAD_MBOX_SIZE 4 //#define RT_LWIP_TCPTHREAD_STACKSIZE 1024 /* ethernet if thread options */ //#define RT_LWIP_ETHTHREAD_PRIORITY 15 //#define RT_LWIP_ETHTHREAD_MBOX_SIZE 4 //#define RT_LWIP_ETHTHREAD_STACKSIZE 512 #endif ``` 我现在只加了kernel,finsh,和newlib的代码到里面 ![](http://www.rt-thread.org/phpBB3/download/file.php?mode=view&id=586&sid=d87071bad3cd17a2bb34dd191df0b70d) ![](http://www.rt-thread.org/phpBB3/download/file.php?mode=view&id=587&sid=d87071bad3cd17a2bb34dd191df0b70d)
li3p
2013-04-28
这家伙很懒,什么也没写!
这个问题现在还存在?直接取git的代码,用scons编译bsp/stm32f40x的工程, 下载到Stm32F4Discovery上,串口用sprintf打印的浮点数,直接就是%f字符串,没有解析出来。
撰写答案
登录
注册新账号
关注者
0
被浏览
12k
关于作者
020gzh
这家伙很懒,什么也没写!
提问
1
回答
3
被采纳
0
关注TA
发私信
相关问题
1
调用 stdio 库中的 snprintf 编译不通过。
2
使能C++ 后浮点数无法打印
3
printf打印浮点数,前半段时间有小数点,后面输出小数点没有了。
4
请问为什么sprintf 打印浮点数就会 hard fault...
5
printf 不支持浮点型格式化输出?
6
浮点数打印时,小数点变为 “uart”
7
关于rt_kprintf无法显示浮点数
8
怎么实现printf函数打印浮点数?
9
使能ulog打印浮点数后,进程崩溃
10
rt-thread printf打印信息(包含打印浮点型float)
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
2
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
3
RT-Thread EtherKit开源以太网硬件正式发布
4
如何在master上的BSP中添加配置yml文件
5
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
19
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部