C语言开发单片机如何避免全局变量过多混乱

发布者:乐基儿vos最新更新时间:2022-12-15 来源: zhihu关键字:C语言开发  单片机  全局变量 手机看文章 扫描二维码
随时随地手机看文章

每个攻城狮的成长经历,目标总是相似的。

刚开始学习这门技术的时候,希望自己能独立做出各种各样智能的产品。

有了这能力,更有竞争力,也更挣钱,在越来越智能的时代不至于被抛弃。

可惜并不是每个人都能走到终点。

很多人学着学着就学不动了,最后遗憾放弃

有些人虽然走了很多弯路,凭借惊人毅力一样挺了过来。

这一路有太多的瓶颈需要突破,每一个都可能决定你是天选之人,还是淘汰者。

对于刚入行的工程师来说,有一个瓶颈非常难突破。

那就是如何让自己写出来的程序更专业。

有很长一段时间,虽然功能自己都能写出来,但是总是觉得自己的程序写的乱七八糟。



上图是我刚从事单片机开发1年写的程序,不知道大家看出什么问题没有。

我来给大家分析下:

1.整个项目程序都写在main函数里

2.全局变量过多

3.没模块化思维

就是这个项目程序逻辑,调到我快崩溃了。

其实产品也不复杂,就是一个太阳能热水器的控制板。

不过一组合起来,功能之间就会相互冲突得很厉害,导致改了这里,那里又出问题。

一出问题所有功能又要重新测一遍。

如果你没经历过这种问题,你不会理解程序架构的重要性。

程序架构的好坏会影响整个程序的方方面面。

比如说全局变量,后面我也意识到了这个问题。

就是全局变量多了,程序大了会掌控不住。

第一个是要避免全局变量名字重复,第二个如果哪个变量没做注释,1个月后干干净净。

特别是你把整个项目功能的全局变量定义在一起的时候,简直就是灾难。

但是,不用全局变量肯定也是不可能的

只是要用的合理,这时候就比较考验工程师的经验了。

我是怎么做的?

拿我们无际单片机编程物联网网关那个课程项目来举例。



我采用了模块化编程的思维,从整体架构上分硬件层和应用层

一般来说还有中间层,比如解析一些协议之类,项目中间层的代码不多,被我简化了。

每个功能模块的全局变量,都定义在各自的.c文件里。

跟我做的那个太阳能热水器控制板的程序对比,虽然全局变量的数量可能没变,但是很明显模块化的写法更加清晰。

当然,这不是让代码看起来更清爽这么简单,还有功能可扩展性强,可移植性强的优势。

可扩展性强,听起来是一个专业术语,可能很多新手不是很理解什么意思。

你试想一下,好不容易产品功能代码完成,测试也没问题了,交付给客户测试。

客户测试完,说要改功能,来来回回改个7,8次,你是不是撕碎他们的都有了?

这是常态,客户对于技术是一个小白,他并不知道他的一句话的背后,你需要付出多少。

有经验的工程师,从学会有能力偷懒开始,再急的项目,你做完还有空闲时间那才牛逼。

这就是代码可扩展性的重要性。

下面再来说说可移植性。

可移植性是相对单片机(硬件平台)来说的。

比如说这个项目以前我在STM32单片机上做的,现在芯片涨价了,老板要求换成GD32的替代。

这个时候就考验你程序的移植性了。

有经验工程师写出来的程序,一般只需要改改硬件层的外设接口,应用层的产品逻辑功能代码基本不用动。

而菜鸡可能就要重写整个代码了…

一个全局变量的问题,看似简单,要想解决,还是得站在整个程序架构的角度去思考。

如果,你离这个阶段还很远,还有一个比较便捷的方法。

就是用结构体

用面向对象的思维,把同类的变量统一定义成结构体。

比如说时间分为年、月、日、周、时、分、秒。

如果用单独全局变量的形式,比较零散,也比较难管理。



这种,就比较适合用结构体了,因为这些都属于”时间”这个对象的参数。



类似的还有很多,比如说GPIO也算一个对象,参数有端口号、引脚号、输入模式、输出模式、频率等。

可以看看STM32固件库,就是很典型的面向对象编程思维。


关键字:C语言开发  单片机  全局变量 引用地址:C语言开发单片机如何避免全局变量过多混乱

上一篇:单片机大神为什么都不爱搭理新手?
下一篇:一种智能社区垃圾桶压缩系统的设计

推荐阅读最新更新时间:2024-11-12 18:28

