Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
浮点数打印
使用sprintf函数格式化浮点数的安全问题
发布于 2012-05-17 12:40:44 浏览:10257
订阅该版
RTT自带的rt_sprintf函数不支持浮点数,linux内核好像也不支持.用户一般调用编译器自带的库函数解决这个问题,需要注意的是直接使用它们很容易造成RTT跑飞.在使用之前需要关闭调度 例如: ```c #include
#include
int usr_sprintf(char *buf, const char *format, ...) { int n; va_list arg_ptr; if(rt_thread_self() != RT_NULL) rt_enter_critical(); va_start(arg_ptr, format); n = vsprintf(buf, format, arg_ptr); va_end(arg_ptr); if(rt_thread_self() != RT_NULL) rt_exit_critical(); return n; } ``` 经过测试,未关闭调度之前,线程被打断再恢复之后,格式化的数据可能是一些乱码,甚至程序跑飞了.如果使用这个字符串很容易死机,主要是data abort异常.加入关闭调度之后,能够得到正确的格式化字符串,在频繁操作时也没有再发生死机现象. 综述,在使用安全性不明确的函数时关闭调度是个简单可行的方法,丧失一点性能,换来高可靠性,在实践中是可行的. 以上就是我使用sprintf函数时处理的方法,同学们如有其它好办法,欢迎一起分享. ![test.PNG](/uploads/1044_7798eee5f7738856910ab70ffa81d64b.png)
查看更多
19
个回答
默认排序
按发布时间排序
prife
2012-05-17
这家伙很懒,什么也没写!
换个方式试试sprintf函数。 比如要格式化 float x = 2.1234; sprintf(buf, "%d.%4d", (int)x, (int)(x*10000)); 可否这样再试试是否还崩溃呢?
bernard
2012-05-17
这家伙很懒,什么也没写!
貌似不应该啊,能给出测试代码、复现步骤吗?
amsl
2012-05-17
这家伙很懒,什么也没写!
说的是出错的情况吗, 嗯,我在使用sprintf很少时是不会出错,以前几乎没有碰到过问题.最近在一个线程中使用了大量的sprintf函数格式化浮点数到一个缓冲中然后再处理,问题就来了,有事偶尔会data abort,有是RTT也当掉,经过跟踪,只要不使用sprintf函数就没问题. 我也不清楚出错的原因,老大帮忙分析下.
bernard
2012-05-17
这家伙很懒,什么也没写!
你的是S3C2440,ARM9平台? 出错后有什么log吗,我们现在都是在出错后,把当前任务列表打印出来、寄存器情况打印出来形成log,这样利于分析问题。
xiao苦
2012-05-17
这家伙很懒,什么也没写!
我星期一的时候也碰到过。 sprintf输出浮点数是会出错的,会被更高的优先级的任务打断,使得要转换的值变成其他的值。 后来是自己编个转换函数替代掉了。 环境MDK.
amsl
2012-05-17
这家伙很懒,什么也没写!
平台是S3C2440 其中一个错误结果如下 Execption: r00:0x3051211c r01:0x30512e9c r02:0x243ce655 r03:0x30512f60 r04:0x80000033 r05:0x30512100 r06:0x60000013 r07:0x00000000 r08:0x00000000 r09:0x00000000 r10:0x00000000 fp :0x00000000 ip :0x600000d3 sp :0x30502b88 lr :0x30513318 pc :0x30513318 cpsr:0x20000013 data abort thread - graph stack: thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- rs232 5 suspend 116 1024 120 5 -4 graph 6 ready 576 4096 696 2 0 main 5 suspend 212 4096 680 1 0 cpld 7 ready 196 1024 232 10 -2 server 3 suspend 132 8192 700 2 0 led 30 suspend 108 256 108 5 0 bell 5 suspend 108 512 108 5 0 tidle 31 ready 68 256 68 21 0 timer 4 suspend 84 1024 84 10 0 tshell 10 suspend 116 2048 116 5 0 shutdown... 还有一个情况是当机,所有没有任何提示, 还有一个情况是自动复位,这种情况明显是程序跑飞了. 下面附图我的应用情况,在一个缓冲区快速构图: [attach]1011[/attach]
prife
2012-05-17
这家伙很懒,什么也没写!
>说的是出错的情况吗, >嗯,我在使用sprintf很少时是不会出错,以前几乎没有碰到过问题.最近在一个线程中使用了大量的sprintf函数格式化浮点数到一个缓冲中然后再处理,问题就来了,有事偶尔会data abort,有是RTT也当掉,经过跟踪,只要不使用sprintf函数就没问题. >我也不清楚出错的原因,老大帮忙分析下. --- 不对啊,如果是printf函数可能会崩溃,sprintf不应该啊。难道是浮点库的问题?
bernard
2012-05-17
这家伙很懒,什么也没写!
这两个点分别是什么呢: lr :0x30513318 pc :0x30513318 刚才prife也提到了一个,是否是sprintf使用了静态变量,因为抢占导致其中一些数据未能够得到保护,例如抢占后的任务也使用了sprintf函数。而sprintf在MDK中是多线程环境不安全的?
amsl
2012-05-17
这家伙很懒,什么也没写!
在使用sprintf之前关闭调度就没有问题,显然浮点库没有问题啊,我应用中一秒钟刷30fps,估计1秒钟调用sprinf的次数很高,所有出错几率就高了,用的少的话,几乎发现不了它.
amsl
2012-05-17
这家伙很懒,什么也没写!
在多个线程下同时使用sprintf是不可避免,估计想bernard说的,sprintf多次被抢占,有些数据没有保存下来,我没有使用静态数据,都是使用临时变量
撰写答案
登录
注册新账号
关注者
0
被浏览
10.3k
关于作者
amsl
这家伙很懒,什么也没写!
提问
12
回答
137
被采纳
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】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
7
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
张世争
1
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
2
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部