四、e2studio VS STM32CubeIDE之STM32CubeIDE线程安全解决方案

目录

一、概述/目的

二、原因和办法

三、线程安全问题的描述

四、STM32解决方案

4.1 通用策略

4.2 RTOS策略

4.3 策略的讲解

4.3.1 裸机应用(策略2、3)

4.3.2 RTOS应用(策略4、5)

五、关键源码


四、e2studio VS STM32CubeIDE之STM32CubeIDE线程安全解决方案

一、概述/目的

  • 继续嵌入式科普(6)话题分享

  • 介绍STM32CubeMX和STM32CubeIDE实现的线程[安全解决方案]

  • 同时强调线程安全的[重要性]:裸机和RTOS都可能存在;MDK、 EWARM、STM32CubeIDE都可能存在

  • [资料来源]:AN5731:STM32CubeMX and STM32CubeIDE thread-safe solution:
    https://www.st.com/content/ccc/resource/technical/document/application_note/group2/de/c7/d1/5c/ca/34/4c/bc/DM00826986/files/DM00826986.pdf/jcr:content/translations/en.DM00826986.pdf

二、原因和办法

  • 线程安全问题的根本原因在于多个线程同时访问共享数据时可能导致数据不一致,

  • 处理办法是使用同步机制(如互斥锁、信号量)确保在同一时刻只有一个线程可以访问共享数据

三、线程安全问题的描述

  • RTOS应用:RTOS中的两个线程或任务或一个中断服务例程(ISR)

  • 裸机应用:主线程被ISR中断,这也被视为第二个执行线程

  • malloc()、free()、printf()、strtok()....

  • usb class、网络编程、算法....

  • 链表....

图片

图片

四、STM32解决方案

  • c库重定向

图片

  • stm32_lock.h、newlib_lock_glue.c(dlib_lock_glue
    .c、armlib_lock_glue.c)、stm32_lock_user.h

  • 4中策略5个设定

图片

4.1 通用策略

  • 通用策略#1:自定义实现。
    如果在STM32CubeMX中禁用了FreeRTOS™,则会自动选择策略#2。
    如果在STM32CubeMX中启用了FreeRTOS™,则会自动选择策略#4。

  • 通用策略#2:允许从中断中使用锁。

  • 通用策略#3:拒绝对中断使用锁。

4.2 RTOS策略

  • FreeRTOS策略#4:允许来自中断的锁使用。

  • FreeRTOS策略#5:拒绝来自中断的锁使用。

图片

4.3 策略的讲解

4.3.1 裸机应用(策略2、3)

图片

图片

4.3.2 RTOS应用(策略4、5)

图片

图片

图片

五、关键源码

The Red Hat newlib C Library:
https://sourceware.org/newlib/libc.html

#elif STM32_THREAD_SAFE_STRATEGY == 2
/** Allow lock usage from interrupts.*//* Private defines ---------------------------------------------------------*/
/** Initialize members in instance of <code>LockingData_t</code> structure */
#define LOCKING_DATA_INIT { 0, 0 }/* Private typedef ---------------------------------------------------------*/
typedef struct
{uint8_t flag; /**< Backup of PRIMASK.PM at nesting level 0 */uint8_t counter; /**< Nesting level */
} LockingData_t;/* Private functions -------------------------------------------------------*//*** @brief Initialize STM32 lock* @param lock The lock to init*/
static inline void stm32_lock_init(LockingData_t *lock)
{STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(lock);lock->flag = 0;lock->counter = 0;
}/*** @brief Acquire STM32 lock* @param lock The lock to acquire*/
static inline void stm32_lock_acquire(LockingData_t *lock)
{uint8_t flag = (uint8_t)(__get_PRIMASK() & 0x1); /* PRIMASK.PM */__disable_irq();__DSB();__ISB();STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(lock);if (lock->counter == 0){lock->flag = flag;}else if (lock->counter == UINT8_MAX){STM32_LOCK_BLOCK();}lock->counter++;
}/*** @brief Release STM32 lock* @param lock The lock to release*/
static inline void stm32_lock_release(LockingData_t *lock)
{STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(lock);if (lock->counter == 0){STM32_LOCK_BLOCK();}lock->counter--;if (lock->counter == 0 && lock->flag == 0){__enable_irq();}
}

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291415.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot简介及案例

文章目录 Spring Boot简介以下是一个简单的 Spring Boot Web 应用实例**步骤 1&#xff1a;创建 Spring Boot 项目****步骤 2&#xff1a;编写 RESTful 控制器****步骤 3&#xff1a;配置主类****步骤 4&#xff1a;运行并测试应用** Spring Boot简介 Spring Boot 是一个用于简…

怎么让ChatGPT批量写作原创文章

随着人工智能技术的不断发展&#xff0c;自然语言处理模型在文本生成领域的应用也日益广泛。ChatGPT作为其中的佼佼者之一&#xff0c;凭借其强大的文本生成能力和智能对话特性&#xff0c;为用户提供了一种高效、便捷的批量产出内容的解决方案。以下将就ChatGPT批量写作内容进…

【AI】命令行调用大模型

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【AI】命令行调用大模型引入正文初始化项目撰写脚本全局安装 成果展示 【AI】命令…

Ubuntu20.04LTS+uhd3.15+gnuradio3.8.1源码编译及安装

文章目录 前言一、卸载本地 gnuradio二、安装 UHD 驱动三、编译及安装 gnuradio四、验证 前言 本地 Ubuntu 环境的 gnuradio 是按照官方指导使用 ppa 的方式安装 uhd 和 gnuradio 的&#xff0c;也是最方便的方法&#xff0c;但是存在着一个问题&#xff0c;就是我无法修改底层…

亚信安全联合人保财险推出数字安全保障险方案,双重保障企业数字化转型

