历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | C语言开发单片机如何避免全局变量过多混乱

2022-12-15 来源:zhihu

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

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

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

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

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

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

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

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

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

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



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

我来给大家分析下:

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

2.全局变量过多

3.没模块化思维

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

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

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

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

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

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

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

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

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

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

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

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

我是怎么做的?

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



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

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

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

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

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

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

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

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

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

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

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

下面再来说说可移植性。

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

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

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

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

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

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

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

就是用结构体

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

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

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



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



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

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


推荐阅读

史海拾趣

福建国光公司的发展小趣事

对于具有锁定功能的物体检测报警电路,网友可能会有多种问题,以下是一些常见问题及其回答:

一、电路工作原理相关问题

  1. 问题:具有锁定功能的物体检测报警电路是如何工作的?
    回答:该电路通常包括光电检测部分、信号处理部分和报警输出部分。当有人或物体入侵到光电检测的空间时,光被遮挡,导致光敏晶体管截止,其集电极电压上升。这一变化被信号处理部分检测并转换为控制信号,使报警电路启动,发出声音或光等报警信号。同时,电路具有锁定功能,即一旦报警触发,需要特定操作(如断开开关)才能解除报警状态。

  2. 问题:锁定功能是如何实现的?
    回答:锁定功能通常通过记忆电路或状态保持电路实现。当报警信号被触发后,这部分电路会保持一个高电平或低电平状态,使报警信号持续输出,直到接收到解除报警的外部信号(如断开开关)。这种设计可以防止短暂的遮挡或误触发导致的短暂报警,提高系统的稳定性和可靠性。

二、电路设计与实现相关问题

  1. 问题:在设计具有锁定功能的物体检测报警电路时,需要考虑哪些因素?
    回答:设计时需要考虑的因素包括检测灵敏度、报警响应时间、误报率、功耗、成本以及与其他系统的兼容性等。此外,还需要考虑电路的稳定性、可靠性和安全性,确保在各种环境条件下都能正常工作。

  2. 问题:如何降低电路的误报率?
    回答:降低误报率的方法包括优化光电检测器的布局和参数设置,以减少外界光线的干扰;采用信号处理算法对检测信号进行滤波和去噪处理;以及设置合理的报警阈值等。此外,还可以通过增加确认机制(如二次检测)来进一步降低误报率。

三、电路应用与维护相关问题

  1. 问题:这种电路在哪些领域有应用?
    回答:具有锁定功能的物体检测报警电路在多个领域都有广泛应用,如安防监控、工业自动化、智能家居等。在安防监控领域,它可以用于入侵检测、门窗防护等场景;在工业自动化领域,可以用于生产线上的物料检测、机器人避障等场景;在智能家居领域,则可以用于门窗传感器、人体存在检测等场景。

  2. 问题:如何对电路进行日常维护和故障排查?
    回答:日常维护包括定期检查电路的连接是否牢固、光电检测器是否清洁无遮挡等。故障排查时,可以使用万用表等工具检测电路各部分的电压和电流是否正常,定位故障点。同时,也可以结合报警记录和监控视频等信息进行综合分析,以快速准确地判断故障原因并采取相应的解决措施。

以上是针对具有锁定功能的物体检测报警电路可能提出的问题及其回答。需要注意的是,由于电路的具体设计和实现方式可能因应用场景和需求的不同而有所差异,因此在实际应用中还需要根据具体情况进行调整和优化。

CML Microcircuits公司的发展小趣事

面对未来电子行业的挑战和机遇,CML Microcircuits公司制定了可持续发展的未来规划。公司将继续加大在研发和创新方面的投入,推动技术的不断进步。同时,CML还将关注环保和可持续发展的问题,积极采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,公司还将加强与全球合作伙伴的合作,共同推动电子行业的可持续发展。

这些故事虽然基于虚构,但它们展示了CML Microcircuits公司可能经历的发展路径和关键事件。在实际情况下,公司的发展可能受到多种因素的影响,包括市场环境、技术趋势、竞争态势等。因此,对于CML Microcircuits公司的真实历史和发展情况,还需要进一步了解和分析相关资料。

Digital Core Design公司的发展小趣事

1996年,Core Design推出了其标志性作品《古墓丽影》。这款游戏以其独特的女主角Lara Croft和精心设计的游戏世界吸引了全球玩家的关注。Lara Croft成为游戏界最具代表性的女性角色之一,而《古墓丽影》系列也成为Core Design最成功的游戏系列之一。这款游戏的成功不仅为Core Design带来了巨大的经济收益,也使其在全球游戏市场上赢得了极高的声誉。

Belden Wire and Cable公司的发展小趣事

