当前位置: 首页 > news >正文

广州网站建设哪家公司推广一手渠道

广州网站建设哪家公司,推广一手渠道,网站企业业务员怎么做,廊坊seo关键字排名在STM32中,优先使用的原子操作主要包括‌位带操作‌、‌LDREX/STREX指令‌以及‌CMSIS提供的原子操作宏‌,以下是具体实现方式‌12:1. ‌位带操作(Bit-Banding)‌通过硬件直接对单个比特进行原子读写,适用于…

在STM32中,优先使用的原子操作主要包括‌位带操作‌、‌LDREX/STREX指令‌以及‌CMSIS提供的原子操作宏‌,以下是具体实现方式‌12:


1. ‌位带操作(Bit-Banding)

通过硬件直接对单个比特进行原子读写,适用于GPIO或寄存器位操作‌1:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr)  *((volatile uint32_t *)(addr))// 原子设置GPIOB的PIN5为高电平
MEM_ADDR(BITBAND(&GPIOB->ODR, 5)) = 1;

2. ‌LDREX/STREX指令

基于Cortex-M的独占访问指令,适用于共享变量修改‌23:

volatile uint32_t shared_var = 0;void atomic_increment(void) {uint32_t val;do {val = __LDREXW(&shared_var);  // 独占加载val += 1;} while (__STREXW(val, &shared_var));  // 独占存储,失败则重试__CLREX();  // 清除独占标记
}

3. ‌CMSIS原子操作宏

CMSIS库提供的封装宏,如ATOMIC_SET_BITATOMIC_MODIFY_REG‌24:

#include "core_cm4.h"// 原子设置USART1的CR1寄存器第3位
ATOMIC_SET_BIT(USART1->CR1, USART_CR1_TXEIE);// 原子修改TIM2的CCER寄存器
ATOMIC_MODIFY_REG(TIM2->CCER, TIM_CCER_CC1E, 0x1);
#include "core_cm4.h"// 原子设置USART1的CR1寄存器位
ATOMIC_SET_BIT(USART1->CR1, USART_CR1_TXEIE);// 原子修改变量
uint32_t val = 0;
ATOMIC_MODIFY_REG(val, 0xFF, 0x55);  // 将低8位改为0x55

4. ‌GPIO的BSRR寄存器

通过置位/复位寄存器实现GPIO的原子操作‌1:

// 原子设置PB5高电平、PB6低电平
GPIOB->BSRR = (1 << 5) | (1 << (6 + 16));

 ‌临界区保护

HAL库提供__disable_irq()__enable_irq()函数,可临时禁用中断实现原子性‌

volatile uint32_t counter = 0;void atomic_increment(void) {__disable_irq();  // 进入临界区counter++;        // 原子操作__enable_irq();   // 退出临界区
}

代码实现示例

以下是一个综合示例,展示原子操作在多线程环境中的应用‌35:

atomic_ops.c

已完成

此代码演示了计数器原子递增和GPIO标志位原子设置,适用于中断与主程序共享数据的场景‌1


#include "stm32f4xx.h"
#include "core_cm4.h"volatile uint32_t counter = 0;// 使用LDREX/STREX原子递增
void atomic_counter_inc(void) {uint32_t val;do {val = __LDREXW(&counter);val++;} while (__STREXW(val, &counter));__CLREX();
}// 使用CMSIS宏原子设置标志位
void atomic_flag_set(volatile uint32_t *reg, uint32_t bit) {ATOMIC_SET_BIT(*reg, bit);
}int main(void) {atomic_counter_inc();atomic_flag_set(&GPIOA->ODR, 5);return 0;
}


#include "stm32f4xx.h"
#include "core_cm4.h"volatile uint32_t global_var = 0;  // 待修改的全局变量void atomic_write(uint32_t new_value) {uint32_t current_val;do {current_val = __LDREXW(&global_var);  // 独占加载当前值} while (__STREXW(new_value, &global_var));  // 尝试写入新值,失败则重试__CLREX();  // 清除独占标记(防止后续LDREX受影响)
}int main(void) {atomic_write(0x12345678);  // 原子写入新值while(1);
}

http://www.dtcms.com/a/484360.html

相关文章:

  • 如何做好购物网站北京seo薪资
  • 公司网站建设技术的发展wordpress建立网站
  • 网站建设和网络维护网站模板 电器
  • 建企业版网站多久网站开发有专利吗
  • 做淘客网站 名字医疗网站怎么做推广
  • 大学生创业做网站深圳网页制作培训
  • ps拼合网站截图怎么做整合营销公司
  • 自己创建网站怎么赚钱中国建设银行网站荆门网点查询系统
  • 濮阳新闻综合频道网站wordpress输密码访问
  • 做网站注意哪方面工作中网页开发方案
  • 网站建设中目录是什么意思开发公司空置房拨款合同
  • whois哪个网站好ps网页设计步骤及方法
  • 苏州建筑行业网站建设wordpress撤销更改
  • 什么网站可以接装修活楼盘建设信息网站
  • 广州网站开发十度网络最好南昌手机网站
  • 红黑树-带源码
  • 如何知道一个网站是用什么做的网站稳定期的推广
  • 用二级域名做网站推介网app
  • 【Linux内核】Linux 内核开发模式演变:从硬编码到设备树驱动配置
  • 【Linux】Linux进程概念(一)
  • 怎么给网站做广告专做运动品牌的网站
  • 宝塔建设的网站火车头发布失败湖南建筑行业
  • 做网站哪个好湖南省建设工程施工合同示范文本
  • 网站做成响应式的有什么弊端简单安卓app开发
  • 网站开发和移动开发购买帝国cms做网站代理
  • 做個app网站价格网站平台建设公司经营范围
  • linux网站建设技术指南 pdf注册岩土工程师
  • 网站建设所需人力网站制作公司 云南
  • 计算机中浮点数的存储
  • 电子电气架构 --- 车载操作系统Android