单片机全局变量的使用

【STM32单片机入门-1】堆栈/全局变量,局部变量,静态全局变量,局部静态变量等 分配内存是分配在栈存储区上的,其作用域也只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,该变量的生命周期也只是和该函数同在。分配的内存也是在静态存储内存上的,其第一次初始化后就一直存在直到程序结束,该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。全局静态变量 (static):分配的内存与全局变量一样,也是在静态存储内存上,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用,首先,我们逐一回答您的问题。分配的,所以它们指向的地址是在堆空间中的。 阅读详情

我们都知道有一个规则,那就是尽量不要使用全局变量,但自己写程序,有时感觉使用全局变量很方便,而且并没感到有什么缺点。

将网上查的的资料总结一下,发现全局变量的缺点主要有两个,其它具体的危害一般都是这两个的具体的显现。

全局变量缺点:

1.全局变量存在周周期长,将会占用更多的内存。

2.全局变量多处被调用,使全局变量的值变得不确定。

(1)用全局变量会增加程序的耦合性,会有一定移植麻烦,代码重用率低。

(2)全局变量,使用和更改他的地方多了以后,各个地方逻辑关系难以确定。

(3)过多的全局变量,大大降低程序的可读性,可维护性。

(4)容易造成命名冲突 

 

其实,全局变量是不可避免要用到的,比如说温度采集,我们将传感器送回来的数据处理后必须放在一个全局变量里。然后要使用它时,直接从全局变量中取便可以了。

因为C语言中函数return只能放回一个值,使用全局变量便可以返回多个值,但这并不合适,因为这占空间,减慢了运算速度,又增加了这个函数的耦合性。可以定义数组,返回指针的方式传递多个参数。如果不希望改变原参数值,使用const限制指针。

所以,传递参数不要用全局变量,可以使用指针。而像显示缓冲区,数据采集子程序,通信缓冲区。这样的地方,全局变量是不可避免要用到的。

 

为什么呢?因为这些地方都有同一个特点。想一想,单片机的寄存器相当于全局变量吗?

寄存器易变的,外部事件可改变。但一般只有一种事件可以改变它,而其它的地方使用但改变他的数值。

可见,如果全局变量只有一处改变它,只要内存够,就可以大胆使用它。

但无论如何全局变量使用多了,都会感觉程序混乱。

 

使用全局变量的好习惯

1.如果只有某.c文件用,就static到该文件中;如果只有一个函数用,那就static到函数里面去;