8051单片机的控制总线的作用介绍
控制线一共有6条: (1)ALE/ (/PROG):地址锁存允许/编程线,配合P0口引脚的第二功能使用。在访问片外存储器时,8051CPU在P0.7~P0.0引脚上输出片外存储器低8位地址的同时在ALE/ (/PROG)上输出一个高电位脉冲,用于把这个片外存储器低8位地址锁存到外部专用地址锁存器,以便空出P0.7~P0.0引脚线去传送随后而来的片外存储器读写数据。在不访问片外存储器时,8051自动在ALE/ (/PROG)上输出频率为fosc/6的脉冲序列。该脉冲序列可用作外部时钟源或作为定时脉冲源使用 (2)(/EA)/Vpp:允许访问片外存储器/编程电源线,可以控制8051使用片内ROM还是使用片外ROM。若 (/EA)=0,
[单片机]
电视遥控器的单片机译码程序
;电子报2001年18期12版 Cs_X1 EQU 26H ;数据缓冲区字节数 Cs0_X1 EQU 25H ;缓冲区一个字节有几位 U0_X1 EQU 40H ;数据临时存放字节,存满8位后送2AH~2FH N0_M EQU 1EH ;键值存放单元 N0_J EQU 1FH ;遥控器识别码 X1_N1 EQU 2AH ;连续六个单元,(可位操作)作 X1_N2 EQU 2BH ;遥控输入数据缓冲区 X1_N3 EQU 2CH X1_N4 EQU 2DH X1_N5 EQU 2EH X1_N6 EQU 2FH ORG 00H ;转主程序 LJMP REST0 ORG 13H LJMP INT_X1 ;转外部中断1 ORG 100H
[单片机]
51单片机串口收发字符串源程序
想要通过串口控制led,但是串口每次中断只能发送一个字符,这样在控制的时候不太容易清楚各个命令是控制哪一部分,所以参考网上的资料,写了个简单的字符串收发函数。本程序的功能是:电脑串口助手发送数据给单片机,单片机接收后返回给电脑,在发送的时候,需要空两格再输入想要传送的内容,不然的话传输的数据会丢失,因为这个情况不影响串口控制LED,所以就没管了。 单片机源程序如下: #include reg52.h typedef unsigned char uchar; typedef unsigned int uint; sbit led=P2^0; void Usart_Init() { TMOD=0X20; PCON=0X80; S
[单片机]
51<font color='red'>单片机</font>串口收发字符串源程序
LabVIEW与单片机串口在数据采集系统中的应用
1.LabVIEW分析 LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显着区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。 LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。 它主要的方便就是,一个硬件的情况下,可以通过改变软件,就可以实现不同的仪器仪表的功能,非常方便,是相当于软件即硬件!现在的图形
[测试测量]
LabVIEW与<font color='red'>单片机</font>串口在数据采集系统中的应用
单片机自身的抗干扰措施研制
  为提高单片机本身的可靠性。近年来单片机的制造商在单片机设计上采取了一系列措施以期提高可靠性。这些技术主要体现在以下几方面。 1.降低外时钟频率   外时钟是高频的噪声源,除能引起对本应用系统的干扰之外,还可能产生对外界的干扰,使电磁兼容检测不能达标。在对系统可靠性要求很高的应用系统中,选用频率低的单片机是降低系统噪声的原则之一。以8051单片机为例,最短指令周期1 s时,外时钟是12MHz。而同样速度的Motorola 单片机系统时钟只需4MHz,更适合用于工控系统。近年来,一些生产8051兼容单片机的厂商也采用了一些新技术,在不牺牲运算速度的前提下将对外时钟的需求降至原来的1/3。而Motorola 单片机在新推出的68HC
[单片机]
基于单片机的多路测温仪系统设计
0引言 温度检测与控制技术在现阶段的工业、农业和居民日常生活中都具有广泛的应用。精确的温度检测和准确的温度控制是保证各类生产顺利开展以及居民生活方便快捷的基本条件。系统采用AT89S51单片机作为控制器,可靠性高、体积小、价格低廉;采用DS18B20作为多路温度采集的传感器,电路简单、测量精度高、稳定性好。 1系统总体设计方案 整个多路温度检测系统如图1所示,主要由计算机控制系统(上位机)、单片机测控系统(下位机)、多路温度传感器、功能模块系统等部分组成。本系统在需要对温度监控与测量的地方放置数字温度传感器,通过单总线将若干个温度传感器连接在一起。单片机按照单总线协议对各个传感器进行控制并采集温度信息,同时通过串口与上位机进行通信,
[单片机]
基于<font color='red'>单片机</font>的多路测温仪系统设计
单片机C语言中位操作用法
在对单处机进行编程的过程中,对位的操作是经常遇到的。C51对位的操控能力是非常强大的。从这一点上,就可以看出C不光具有高级语言的灵活性,又有低级语言贴近硬件的特点。这也是在各个领域中都可以看到C的重要原因。在这一节中将详细讲解C51中的位操作及其应用。 1、位运算符 C51提供了几种位操作符,如下表所示: 运算符 含义 运算符 含义 & 按位与 ~ 取反 | 按位或 左移 ^ 按位异或 右移
[单片机]
51单片机(利用return)实现判断数据头来接收
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: return ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200808 ---- @ModifiedTime: 20200808 ----
[单片机]
51<font color='red'>单片机</font>(利用return)实现判断数据头来接收
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved