在ARM嵌入式开发中,编译器提供的C库函数有一部分不是线程安全的。
如果项目中运行了第三方RTOS,在调用标准C库函数时就要关心它们是不是线程安全的。
比如printf函数,它是可重入的函数,但是在多线程环境下打印的内容可能会交叉乱序。
当然这种问题还不算严重。
但如果调用库函数malloc,这个函数在RTOS环境下多线程调用则会引发堆数据结构异常。
那么有没有办法让C库标准函数实现线程安全呢?
经过查阅文档,在KEIL/MDK中确实存在这么一种方法,可以实现malloc线程安全。
在KEIL/MDK的标准库中提供了一组可重载的互斥锁函数,我们可以自行实现这一组函数,来保证C库函数线程安全。
函数原型和参考实现代码如下:
//创建互斥锁,成功返回1,失败返回0
int _mutex_initialize(mutex *m)
{
*m = mutex_create(); /* 调用RTOS提供的函数,创建锁 */
return 1;
}
//获取互斥锁(加锁操作)
void _mutex_acquire(mutex *m)
{
mutex_lock(*m); /* 调用RTOS提供的函数,加锁 */
}
//释放互斥锁(解锁操作)
void _mutex_release(mutex *m)
{
mutex_unlock(*m); /* 调用RTOS提供的函数,解锁 */
}
//删除互斥锁
void _mutex_free(mutex *m)
{
mutex_delete(*m); /* 调用RTOS提供的函数,删除锁 */
}
需要注意的是,重载以上互斥锁函数后,要确保调用C库函数的时机一定要晚于RTOS的初始化。
KEIL官方参考资料:
ARM编译器:重载互斥锁实现C库函数线程安全
ARM编译器:线程安全的C标准库函数文章来源:https://www.toymoban.com/news/detail-402257.html
ARM编译器:线程不安全的C标准库函数文章来源地址https://www.toymoban.com/news/detail-402257.html
到了这里,关于KEIL/MDK中的标准C库函数printf和malloc实现线程安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!