电子产业一站式赋能平台

PCB联盟网

搜索
查看: 44|回复: 0
收起左侧

为什么C语言开发单片机时大多使用全局变量?

[复制链接]

727

主题

727

帖子

3357

积分

四级会员

Rank: 4

积分
3357
发表于 昨天 08:00 | 显示全部楼层 |阅读模式

gtveba00mdu64037692300.gif

gtveba00mdu64037692300.gif

点击上方蓝色字体,关注我们
这种编程风格主要是出于几个重要的原因:
1
性能和资源限制
在嵌入式系统中,资源(如内存和CPU时间)往往非常有限。

使用全局变量可以减少栈空间的消耗,因为全局变量存储在静态内存区域,而局部变量则存储在栈中。

对于一些资源紧张的微控制器来说,栈的深度是有限的,而全局变量可以在代码中任何地方访问,不需要频繁的栈操作,这有助于节省时间和内存。

尤其是在嵌入式环境中,实时性要求较高时,减少函数参数传递或返回值赋值带来的开销,是一种优化手段。
2
简化状态管理
嵌入式系统通常需要管理大量的状态信息,比如传感器数据、系统状态标志、任务间共享的数据等。

全局变量可以作为共享内存,方便不同的模块或任务访问和修改。

在一个多任务或中断驱动的系统中,使用全局变量可以更方便地在不同的上下文间共享数据,而不需要通过复杂的函数调用链传递数据。

例如,在飞控系统中,需要处理传感器数据、姿态解算、控制算法等多个功能模块。

这些模块可能在不同的任务或中断中执行,而使用全局变量可以让各个模块之间更方便地共享状态信息,从而减少参数传递的复杂性。
3
减少代码复杂性
在一些情况下,函数返回值的使用可能会增加代码的复杂性。

特别是在嵌入式开发中,如果一个系统涉及多个传感器数据、控制参数等的处理,函数返回值可能需要多层传递和处理。

这不仅增加了代码的复杂性,也容易引入错误。使用全局变量,可以避免复杂的参数传递,使代码更加简洁。

例如,在一个多层处理链中,数据需要被多个函数处理和修改。

使用全局变量,数据可以在不同的函数间直接共享,而不用反复传递或多次拷贝。
4
中断处理中的便捷性
在嵌入式系统中,中断是非常常见的设计模式。

中断服务程序(ISR)通常会修改系统的一些状态或数据,供主程序使用。

为了保证中断处理和主程序之间的数据一致性,全局变量是较为简单的选择。

局部变量的生命周期在函数退出后会被销毁,而全局变量的生命周期贯穿整个程序运行周期,这就使得在中断中修改全局变量成为一种天然的方式。
5
硬件寄存器的映射
在单片机开发中,硬件寄存器通常通过全局变量或宏定义来访问。

虽然严格来说这些并不是“全局变量”,但这种编程习惯导致了大量代码对全局变量的依赖。

这种编程方式可以直观地操作硬件,并且对于嵌入式开发人员来说,这种风格已经非常普遍。
6
全局变量的缺点和替代方案
虽然全局变量有其优势,但也带来了一些问题,比如:
  • 可维护性差:全局变量被任意函数访问和修改,可能导致代码难以跟踪和调试。
  • 数据不安全:如果多个任务同时访问全局变量,容易引发数据竞争问题,需要加锁或其他机制来保护数据一致性。

    为了解决这些问题,有些替代方案可以被采用:
  • 局部变量传递和返回值:这种方法更符合现代编程的“封装性”原则,使函数之间的依赖性降低。
  • 结构体封装:将相关变量封装到一个结构体中,并通过指针传递,使代码的逻辑结构更清晰。
  • 模块化编程:使用static关键字将变量限定在文件作用域,避免全局命名空间污染。

    嵌入式开发中使用全局变量是一种权衡性能、内存消耗和代码复杂性的常见做法。

    不过随着系统复杂度的增加,合理管理全局变量,避免滥用,也是编程时需要特别注意的。

    1i2wz4jgdol64037692400.jpg

    1i2wz4jgdol64037692400.jpg

    oqccbl0qbuk64037692500.gif

    oqccbl0qbuk64037692500.gif

    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表