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

本文详细介绍了STM32CubeIDE在实现线程安全方面的策略,包括通用策略和针对RTOS的两种策略,以及如何在STM32CubeMX中启用或禁用这些策略,通过示例和关键源码探讨了如何处理线程安全问题。
摘要由CSDN通过智能技术生成

目录

一、概述/目的

二、原因和办法

三、线程安全问题的描述

四、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();
  }
}

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值