KEIL/MDK中的标准C库函数printf和malloc实现线程安全

这篇具有很好参考价值的文章主要介绍了KEIL/MDK中的标准C库函数printf和malloc实现线程安全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在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标准库函数

ARM编译器:线程不安全的C标准库函数文章来源地址https://www.toymoban.com/news/detail-402257.html

到了这里,关于KEIL/MDK中的标准C库函数printf和malloc实现线程安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MDK Keil查看map文件及编译占用内存信息、函数入口地址

    一、在哪里打开map文件查看 (1)第一种,在keil软件下,双击你的工程名,map就会弹出 (2)第二种,点击魔术棒,查看 Lis文件输出的位置入口 我的在output...文件下,那我们工程的文件夹下,找到output 二、查看map文件信息 (1)函数定义的位置信息 如图,这些你定义函数的

    2024年02月05日
    浏览(33)
  • 【STM32】Keil MDK 中的 Code、RO-data、RW-dat、ZI-data 是什么?分别放在哪里?

              C语言中有栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。 Code存放在ROM RO-data存放在ROM RW-dat存放在RAM ZI-data存放在RAM 单片机初始化时RW-data从flash拷贝到RAM 生成的map文件位于list文件夹下 (KE

    2024年02月11日
    浏览(32)
  • C语言中的字符串操作函数自定义实现:标准版与限定长度版

            目录 1. 标准字符串操作函数自定义实现 (a) 自定义strcpy函数 (b) 自定义strcat函数 (c) 自定义strcmp函数 2. 限定长度字符串操作函数自定义实现 (a) 自定义strncpy函数 (b) 自定义strncat函数 (c) 自定义strncmp函数  对字符串的操作是不可或缺的一部分。标准库提供了如strcpy、

    2024年01月21日
    浏览(43)
  • C语言printf函数实现解读

    gun官网链接 按照这些步骤可以顺利的下载gnu的c语言源码,接下去我们看看printf函数。 用vscode打开下载的源码,找到printf函数。 ( printf 函数路径为: glibc-2.36stdio-commonprintf.c ) 源码如下: 可以看见主要是四个东西: va_list   va_start   va_end   __vfprintf_internal 前面三个先不看

    2024年02月12日
    浏览(70)
  • 详解Leetcode中关于malloc模拟开辟二维数组问题,涉及二维数组的题目所给函数中的各个参数的解读

    最近博主一直再刷Leetcode上有关c语言的题目,有些题目第一步就将我卡死了。为什么呢?因为题目中所给的函数里的参数的具体含义我既然都不知道是什么意思。当然在请教了一些大佬后我也顺利解决了,不然也不会有人和你们分享了,哈哈哈~ 我就已一个典型的题目来介绍

    2024年02月08日
    浏览(30)
  • keil MDK 支持包快速下载

    MDK pack http://www.abov.co.kr/data/mds/PACK/ABOV.CM0_DFP.1.0.0.pack http://www.abov.co.kr/data/mds/PACK/ABOV.CM0_DFP.1.0.0.pack http://www.abov.co.kr/data/mds/PACK/ABOV.CM3_DFP.1.2.1.pack http://www.abov.co.kr/data/mds/PACK/ABOV.CM3_DFP.1.2.1.pack http://s3.asia.ambiqmicro.com/pack/AmbiqMicro.Apollo_DFP.0.9.2.pack http://s3.asia.ambiqmicro.com/pack/AmbiqMic

    2024年02月08日
    浏览(25)
  • MDK、Keil 5 界面主题优化

    找到MDK软件安装目录下的UV4文件夹下的global.prop文件,用记事本打开该文件,复制下面配置替换到global.prop文件里的所有内容,保存: 配置代码中某些设置项的作用,可自行更改 caret.back=#DEFEE6 #插入符号(光标)行的背景颜色 style.cpp.32=font:Courier New,size:10,fore:#000000,back:#FFFFFF

    2023年04月08日
    浏览(24)
  • Keil5 MDK新建项目工程

    一、新建工程框架 1.新建一个文件夹,命名为Template 2.点击 MDK 的菜单: Project –New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下,在这个目录下面建立子文件夹 USER( 我们的代码工程文件都是放在 USER 目录)工程命名为 Template,点击保存。 3.选择芯片型号(一定

    2024年02月08日
    浏览(46)
  • Keil(MDK-ARM)的安装与注册【MDK和C51共存】

      之前已经安装过用于51单片机开发的Keil C51,现在安装用于开发ARM Cortex-M系列内核的STM32单片机开发的Keil MDK开发环境,以及解决Keil C51与Keil MDK的共存问题。   如果要使C51和MDK共存,请先安装Keil C51,安装步骤请看我之前的文章:《Keil(C51)的安装与注册》。 (1)首先

    2024年02月06日
    浏览(34)
  • Keil MDK 5.36安装及和谐

    下载地址:https://www.keil.com/demo/eval/arm.htm,输入基本信息即可免费下载最新版本。 我是喜欢用比较新的版本,但不会用最新的,怕出问题当了小白鼠。一般来说新版本会改进一些老版本中存在的bug,当然也会放入若干新bug _ 。主要是新版本会增加一些新的功能。 安装路径默认

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包