数字化发展&#xff0c;新兴技术的应用与落地带来网络攻击的进一步演进升级&#xff0c;同时全球产业链供应链融合协同的不断加深&#xff0c;更让网络威胁的影响范围与危害程度不断加剧。 企业单纯依靠自身安全能力建设&#xff0c;能否跟上网络威胁的进化速度&#xff1f;能否…

Day49:WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行

目录 文件-解析方案-目录执行权限&解码还原 目录执行权限 解码还原 文件-存储方案-分站存储&OSS对象 分站存储 OSS对象存储 知识点&#xff1a; 1、文件上传-安全解析方案-目录权限&解码还原 2、文件上传-安全存储方案-分站存储&OSS对象 文件-解析方案-目…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a;【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 Jupyter代码片段1&#xff1a;简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

深入解析快速排序算法

深入解析快速排序算法 一、快速排序算法简介二、快速排序算法过程三、快速排序算法示例四、快速排序算法分析1. 时间复杂度&#xff1a;2. 空间复杂度&#xff1a;3. 稳定性&#xff1a; 五、快速排序算法优化1. 优化基准元素的选择&#xff1a;2. 优化小数组的排序&#xff1a…

WIFI驱动移植实验:WIFI从路由器动态获取IP地址与联网

一. 简介 前面两篇文章&#xff0c;一篇文章实现了WIFI联网前要做的工作&#xff0c;另一篇文章配置了WIFI配置文件&#xff0c;进行了WIFI热点的连接。文章如下&#xff1a; WIFI驱动移植实验&#xff1a;WIFI 联网前的工作-CSDN博客 WIFI驱动移植实验&#xff1a;连接WIF…

工业镜头常用参数之实效F(Fno.)和像圈

Fno. 工业镜头中常用到的参数F&#xff0c;有时候用F/#&#xff0c;Fno.来表示&#xff0c;指的是镜头通光能力的参数。它可用镜头焦距及入瞳直径来表示&#xff0c;也可通过镜头数值孔径&#xff08;NA&#xff09;和光学放大倍率&#xff08;β&#xff09;来计算。有效Fno.…

【御控物联】JavaScript JSON结构转换(11):数组To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

VOC(客户之声)赋能智能家居:打造个性化、交互式的未来生活体验

随着科技的飞速发展&#xff0c;智能家居已成为现代家庭不可或缺的一部分。然而&#xff0c;如何让智能家居更好地满足用户需求&#xff0c;提供更贴心、更智能的服务&#xff0c;一直是行业关注的焦点。在这个背景下&#xff0c;VOC&#xff08;客户之声&#xff09;作为一种用…

Java NIO详解

一、概念 NIO, 即new io&#xff0c;也叫非阻塞io 二、NIO三个核心组件&#xff1a; Buffer数据缓冲区Channel通道Selector选择器 1、Buffer缓冲区 缓冲区本质上是一个可以存放数据的内存块&#xff08;类似数组&#xff09;&#xff0c;可以在这里进行数据写入和读取。此…

git 修改历史 commit message

目录 1&#xff0c;修改当前的2&#xff0c;修改历史的1&#xff0c;先查看 log2&#xff0c;开始修改 3&#xff0c;其他注意点1&#xff0c;中途不想修改了2&#xff0c;commit ID 会发生变化3&#xff0c;推送远程4&#xff0c;精准定位 1&#xff0c;修改当前的 直接使用下…

Linux实现m4a格式转换为wav格式

需要在linux上安装ffmpeg 参考博客 Linux上安装ffmpeg修改环境变量【这一点很重要&#xff0c;自己因为没有添加环境变量&#xff0c;捣鼓了很长时间】 将ffmpeg的绝对路径添加到 PATH 环境变量中&#xff0c;以让系统能找到ffmpeg的安装路径。 # /home//project/ffmpeg-6.1-a…

三个表的联合查询的场景分析-场景4:c表维护a和b表的id关联关系(一对多)

基础SQL演练&#xff0c;带详细分析&#xff0c;笔记和备忘。 目录 背景介绍 表数据 需求1&#xff1a;查询g表所有记录&#xff0c;以及关联的h的id 需求2&#xff1a;在需求1基础上&#xff0c;查出关联的h的其它字段&#xff08;name&#xff09; 需求3&#xff1a;在需…

【排序算法】希尔排序

文章目录 &#x1f4dd;希尔排序( 缩小增量排序 )&#x1f320;分组思想&#x1f320;缩小增量的过程&#x1f320; 排序步骤&#x1f309;希尔排序的特性总结&#xff1a; &#x1f6a9;总结 &#x1f4dd;希尔排序( 缩小增量排序 ) 希尔排序是一种经典的排序算法&#xff0c…

Java复习第十三天学习笔记(HTML),附有道云笔记链接

【有道云笔记】十三 3.29 HTML https://note.youdao.com/s/Ru3zoNqM 一、基本标签 HTML:超文本标记语言 定义页面结构 CSS&#xff1a;层叠样式表 页面显示的样式、排版 BootStrap JS: JavaScript 界面交互(动态交互、逻辑) JQuery <!DOCTYPE html> <html> &l…

体育馆场地预约系统项目管理

1 前言 体育馆作为提供体育活动设施的重要场所&#xff0c;其使用和管理效率对于满足公众需求、提高体育活动质量具有重要意义。然而&#xff0c;传统体育馆场地预约方式仍然存在流程繁琐、效率低下等问题&#xff0c;已无法满足现代社会的需求。旨在提高体育馆的预约和管理效率…

WebGIS开发

1.准备工作 高德开发API注册账号&#xff0c;创建项目拿到key和密钥 高德key 2.通过JS API引入高德API <html><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><metaname&quo…