2尽量把变量的作用范围控制在使用它的模块里面,如果其他模块要访问,就开个读或写函数接口出来,严格控制访问范围。(就是利用.h文件#include)

3.当一个模块里面的全局变量超过3个(含)时,就用结构体包起来吧。要归0便一起归0,省得丢三落四的。

4.如果一定要用全局变量,请遵守命名规范,比如在前面加"g_", 以防造成命名冲突。

5.小程序结构简单,即使使用全局变量也方便管理。

 

 

这还有一句话,“每一个设备底层几乎都需要它来记录当前状态,控制时序,起承转合。”从网上看到的,但还是不太理解其中的意思。

单片机 C 语言中全局变量的使用与 extern 而 extern 关键字则允许在不同的源文件中引用已经定义的全局变量,提高了代码的模块化和可重用性。在 C 语言中,使用 extern 关键字可以声明一个全局变量,使其能够被其他文件中的函数所引用。在这种情况下,如果要在一个源文件中引用另一个源文件中定义的全局变量,就需要使用 extern 关键字。在 C 语言中,全局变量的定义需要在所有函数之外进行,通常在文件的开头部分。从输出结果可以看出,全局变量的值在不同的函数中是共享的,修改一次后,其他函数中对该变量的访问也会受到影响。函数中,我们按顺序调用了。 阅读详情

相关推荐

单片机开发怎么避免使用全局变量

摘要:单片机开发中应谨慎使用全局变量以避免代码耦合和内存问题。核心原则是将变量作用域最小化,优先采用局部变量+传参、模块内静态变量、结构体封装等方法替代全局变量。对于必要共享数据(如中断与主循环通信),需使用static volatile变量并加临界区保护。同时需注意单片机资源限制,避免大栈变量,慎用动态内存。通过合理封装和限定作用域,可提升代码可靠性和可维护性。

qq_37999850的博客 216

如何在单片机上使用全局变量

如何在单片机上使用全局变量 在单片机中经常会遇到二个不同的.c文件需要使用同一个变量,但如何定义一个变量可以在不同的.c文件中使用呢? 当然是使用全局变量啦,可能有的人知道需要用extern来声明变量,当时总是编译错误,当然啦,我也是经常错误,才写这个笔记的啊 下面我先介绍一下怎么正确的使用,在贴几张错误使用全局变量的方法 如何正确的使用extern,实现main.c led.c同时使用...

qq_39483110的博客 4448

ENVI 5.6 + Sarscape 5.2 保姆级教程:哨兵一号数据处理全流程(含DEM自动下载)

本文提供ENVI 5.6与Sarscape 5.2处理哨兵一号数据的完整实战教程。详细介绍了从数据导入、研究区裁剪、DEM自动下载与集成,到核心的配准、滤波及地理编码全流程,最终生成可用于定量分析的地理编码后向散射系数图。重点演示了DEM数据在SAR处理中的关键作用与自动获取方法,帮助用户快速掌握SAR数据基础处理技能。

coffee的博客 682

STM32单片机extern全局变量

原文链接:http://www.elecfans.com/emb/danpianji/20181101807234.html 当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办? 如果你把temple定义在A中,然后让A.h和B.h包含在includes.h中,然后把includes.h放在A.c和B.c中单个编译是没有问题的,但是链接的时候会出现问题, “Symbol tem

weixin_44259607的博客 9820

深入解析SOC芯片设计中DFT OCC与ATPG的协同优化策略

本文深入探讨了在复杂SOC芯片设计中,DFT(可测试性设计)的核心组件OCC(片上时钟控制器)与ATPG(自动测试向量生成)的协同优化策略。文章从基本原理出发,分析了OCC作为测试时钟管理者的关键作用,以及ATPG作为故障检测引擎的工作机制,并重点阐述了二者在测试架构选择、参数对齐、低功耗测试等场景下的协同方法与实战技巧,旨在实现更高的测试覆盖率与更低的测试成本。

efc123456的博客 1035

Clawdbot完 整安装与使⽤指南(保姆级教程)

Clawdbot 是⼀款开源个⼈ AI 智能体(Personal AI Agent),核⼼优势为本地部署+系统级执⾏+全渠道交互,可通过聊天⼯具(Telegram/WhatsApp 等)下达指令,⾃动完成⽂件整理、代码部署、⽇程同步等任务,所有数据本地存储,隐私零泄露。截⾄2026年 1 ⽉,GitHub 星标突破 4 万+,⽀持 Windows/Mac/Linux/云服务器多平台。

A1609926242的博客 1612

单片机开发项目全局变量太多怎么管理?

单片机开发项目全局变量太多怎么管理?

分享平时的学习心得和笔记 883

Windows环境下ABAQUS、Fortran 编译器及Visual Studio的安装和关联

点击Continue,在随后的弹窗中勾选accept,并点击Customize(注意,在接下来的安装图片中,显示的版本号是2024.2,图片来自于一次失败的安装,懒得再截图了,步骤毫无区别,请见谅)。在下一步中,保持默认选项,之后软件会自动关联到刚才安装到visual studio,随后下一步进行安装(如果电脑中已经安装有其他版本的visual studio,则只保留2022)。在随后的弹窗中,根据指示找到。以防万一,尽量暂时退出所有杀毒软件,关闭防火墙,一般不会有影响,为确保万无一失,可以执行此步。

samurai12的博客 9962

在单片机开发中,C语言为什么经常使用全局变量?

在单片机开发中,C语言为什么经常使用全局变量?

分享平时的学习心得和笔记 947

Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)

本文介绍基于 Spring Boot AI 集成阿里云 OSS 与 DashScope 语音识别 API 的高效语音识别系统。该系统通过云端存储音频文件,解决传统本地存储的性能瓶颈与存储压力,支持同步 / 异步语音转文本,实现文件自动生命周期管理。文中详述技术选型、架构设计、核心代码实现(含前后端及配置)、部署流程,展现其高并发处理、可靠文件管理能力,适用于客服、教育等企业级场景,为语音识别应用提供实用解决方案。

博客 1537

修改yolov8使支持单通道图像输入

默认支持BGR三通道图像输入,但是在很多工业场景下,存在很多灰度图像的场景,因此对yolov8代码做一些修改以支持单通道图像输入,满足项目实际需求。训练时,只需要在 data 的 yaml 文件中,添加 ch=1 即可。

mingo_敏 5779

关于STM32单片机编程中大量使用全局变量而非使用函数调用的一些思考

本文对比分析了STM32单片机开发中两种多任务实现方式(freeRTOS和裸机+定时器)的编程特点。发现两种方式都采用"全局变量+读写函数"的任务架构,任务间直接通过读取全局变量通信而非接口函数。作者认为这种做法在嵌入式开发中更便捷:1)减少接口函数定义调用复杂度;2)便于IDE调试时观察变量;3)符合"代码是数据处理器"的本质,各任务循环运行产生不同全局变量值,这些值既代表代码执行路径也反映实际事件状态。这种全局变量驱动的方式在代码量不大的嵌入式系统中具有实用优势。

duanjianbo3330的专栏 196

人工智能训练师(三级)操作技能考核·自测卷

为您定制了一份。这份试卷严格拆分了“业务分析”、“智能训练”、“智能系统设计”、“培训与指导”四大模块,所有填空题均来源于上一轮整理的。您可以先用它进行“第二步(抛开答案自己填)”,填完后对照末尾的答案速查进行“第一步(补全并运行)”的校验,最后标记错题进行“第三步(针对性重复练习)”。

