侵权投诉

C语言开发单片机为啥都是全局变量形式?

玩转单片机 2020-08-05 10:35 次阅读

前言

全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是:

1. 做控制的工程师;

2. 做非嵌入式的软件工程师。

做控制的工程师特点

他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD/Master,前前后后陆续有快十个人。面试问题是用C写PID。到后面的几位面试的时候我都觉得没有看的意义了,因为全都写的是同一个风格。大概就是这样的:

float SetSpeed;float err;float err_last;float Kp,Ki,Kd;float integral;float result; float PID(float speed){ err=SetSpeed-speed; integral+=err; result=Kp*err+Ki*integral+Kd*(err-err_last); err_last=err; return result;} 代码的特点就是所有的变量一定定义在函数外面。问他们为什么,回答是“全局变量方便调试”。 事实上在学校里做搞自动控制的人最重要的根本就是控制的结果,而不是代码本身。代码只要能工作就行。变量名污染,低耦合之类的和他们就不在同一个世界。进了公司有些人代码质量会变好,但有的还是会延续之前的习惯。前公司代码库里面凡是看不懂的代码一律都是那一两个Control Engineer写的,写完了还会用自己的名字给函数命名的那种。 要成为一个资深的嵌入式工程师相当难,一方面要有非常扎实的理论知识,同时也要有相当的那种大型的、高频CPU多层PCB板的设计经验。嵌入式硬件工程师要学的课程主要有模拟电路设计、数字电路设计、电磁波理论等。熟悉常用的放大电路、滤波电路、电源电路设计和分析。

做非嵌入式的软件工程师特点

代码的特点就是所有的静态变量都不可以定义在.h文件里,必须写在.c文件里以确保别的文件没法访问它们。 别的文件真要访问怎么办?那就给每一个变量写get/set函数啊!问题是静态变量写在.c文件里编译器是没法优化get/set的。结果就大面积的变量访问要花几倍的CPU时间去做get/set的函数调用。嵌入式项目很多情况下对硬件的压榨是很极端的,CPU利用率90%都不算什么,顶到97%都是有的。(注意下这些项目是实时性要求很高的,晚一个毫秒算不完都不行。不是跑在电脑上鼠标卡一卡也无所谓的。)然后为了封装性,在代码里面塞这么多get/set吗?

总结

总的来说嵌入式软件里大部分的代码都是中断驱动的,天生就有很多变量是没法使用参数传递的。全局变量的存在是因为正义站在这边。但是嵌入式软件远远没有特殊到不需要按照正常软件工程方法去管理的地步。要真有人认为“嵌入式软件只要能工作就成,代码丑一点无所谓的”纯粹是软件工程水平不行,不是因为控制水平太高。 全局变量一定是要用的,管理它们也很重要。一些基本的代码规则:

如果只是文件内调用,全局变量只能写在这个.c文件里,不要写进.h文件。

如果有文件外调用,全局变量要写在.h文件里。

.h里面的全局变量全局可读,但是只有本文件组可以写。别的文件要写请调用set函数。

所有的全局变量无论在.h还是.c里面都要包成同名struct。哪怕只有一个变量也要写进struct里面。比如PID.c里面有一个pid_S,PID.h里面有个PID_S。这样其他人不仅可以立即识别出一个变量是project内global/文件内static/函数内local,同时还能轻松追溯到这个函数是属于哪个文件的。

不要写函数内的static变量。函数内的static变量在实际的项目中几乎就是bug生成器,没法简单的reset。而且对unit test非常不友好。

原文标题:C语言开发单片机为啥都是全局变量形式?

文章出处:【微信号:mcu168,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

基于AT91RM9200处理器实现高可靠双机温备的应用设计

AT91RM9200是Atrnel公司生产的一款工业级ARM9处理器,内嵌ARM920T ARM T....
发表于 09-29 17:46 80次 阅读
基于AT91RM9200处理器实现高可靠双机温备的应用设计

基于FPGA器件EP20K200E芯片的配置方式在嵌入式系统中的应用研究

介绍一种在嵌放式系统中使用微处理器被动串行配置方式实现对FPGA配置的方案,将系统程序及配置文件存在....
发表于 09-29 17:05 54次 阅读
基于FPGA器件EP20K200E芯片的配置方式在嵌入式系统中的应用研究

800万行代码的鸿蒙系统,在世界上处于什么水平?

