凡亿教育-小米
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 为什么C语言开发单片机时大多使用全局变量?
为什么C语言开发单片机时大多使用全局变量?

1、性能和资源限制

在嵌入式系统中,资源(如内存和CPU时间)往往非常有限。


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


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


尤其是在嵌入式环境中,实时性要求较高时,减少函数参数传递或返回值赋值带来的开销,是一种优化手段。


2、简化状态管理

嵌入式系统通常需要管理大量的状态信息,比如传感器数据、系统状态标志、任务间共享的数据等。


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


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


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


这些模块可能在不同的任务或中断中执行,而使用全局变量可以让各个模块之间更方便地共享状态信息,从而减少参数传递的复杂性。


3、减少代码复杂性

在一些情况下,函数返回值的使用可能会增加代码的复杂性。


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


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


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


使用全局变量,数据可以在不同的函数间直接共享,而不用反复传递或多次拷贝。


4、中断处理中的便捷性

在嵌入式系统中,中断是非常常见的设计模式。


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


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


局部变量的生命周期在函数退出后会被销毁,而全局变量的生命周期贯穿整个程序运行周期,这就使得在中断中修改全局变量成为一种天然的方式。


5、硬件寄存器的映射

在单片机开发中,硬件寄存器通常通过全局变量或宏定义来访问。


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


这种编程方式可以直观地操作硬件,并且对于嵌入式开发人员来说,这种风格已经非常普遍。


6、全局变量的缺点和替代方案

虽然全局变量有其优势,但也带来了一些问题,比如:

  • 可维护性差:全局变量被任意函数访问和修改,可能导致代码难以跟踪和调试。

  • 数据不安全:如果多个任务同时访问全局变量,容易引发数据竞争问题,需要加锁或其他机制来保护数据一致性。


为了解决这些问题,有些替代方案可以被采用:

  • 局部变量传递和返回值:这种方法更符合现代编程的“封装性”原则,使函数之间的依赖性降低。

  • 结构体封装:将相关变量封装到一个结构体中,并通过指针传递,使代码的逻辑结构更清晰。

  • 模块化编程:使用static关键字将变量限定在文件作用域,避免全局命名空间污染。


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


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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论