suny8088的博客 105

单片机全局变量和局部变量的使用

全局变量是存在RAM中的,而局部变量是存在堆栈中的   全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。 在MSP430中,局部变量如果不多,就会分配r4-r15的寄存器,如果数量大就会用压栈处理。   全局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的

chinseeker 2614

嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法

STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。

snmplink的博客 8556

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于C语言全局变量的定义和用法,关于C语言全局变量的定义和用法

在单片机编程中经常会用到全局变量,假设要在a.c文件中用到b.c文件定义的变量,我们应该怎样定义、怎样引用才能让程序看起来干净整洁呢?下面简单记录一下假设现在有3个c文件,a.c、b.c、main.c;2个头文件,a.h,b.h要在main.c文件中用到a.c和b.c文件中的变量,(1)可以在a.c文件中【int global_a = 0;】,在a.h中申明【extern int global_a...

weixin_33467739的博客 1607

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

单片机全局变量和局部变量的使用 .

全局变量是存在RAM中的,而局部变量是存在堆栈中的 全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。在MSP430中,局部变量如果不多,就会分配r4-r15的寄存器,如果数量大就会用压栈处理。 全局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算

chinseeker 2280

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

单片机python 全局变量分散文件_python – 在文件之间使用全局变量?

我对全局变量如何工作感到困惑。我有一个大项目,有大约50个文件,我需要为所有这些文件定义全局变量。我做的是在我的项目main.py文件中定义它们,如下所示:# ../myproject/main.py# Define global myListglobal myListmyList = []# Importsimport subfile# Do somethingsubfile.stuff()pr...

weixin_33618737的博客 112

STM32单片机芯片与内部67 FSMC 读写外置SRAM 标准库 HAL库 直接使用局部变量、全局变量、内存的分配

介绍了FSMC读写SRAM的标准库与HAL库的介绍,其中针对用户侧如何使用外置SRAM进行了介绍,包括局部变量的使用、全局变量的使用以及内存分配等,非常详细。

陌夏微秋的博客 593

51单片机 C语言中全局变量的使用extern

extern可以用来在其他模块中公用变量和函数。其用法如:例如:在a.c文件中定义一个变量 unsigned int intA; intA = 0x00;在b.c中要操作这个变量,就在 b.c文件中定义 extern unsigned int intA; intA = 0x03; 在b.c中就把intA的值改为了0x03;然后在a.c文件中查看intA的值,值就为0x03。...

WYTC 1万+

C语言开发单片机为什么大多数都采用全局变量的形式?

C语言开发单片机为什么大多数都采用全局变量的形式?

分享平时的学习心得和笔记 867

单片机项目用大量的全局变量,有没有问题?

如果换成函数传参,每次调用都要在栈上开辟空间,万一递归深了或者中断嵌套了,分分钟栈溢出。在工程化中,一个芯片的价钱可以让直接影响到项目的成本,特别是消费电子,出货量越大,能减少的成本越多,所以如果使用全局变量用更便宜的单片机,对产品是有益的。不是瞧不起单片机程序员,它确实很难学,但是嵌入式工程师总是干一些丢西瓜捡芝麻的事,在一些无关紧要的细节上炫技,对软件的工程化却视而不见。这个问题其实挺有意思的,让我想起以前在实验室调小车的时候,看到学长留下的满屏幕的全局变量,血压都上来了,这和我学的「封装」「

嵌入式Linux 233

stm32开发三、单片机关键字extern做外部引用

extern 用于指示变量或函数是在其他文件中定义的,但在当前文件中也要使用它。

qq_40170041的博客 1439

全局变量中断原子操作_单片机中断全局变量保护方法

首先要明白这几个知识点:关键字volatile的使用,原子操作,临界区的使用。明白的直接跳到文中的4.全局变量的使用及保护处查看。1.关键字volatile关键字volatile用于告诉编译器,说明被修身的变量可能会被意想不到地改变,防止编译器对代码进行优化。比如如下程序:1ucNms=0x65;2ucNms=0x66;3ucNms=0x67;4ucNms=0x68;上述4条语句,如果变量在声明的...

weixin_35669712的博客 1271

使用全局变量的危害

嵌入式特别是单片机os-less的程序,最易范的错误是全局变量满天飞。这个现象在早期汇编转型过来的程序员以及初学者中常见,这帮家伙几乎把全局变量当作函数形参来用。在.h文档里面定义许多杂乱的结构体,extern一堆令人头皮发麻的全局变量,然后再这个模块里边赋值123,那个模块里边判断123分支决定做什么。每当看到这种程序,我总要戚眉变脸而后拍桌怒喝。没错,就是怒喝。我不否认全局变量的重要性,但我...

shitingdi的博客 1978
上一篇: ESP8266 Smart Config
下一篇: C语言基于printf下加入debug等级
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值