“800万行的代码量,让鸿蒙一跃成为人类有史以来第4大代码量的移动操作系统。要知道当前2.0版本仅包含大屏、手表和车机系统,等到...
发表于 09-29 16:04 32次 阅读
800万行代码的鸿蒙系统,在世界上处于什么水平?

许多C++开发人员则希望C语言灰飞烟灭?!

70年代初,贝尔实验室创建了C语言,它是开发UNIX的副产品。很快C就成为了最受欢迎的编程语言之一。....
的头像 嵌入式ARM 发表于 09-29 14:42 36次 阅读
许多C++开发人员则希望C语言灰飞烟灭?!

C语言中的短路现象

短路现象1 比如有以下表达式 abc 只有a为真(非0)才需要判断b的值;只有a和b都为真,才需要判....
的头像 嵌入式ARM 发表于 09-29 14:39 27次 阅读
C语言中的短路现象

大学生自述代码辛酸史

在啃掉一本本计算机经典书籍和写下大量代码以后。 疫情原因回不去学校,作为一个马上毕业,即将入职腾讯的....
的头像 嵌入式ARM 发表于 09-29 14:36 42次 阅读
大学生自述代码辛酸史

如何实现对通信数据的CRC计算

前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了....
的头像 嵌入式ARM 发表于 09-29 14:26 47次 阅读
如何实现对通信数据的CRC计算

关于Linux在移动嵌入式领域的发展介绍

谈到Linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,Linux....
的头像 lhl545545 发表于 09-29 11:56 332次 阅读
关于Linux在移动嵌入式领域的发展介绍

嵌入式应用更趋智能化 高性能MCU功能增强

在深圳嵌入式电子展中,我们看到了纳芯微、芯旺微、航顺芯片以及笙泉等多家企业,很多亮点值得一看。 随着....
发表于 09-29 11:52 75次 阅读
嵌入式应用更趋智能化 高性能MCU功能增强

华为四大基础软件开源,为社区贡献持续创新能力

[中国,上海,2020年9月24日] 华为计算产业基础软件战略进展与展望峰会在上海举行,向业界展示了....
的头像 电子观察说 发表于 09-29 11:24 119次 阅读
华为四大基础软件开源,为社区贡献持续创新能力

基于Moxa UC系列应用的嵌入式系统解决方案

随着近年来嵌入式技术的发展,嵌入式产品的应用越来越广泛,但是嵌入式产品开发需要很大投入,要搭建各种软....
的头像 电子设计 发表于 09-29 09:47 120次 阅读
基于Moxa UC系列应用的嵌入式系统解决方案

基于VxWorks实时操作系统的映象特点和构建方案

VxWorks是目前占垄断地位的实时操作系统,在许多领域获得广泛应用,但其产品映象设计却一直是令设计....
的头像 电子设计 发表于 09-29 09:36 100次 阅读
基于VxWorks实时操作系统的映象特点和构建方案

实例说明写入FRAM的零时钟周期延迟的影响

写入FRAM的零时钟周期延迟 一个典型的EEPROM需要5毫秒的写周期时间,以将其页面数据转移到非易失性EEPROM内...
发表于 09-28 14:42 0次 阅读
实例说明写入FRAM的零时钟周期延迟的影响

立功科技推出AWorksOS下一代嵌入式软件开发平台

众所周知,智能手机的普及极大地改变了世界,为人们的工作和生活带来了前所未有的便利,其背后正是由iOS、安卓这些
的头像 电子技术 发表于 09-28 11:40 117次 阅读
立功科技推出AWorksOS下一代嵌入式软件开发平台

基于嵌入式Linux系统实现YAFFS2文件系统存储方案的设计

基于以上分析,为了满足经常性的进行实时快速大容量数据存储和较长使用寿命的要求,采用NANDFLASH....
的头像 电子设计 发表于 09-28 10:06 408次 阅读
基于嵌入式Linux系统实现YAFFS2文件系统存储方案的设计

基于MMU 32位嵌入式操作系统的模块动态加载的设计

提出一种适用于嵌入式系统的模块动态加载技术,设计实现简单,占用资源少,开销小,并且成功运用于Delt....
的头像 电子设计 发表于 09-28 09:54 504次 阅读
基于MMU 32位嵌入式操作系统的模块动态加载的设计