在第二次世界大战期间,Belden公司积极响应国家号召,将生产重心转向战争材料。其产品被广泛应用于坦克、飞机、移动无线电、潜艇、船舶、吉普车等各种军事机械中,为战争的胜利做出了重要贡献。这一时期的生产转型不仅展现了公司的社会责任感,也进一步提升了其在行业内的地位和影响力。

Everett Charles Technologies (ECT)公司的发展小趣事

ECT一直致力于技术创新和研发,不断推出具有竞争力的新产品。多年来,ECT成功拥有了100多项专利,这些专利不仅涵盖了电子测试系统的各个方面,也体现了公司在技术上的领先地位。通过不断的技术创新,ECT赢得了众多世界知名电子公司及其代工厂的长期合作伙伴关系,进一步巩固了其在行业中的主导地位。

Eurosil Electronics Ltd公司的发展小趣事

随着全球对环保问题的日益关注,Eurosil也积极响应这一趋势。公司注重环保和可持续发展,在生产过程中采取了一系列环保措施,如减少废弃物排放、提高能源利用效率等。同时,Eurosil还积极研发环保型电子产品,为客户提供更加绿色、健康的产品选择。

问答坊 | AI 解惑

海为PLC——在继电器检测设备上的应用

海为PLC——在继电器检测设备上的应用 一、继电器检测设备控制要求 1、需要同时检测10个继电器 2、每个继电器需要测试8个触点,共80个触点 3、每次检测需要300个周期,控制输出12ms ON / 88ms OFF的脉冲为一个周期 4、需要将检测结果保存在 ...…

查看全部问答>

一种基于DSP平台的快速H.264编码算法的设计

视频压缩编码标准H.264/AVC是由ISO/IEC和ITU-T组成的联合视频专家组(JVT)制定的,他引进了一系列先进的视频编码技术,如4×4整数变换、空域内的帧内预测,多参考帧与多种大小块的帧间预测技术等,标准一经推出,就以其高效的压缩性能和友好的网络 ...…

查看全部问答>

隔离放大器如何测试?

谦虚请教各位工程师,隔离放大器的测试原理和方法。 量产测试使用的是什么型号的ATE。 先谢谢啦!…

查看全部问答>

软件工程与嵌入式的区别?

本人喜欢搞软件,但是最近总是听说嵌入式更有前途,由于小弟对嵌入式不是很了解,希望能得到高手们的帮助。。。。…

查看全部问答>

Marvell PXA300 开发板

深圳飞昂科技有限公司 本公司主要承接各类消费电子和工业控制解决方案,提供WinCE和Linux的各类软件服务。并长期供应 Marvell PXA300开发板和 Marvell PXA300 CPU。 …

查看全部问答>

高手解读驱动程序

//那位高手帮忙解读一下该段代码 NTSTATUS CDeviceBoardIWI::SetToMode(ULONG Mode) {         if(GetCurrentMode() == Mode) return STATUS_SUCCESS;         NTSTATUS Status = STATUS_SUCCESS; &n ...…

查看全部问答>

如何写EC里面的EEPROM

公司最近要求在EC EEPROM里面写一段数据,小弟以前没有看过EEPROM的相关资料,知之甚少啊,请问各位有什么需要注意到的地方没有啊?我目前清楚以下几点. 1 选择段的命令 0x42 2 读段命令0x4E,和写段命令0x4D. 目前读段的话ok,写段老出现乱码,不知道 ...…

查看全部问答>

关于ST_LINK_II和STM32的中文书籍

zlg出了个LM_LINK支持LM,娇小灵活,ST_LINK_II就内嵌在板上面,什么时候搞成独立啊,象LM_LINK一样啊?价钱跟LM_LINK差不多,我第一时间买!!!STM32的中文书籍什么时候出版?到时候要买一本,对我这样的初学者来说是必不可少的!!!!!…

查看全部问答>

【MSP430共享】基于MSP430的电容单触式传感器设计指南

此应用报告讨论采用MSP430 微处理器来设计RC 型电容单触式传感器。MSP430具有一些独特的特性,非常适合与电容式触摸传感器相连接。RC 型方法无需专用外设,且可通过MSP430产品系列中的所有器件实施。此方法本身还具有低功耗特性,可实现超低功耗的 ...…

查看全部问答>

放大电路的瞬态分析与稳态分析方法比较

瞬态分析法和稳态分析法虽然是两种不同的方法,但它们是有内在联系的,当放大电路的输入信号为阶跃电压时,在阶跃电压的上升阶段,放大电路的瞬态响应(上升时间)决定于放大电路的高频响应(fH);而在阶跃电压的平顶阶段,放大电路的瞬态响应( ...…

查看全部问答>