RTT自带的rt_sprintf函数不支持浮点数,linux内核好像也不支持.用户一般调用编译器自带的库函数解决这个问题,需要注意的是直接使用它们很容易造成RTT跑飞.在使用之前需要关闭调度
例如:
- #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函数时处理的方法,同学们如有其它好办法,欢迎一起分享.