了解内存:如何在嵌入式C语言中使用结构

处理器如何访问内存?了解有关C语言结构以及如何使用它们的更多信息。 本文将首先解释内存访问粒度的概念....
的头像 嵌入式星球 发表于 09-28 09:46 78次 阅读
了解内存:如何在嵌入式C语言中使用结构

HarmonyOS开发板试用-代码共建-1开箱贴

哈哈,收到顺丰提示,说快递柜再过2个小时就超时收费了,取件时要我5毛钱或者我再想想,选中我再想想竟然是提醒以后不再超时,...
发表于 09-28 09:34 101次 阅读
HarmonyOS开发板试用-代码共建-1开箱贴

C语言的100个经典算法免费下载

本文档的主要内容详细介绍的是C语言的100个经典算法免费下载。
发表于 09-28 08:00 22次 阅读
C语言的100个经典算法免费下载

使用Verilog硬件描述语言实现简易函数发生器的设计说明

简易函数信号发生器在电路实验和设备检测中具有十分广泛的用途。在基于QUARTUS2软件平台下,运用V....
发表于 09-27 16:41 13次 阅读
使用Verilog硬件描述语言实现简易函数发生器的设计说明

学习嵌入式C编程语言:了解联合数据对象

嵌入式C中struct与union的区别 在本系列的上一篇文章中,我们讨论了嵌入式C中的结构允许我们对不同数据类型的变量进行分组并...
发表于 09-27 15:55 202次 阅读
学习嵌入式C编程语言:了解联合数据对象

了解内存:如何在嵌入式C语言中使用结构

处理器如何访问内存?了解有关C语言结构以及如何使用它们的更多信息。 本文将首先解释内存访问粒度的概念,以便我们可以对处理...
发表于 09-27 15:45 101次 阅读
了解内存:如何在嵌入式C语言中使用结构

研究团队开发了单片集成歧管微通道(mMMC)系统

与SPMC相比,被称为“嵌入式歧管微通道”(EMMC)的三维冷却系统在降低泵输送功率和芯片温度梯度方....
的头像 济南宇航汽车电子 发表于 09-27 15:36 161次 阅读
研究团队开发了单片集成歧管微通道(mMMC)系统

一个简易的示波器套件

正在思考规划一套完整的嵌入式学习平台,苦思冥想已经多日,正巧今天看到这个,已经有人做出了样机,并很快....
的头像 FPGA入门到精通 发表于 09-27 15:28 107次 阅读
一个简易的示波器套件

采用RTL代码描述位宽相同的两个数相加或相减

采用RTL代码描述位宽相同的两个数相加或相减,无论是有符号数还是无符号数,Vivado综合后的结果是....
的头像 Lauren的FPGA 发表于 09-27 15:17 89次 阅读
采用RTL代码描述位宽相同的两个数相加或相减

检索增强型语言表征模型预训练

如果有一种预训练方法可以 显式地 获取知识,如引用额外的大型外部文本语料库,在不增加模型大小或复杂性....
的头像 TensorFlow 发表于 09-27 14:50 78次 阅读
检索增强型语言表征模型预训练

【HarmonyOS HiSpark AI Camera】开箱直播+LINUX系统编译环境搭建+WINDOWS系统开发环境+系统烧录+DEMO测试+开源扩展

今天刚收到【HarmonyOS HiSpark AI Camera】,开帖测试。先起个头,晚上正式开箱。 ...
发表于 09-27 14:36 89次 阅读
【HarmonyOS HiSpark AI Camera】开箱直播+LINUX系统编译环境搭建+WINDOWS系统开发环境+系统烧录+DEMO测试+开源扩展

【每日推荐】十七种电路设计原理图解析,这里全告诉你了

数字滤波器-IIR滤波器原理介绍Verilog HDL设计 数字 滤波器 数 字滤波器从实现结构上划....
的头像 科技前沿 发表于 09-27 14:11 184次 阅读
【每日推荐】十七种电路设计原理图解析,这里全告诉你了

【每日推荐】十七种电路设计原理图解析,这里全告诉你了

数字滤波器数字滤波器从实现结构上划分,有FIR和IIR两种。FIR的特点是:线性相位、消耗资源多;IIR的特点是:非线...
发表于 09-27 13:56 75次 阅读
【每日推荐】十七种电路设计原理图解析,这里全告诉你了

