打印
[应用方案]

为什么单片机的程序喜欢用全局变量/不可重入函数/单例模式?

[复制链接]
328|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
claretttt|  楼主 | 2023-9-21 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个问题总的来说重点并不在于全局变量,而是面向对象。请看完描述。
首先,主要问题在于:函数全局地持有状态,导致这些功能几乎没法操作多个实例。(重点在于持有状态,而不是全局变量。)
比如:OLED12864_Write(data, len)
那么想用一个单片机操作多个屏幕怎么办呢?OLED12864_2_Write吗,那些变量是不是全都要复制一遍改个名?
(操作多块屏幕并不算钻牛角尖,12864这种级别的硬件完全有需求的可能。而且主要是举个例子,其他设备也是同样的。)
问题的重点并不在于全局变量,全局变量在嵌入式里并不是什么坏东西,提问者本人自己也经常用。反而是不可重入/单例模式才很让人不解。
尤其是在远未达到CPU/内存/系统上限的环境下,这种面向过程的方法导致一个功能完全没有拓展的能力。
实际上把这些函数写成可重入的(只操作传入的对象,而函数本身不持有状态),并不会造成什么性能开销。理由:
  • 确定性:对象实例本身也可以定义成全局的,从而不使用malloc/new,又保持了确定性。
  • 调试和仿真:按照1的用法,这些实例完全可以使用传统的方法调试:直接用IDE查看和修改变量。
  • 内存占用:不会额外产生浪费,多少个硬件就定义多少个对象实例。同时,软件架构上保持了拓展能力。
  • 传参:仅多传入一个指针。这个指针如果不能由调用者用传入,就需要函数本身自己去获取全局变量,这个开销总是存在的。
  • 访存:对象实例结构体的成员变量可以用“基址+偏移量”的方式来寻址,而散装的全局变量同样也要获取地址再访问内存。
除非是特殊环境,跟硬件或物理世界紧密绑定。但这种环境,应该是特定领域技术的主场;所用到的编程思维不应该是通用单片机/嵌入式编程的共识。以下是一些例子:
  • 环路控制需要快速响应和确定性,跟CPU核、中断、硬件、系统外设紧密绑定。
  • 内存极度紧张,不过这种地方用汇编可能更好。
  • 计算机系统架构特殊,需要按照特定方法编程。
  • 该功能本身就是全局的,比如RTOS本身。

使用特权

评论回复
沙发
burgessmaggie| | 2023-10-5 22:15 | 只看该作者
全局变量可以方便地在程序的各个部分中共享数据,提高程序的效率和可维护性。

使用特权

评论回复
板凳
bestwell| | 2023-10-8 18:27 | 只看该作者
单片机通常具有有限的资源,包括内存和寄存器。使用全局变量可以方便地在不同的函数之间共享数据,避免了参数传递的开销,并节省了内存空间。此外,全局变量在中断处理程序中也很有用,可以在中断和主程序之间传递数据。

使用特权

评论回复
地板
hilahope| | 2023-10-8 22:04 | 只看该作者
全局变量、不可重入函数和单例模式可以提高程序的效率和可维护性

使用特权

评论回复
5
hearstnorman323| | 2023-10-10 21:19 | 只看该作者
在单片机中,资源的竞争和共享是常见的情况。不可重入函数是指在执行期间不允许被中断打断的函数。这样可以避免由于中断的发生导致数据不一致或竞争条件的问题。通过限制函数的可重入性,可以简化编程的复杂性,并提高代码的可靠性。

使用特权

评论回复
6
pmp| | 2023-10-10 22:47 | 只看该作者
全局变量可以在程序的任何位置访问,使得数据的传递变得简单,便于实现模块化编程。

使用特权

评论回复
7
yeates333| | 2023-10-11 22:41 | 只看该作者
单例模式可以帮助简化编程。如果一个类需要频繁地被实例化和销毁,那么单例模式可以避免这些不必要的操作,提高程序的效率。

使用特权

评论回复
8
lzbf| | 2023-10-12 19:39 | 只看该作者
不可重入函数的设计相对简单。因为不需要考虑函数在并发环境中的行为,所以可以专注于实现单个任务,而不需要处理并发控制和同步。

使用特权

评论回复
9
alvpeg| | 2023-10-14 09:26 | 只看该作者
全局变量只定义一次,可以在整个程序范围内共享,因此可以节约内存。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

1135

帖子

0

粉丝