stm32全局变量用法
在STM32嵌入式开发中,全局变量常用于多个函数或中断服务程序(ISR)之间共享数据。以下是其用法和注意事项的总结:
1. 全局变量的定义与声明
-
定义位置:在
.c文件顶部(函数外部)定义。// main.c uint32_t g_counter = 0; // 定义并初始化全局变量 -
跨文件访问:在头文件(
.h)或其它源文件中用extern声明。// main.h extern uint32_t g_counter; // 声明为外部变量
2. 关键注意事项
2.1 使用 volatile 关键字
- 场景:变量可能被中断或多线程环境修改时(如按键触发中断)。
- 作用:告诉编译器不要优化此变量,每次访问都从内存读取最新值。
volatile bool g_flag = false; // 中断可能修改的变量
2.2 数据竞争保护
-
中断与主程序共享数据:在读写全局变量时,临时关闭中断防止冲突。
// 主程序读取全局变量 __disable_irq(); // 关闭中断 uint32_t value = g_counter; __enable_irq(); // 恢复中断 -
RTOS环境:使用互斥锁(Mutex)或原子操作(如CMSIS的
__atomic函数)。
2.3 初始化
- 未显式初始化的全局变量默认值为
0,但建议显式初始化:uint8_t g_buffer[100] = {0}; // 显式初始化为0
3. 优化代码结构
-
减少全局变量数量:过多全局变量会增加耦合度,建议:
- 用结构体封装相关变量:
typedef struct { uint32_t counter; float voltage; } SensorData_t;
SensorData_t g_sensor; // 结构体全局变量
- 使用静态全局变量(`static`)限制作用域到当前文件: ```c static uint32_t s_internal_counter; // 仅在当前.c文件可见 - 用结构体封装相关变量:
4. 替代方案
- 局部变量传参:通过函数参数传递数据,减少全局变量依赖。
- 封装访问函数:通过函数控制读写,提高安全性:
// 封装获取全局变量的函数 uint32_t GetCounter(void) { uint32_t value; __disable_irq(); value = g_counter; __enable_irq(); return value; } - RTOS通信机制:使用消息队列、信号量或邮箱传递数据。
5. 错误示例与修复
-
错误:中断修改变量未用
volatile。bool g_flag = false; // 缺少volatile,可能导致优化问题 // 中断服务函数 void EXTI0_IRQHandler() { g_flag = true; // 主程序可能无法检测到变化 } - 修复:添加
volatile:volatile bool g_flag = false;
总结
- 适用场景:中断与主程序共享数据、频繁访问的配置参数。
- 避免滥用:优先使用局部变量或封装机制,提升代码可维护性。
- 关键操作:
volatile声明 + 中断保护/互斥锁。
你是不是也没躲过这个坑?用了太多全局变量......
全局变量太多有哪些弊端?该如何规避,以及如何管理全局变量等。一、全局变量太多有哪些弊端?真正做过项目的同学应该都能明白,项目中
2024-05-01 08:10:25
全局变量太多有哪些弊端?
随着全局变量的增多,不同模块的变量名可能会产生冲突或混淆,导致代码难以理解和维护。同时,全局变量使得代码中的依赖关系变得复杂,难以追踪和理解。这
2024-04-24 09:15:20
C语言开发单片机为什么大多数都采用全局变量的形式?
总的来说,对于大多数程序员来说全局变量可谓是又爱又恨。不用吧,很多场合下使用全局变量的确能够节省很多编码力气,毕竟可以减少函数间的参数及数据传递;用吧,很多时候对于多任务或者说多线程场景,必须考虑
资料下载
贾埃罗
2022-01-13 15:03:45
全局变量被未知原因改变的解决方法
在开发的过程中总会碰到一些奇怪的问题,仿真的时候一看,发现是某个全局变量被莫名其妙改变了,导致整个函数判断都出了问题。全局变量可能会被改变的原因有以下几点:1.自己改的(废话~):好好查看这个
资料下载
goodmbby
2021-12-20 18:47:41
LABVIEW初级教程之局部变量与全局变量的示例程序合集免费下载
本文档的主要内容详细介绍的是LABVIEW初级教程之局部变量与全局变量的示例程序合集免费下载
资料下载
佚名
2020-01-16 10:23:23
在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决
本文档的主要内容详细介绍的是在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决。
资料下载
鼠爱米
2019-08-20 17:31:00
全局变量与全局访问之间的差异
简单说,全局变量、局部变量是变量自身的身份。身份的不同是靠出生地决定的。而能否被全能局访问,能被多大范围空间访问,即首篇文章中讲到的作用域,是完
2022-11-14 11:21:02
用个简单demo实现对全局变量的管理
在项目中基本都会遇到全局变量,随便放很容易忘记变量的使用,也不方便后续的阅读,就需要对全局变量进行统一管理,下面就用个简单demo,实现对
2022-11-10 11:01:44
从STM32到CONST的全局变量
STM32的const全局变量地址 程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int
2021-07-23 10:50:19
分析如何远离漫天飞舞的全局变量
刚刚开始用C或者其他面向对象编程语言(比如C++)的小伙伴们,常常在一个项目里为了图省事,整了很多全局对象、全局变量满天飞,这样做其实是有很多弊端,本文来聊聊这个话题。 先谈谈
2020-09-15 13:49:30
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览