什么是eMRAM?研究现状如何?

作为一种新型存储,eMRAM 具有非易失性、读写速度快、能耗低、集成密度高、耐久力强、天然抗辐射和随....
的头像 我快闭嘴 发表于 09-27 11:54 416次 阅读
什么是eMRAM?研究现状如何?

多年酝酿之后,eMRAM终于要爆发了?

不同于传统半导体存储器如DRAM、SRAM 和 NAND 闪存等利用电子的电荷特性进行数据存储,eM....
的头像 我快闭嘴 发表于 09-27 11:46 612次 阅读
多年酝酿之后,eMRAM终于要爆发了?

嵌入式C语言源代码优化方案 主要优化程序的执行速度

1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入....
的头像 strongerHuang 发表于 09-27 11:45 136次 阅读
嵌入式C语言源代码优化方案  主要优化程序的执行速度

通过一些附加信息和有用的实现技术对C函数的探索

在本文中,我们将通过一些附加信息和一些有用的实现技术来结束对C函数的探索。 基本的C函数(例如,一个....
的头像 multisim 发表于 09-27 11:11 95次 阅读
通过一些附加信息和有用的实现技术对C函数的探索

如何得当使用C语言的特殊的用法

C语言有很多特殊的用法,如果这些特殊用法使用得当,会是你的代码变得更加有健壮,更加容易维护。 比如我....
的头像 strongerHuang 发表于 09-27 10:41 97次 阅读
如何得当使用C语言的特殊的用法

了解嵌入式C:什么是结构?

本文提供了有关嵌入式C编程中的结构的一些基本信息。在介绍了结构之后,我们将看一下这个强大的数据对象的一些重要应
的头像 嵌入式星球 发表于 09-27 09:59 66次 阅读
了解嵌入式C:什么是结构?

了解嵌入式C:什么是结构?

本文提供了有关嵌入式C编程中的结构的一些基本信息。 在介绍了结构之后,我们将看一下这个强大的数据对象的一些重要应用。然后...
发表于 09-27 09:24 202次 阅读
了解嵌入式C:什么是结构?

C++ Primer Plus的PDF的电子书免费下载

本书全面讲述了C语言编程的相关概念和知识。全书共17章。第1、2章学习C语言编程所需的预备知识。第3....
发表于 09-27 08:00 17次 阅读
C++ Primer Plus的PDF的电子书免费下载

C语言内存操作的陷阱!你踩过坑吗?

[table] [tr][td] 1、返回局部变量的地址,或者返回指向局部变量的指针 int *stackref() {     int val; &...
发表于 09-26 16:02 101次 阅读
C语言内存操作的陷阱!你踩过坑吗?

【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】敏感人群自动追踪系统开发

感谢主办方提供的双目摄像头提供测试。本项目利用双目摄像头模组+LattePanda Delta 432+NCS2神经棒部署openvino做一个敏感...
发表于 09-26 14:46 0次 阅读
【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】敏感人群自动追踪系统开发

C语言固件中指针的使用方法

有两个与指针关联的值。第一个是存储在指针本身中的存储地址,第二个是存储在该存储地址中的数据。要修改存....
的头像 multisim 发表于 09-26 11:38 113次 阅读
C语言固件中指针的使用方法

SPI总线驱动的C语言源代码详细概述

本文档的主要内容详细介绍的是SPI总线驱动的C语言源代码详细概述。
的头像 Wildesbeast 发表于 09-26 11:36 168次 阅读
SPI总线驱动的C语言源代码详细概述

I2C总线驱动的C语言源程序详细说明

 i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。
的头像 Wildesbeast 发表于 09-26 11:07 177次 阅读
I2C总线驱动的C语言源程序详细说明

集成波导与LCD屏的3D打印镜片的开发集成哪些了专利技术?

目前,带有VR或AR 功能的智能眼镜其中有待改进之处是比较笨重,并且无法同时满足眼镜佩戴者矫正视力的....
的头像 lhl545545 发表于 09-26 10:52 166次 阅读
集成波导与LCD屏的3D打印镜片的开发集成哪些了专利技术?

嵌入式Linux开发的一般过程

嵌入式系统是以应用为中心,以计算机技术为基础、软硬件均可裁剪、适应应用系统对功能、可靠性、成本、体积....
发表于 09-25 15:50 260次 阅读
嵌入式Linux开发的一般过程

华为全面升级重构硬件和软件“两大平台”

此次华为升级了智能IP网络的大脑iMaster NCE,北向提供网络开放可编程能力AOC系统并提供基....
的头像 lhl545545 发表于 09-25 14:52 190次 阅读
华为全面升级重构硬件和软件“两大平台”

c语言中一些花里胡哨的写法

转自:嵌入式Linux 我觉得这是一个送分题,奈何知乎人才太多了,给出了各种古怪的写法,如果是做项目....
的头像 strongerHuang 发表于 09-25 14:39 123次 阅读
c语言中一些花里胡哨的写法

【每日推荐】单片机设计要点须知,多的是你不知道的事!

可编程逻辑器件和单片机结合的滤波器模块设计 以 单片机 和 可编程逻辑 器件( FPGA )为控制核....
的头像 科技前沿 发表于 09-25 14:05 212次 阅读
【每日推荐】单片机设计要点须知,多的是你不知道的事!

边缘分析将成为人工智能的下一件大事

你需要训练一个模型,最大的挑战不是创建一个模型,而是找到数据并以一种有效地训练模型的方式安排数据。因....
的头像 我快闭嘴 发表于 09-25 12:06 363次 阅读
边缘分析将成为人工智能的下一件大事

RoboMaster 2020对抗赛&单项赛线上赛中华南虎荣获多个一等奖

RoboMaster 近日,RoboMaster 2020对抗赛单项赛线上赛结果已出,华南虎在此次竞....
的头像 华工机器人实验室 发表于 09-25 10:17 308次 阅读
 RoboMaster 2020对抗赛&单项赛线上赛中华南虎荣获多个一等奖

基于Valgrind和在线调试器实现Linux应用程序调试系统的设计

嵌入式系统是一个资源受限的系统,直接在嵌入式硬件平台上进行软件的开发与调试是不合适的,开发与调试通常....
的头像 电子设计 发表于 09-25 10:07 211次 阅读
基于Valgrind和在线调试器实现Linux应用程序调试系统的设计

基于ARM9嵌入式处理器实现中频磁场测量系统的应用方案

随着科技的发展,嵌入式操作系统在越来越多的领域发挥着重要的作用,目前已成为产品技术水平的标志之一。其....
的头像 电子设计 发表于 09-25 09:43 531次 阅读
基于ARM9嵌入式处理器实现中频磁场测量系统的应用方案

基于ARM技术的uClinux系统设计和应用分析

根文件系统是构建一个 uCLinux嵌入式系统的重要组成部分。目前嵌入式系统可以选择的根文件系统有:....
的头像 电子设计 发表于 09-24 17:08 478次 阅读
基于ARM技术的uClinux系统设计和应用分析

使用文件保存游戏的python代码和资料说明

本文档的主要内容详细介绍的是使用文件保存游戏的python代码和资料说明免费下载。
发表于 09-24 17:08 15次 阅读
使用文件保存游戏的python代码和资料说明

嵌入式二维条码识读模组LV3296在手持设备配套中的应用

LV3296是一款拥有超小尺寸、非常方便集成安装的嵌入式二维条码识读模组,几乎可以完美地嵌入任何设备....
的头像 牵手一起梦 发表于 09-24 16:33 221次 阅读
嵌入式二维条码识读模组LV3296在手持设备配套中的应用

英特尔推出新的10nm Atom嵌入式CPU

所有这些CPU都具有三个集成的2.5 GbE MAC,所有这些都可以启用以实现对时间敏感的联网。内核....
的头像 我快闭嘴 发表于 09-24 15:58 637次 阅读
英特尔推出新的10nm Atom嵌入式CPU

数据库瓶颈及分库分表示例

一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到....
的头像 数据分析与开发 发表于 09-24 15:52 61次 阅读
数据库瓶颈及分库分表示例

单片机C语言模块化编程的实例说明

当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。你需要和你的小组成员分工合作,一起....
发表于 09-24 08:00 108次 阅读
单片机C语言模块化编程的实例说明

什么是嵌入式_如何入门和提高嵌入式

因为首先,嵌入式有不少组合名词,例如嵌入式系统,嵌入式软件,Linux嵌入式,Android嵌入式,....
发表于 09-21 15:00 175次 阅读
什么是嵌入式_如何入门和提高嵌入式