首页 > 其他分享 >嵌入式开发中广泛采用全局变量的考虑

嵌入式开发中广泛采用全局变量的考虑

时间:2024-06-02 11:43:24浏览次数:21  
标签:文件 广泛 函数 嵌入式 单片机 内存 全局变量 分配

嵌入式开发中广泛采用全局变量的考虑

2024-06-02 10:26:57 星期日

在知乎上看到这个问题,C语言开发单片机为什么大多数都采用全局变量的形式?,才发觉在嵌入式开发中,使用全局变量的广泛程度远远高于纯软开发。在最近半年的TI CC2530 Zigbee开发和在实习单位的开发工作过程中,对全局变量的使用也有一些思考和体悟,顺便记录。

函数与函数之间的“接口”

作为函数之间的“接口”,这点在最近写的课程作业多模块任务划分算法中体现的多。在实现算法的过程中,函数1把一个全局变量经过一系列复杂的算法计算后改变了这个全局变量的值,然后函数2再拿着函数1处理过的这个全局变量再做另外的处理。

优势:

  1. 即使没有阅读过相关算法,也能通过函数执行过程快速掌握算法,因为几乎只是算法的代码化。
  2. 便于调试,只有一个变量,在需要位置打断点或者打印即可。
  3. 快,访问变量总比调用一个获取函数快的多。

劣势:

  1. 大量的全局变量占用大量资源,尤其在嵌入式这个寸块寸金的领域。
  2. 全局变量不符合软件工程的思想,随便且大量的修改带来Bugfix上的困难。(你当这里是公共厕所嘛)

中断驱动决定很多变量无法用参数传递

嵌入式软件远远没有特殊到不需要按照正常软件工程方法去管理的地步。要真有人认为“嵌入式软件只要能工作就成,代码丑一点无所谓的”纯粹是软件工程水平不行,不是因为控制水平太高。

全局变量的使用规则,也是单位目前正在使用的部分规则:

  1. 如果只文件内调用,全局变量只能写在这个.c文件里,不要写进.h文件。
  2. 如果有文件外调用,全局变量的声明要写在.h文件里,定义写在.c文件里。
    2.1 当你想在.h文件中声明一个全局变量,但是不在.h文件中定义,而是在其他的.c文件中定义它,使用extern关键字,表示变量在其他地方定义,需要编译器去寻找。
  3. 所有的全局变量无论在.h还是.c里面可以包成同文件名的Struct,这样其他人不仅可以立即识别出一个变量是Project内Global/文件内Static/函数内Local,同时还能追溯到函数是属于哪个文件的。
    3.1 这点见仁见智。定义成结构体后,会浪费部分因对齐而导致的内存没有利用的问题,通过Autosar标准下的Memmap,避免这个问题的同时,能够规则合理分配全局变量在段中的位置了。
  4. 避免函数内的static变量。函数内static变量在实际的项目中几乎就是Bug生成器,没法简单的Reset。而且对单元测试非常不友好。
  5. 获取其他非extern的全局变量,通过接口函数的方式获取。

可预测的内存占用对嵌入式更重要

可以认为变量有三种存储方法:
静态分配:在程序启动时就一次性分配好了,全局变量,静态变量都是如此
栈分配:栈空间随着函数调用分配,调用完指针回去就算是释放了
动态分配:如上所述,很麻烦,很慢
对单片机程序来说,可预测的内存占用比较重要。这决定了要不要换单片机。静态分配可以在程序编译过程就知道所需的内存,且分配过程也是在main()函数之前的startup汇编就给分配好的。所以静态分配也就成了单片机程序的好选择。
栈分配有一定的动态性,使得整体占用的内存空间不那么好预测。且单片机程序一般把栈都设置的较小,不好的程序有栈溢出的风险。栈相对动态分配的优势是,栈空间的申请和释放很简单,所以并不算不可接受。
动态内存分配就真的不太适合单片机了。我甚至见过有些单片机或实时系统的开发环境里,要求程序员主动选择内存分配的实现算法。对内存最有效的分配算法,所占用的时间和额外的内存也是很高的。

超级大的全局变量导致的问题

资源不够,强行修改堆栈大小通过编译,却又发送内存践踏这种更难排查的问题。

标签:文件,广泛,函数,嵌入式,单片机,内存,全局变量,分配
From: https://www.cnblogs.com/68786C/p/18226936

相关文章

  • 嵌入式Linux shell编程实例
    1.输入两个数,实现两个数的相加(1)具体实现代码如下1#!/bin/bash2reada3readb4sum=$(($a+$b))5echo"$sum"(2)编辑完内容后按Esc键再输入:wq保存,回车退出,执行结果如下图;(3)上图示例为输入两个数,实现两个数相加和,输出结果。2.计算1~100的和(1)具体实现代码......
  • 嵌入式Linux命令基础
    一、命令概述1.命令本质 命令的特性:一般就是对应shell命令,每一个命令代表一个可执行程序,运行一个命令就相当于运行一个可执行代码。2.打开终端方法第一种方法:通过鼠标右键选择打开终端第二种方法:利用Ctrl+Alt+T快捷键的方式3.普通用户/超级用户切换方法(1)普通用户......
  • 嵌入式模块学习小记(未分类)
    L298N电机驱动板模块OutputA:接DC电机1或步进电机的A+和A-;OutputB:接DC电机2或步进电机的B+和B-;5VEnable:如果使用输入电源大于12V的电源,请将跳线帽移除。输入电源小于12V时短接可以提供5V电源输出;+5VPower:当输入电源小于12V时且5VEnable处于短接状态,可以提......
  • 嵌入式linux系统中framebuffer应用开发详解
    大家好,今天给大家详细分析一下,利用framebuffer进行linux应用开发的详细方法。第一:LCD屏Framebuffer基本原理LCDFramebuffer就是一块显存.在嵌入式系统中.显存是被包含在内存中。LCDFramebuffer里的若干字节〈根据驱动程序对LCD控制器的配置而定〉表示LCD屏幕中的一个像素点.......
  • 深入探索汇编语言的顶尖级应用领域,包括多核并行处理、物联网和嵌入式系统、高性能计算
    汇编语言初级应用的大纲:1.汇编语言概述介绍汇编语言的基本概念和作用。解释汇编语言与高级语言的区别。简要说明汇编语言的历史和发展。2.汇编语言基础讲解汇编语言的基本语法和结构。介绍汇编语言中的指令、寄存器、内存等概念。解释汇编语言程序的组成部分,如数据段......
  • 【主题广泛|投稿优惠】2024年电气工程、材料与自动化国际会议(EEMA 2024)
    2024年电气工程、材料与自动化国际会议(EEMA2024)2024InternationalConferenceonElectricalEngineering,MaterialsandAutomation【重要信息】大会地点:三亚大会官网:http://www.iaceema.com投稿邮箱:[email protected]【注意:将稿件Word+PDF上传至邮箱,邮件正文请备......
  • 1.1 嵌入式八股文(一)
    C语言简述编译运行一段代码的过程源程序是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件,源程序就是所写好的代码。可执行程序,即常说的.exe程序,可以执行程序,完成计算机功能。在C语言中,.c文件就是所谓的源文件。源程序到可执行程序的过程。在这个过程中......
  • 数据可视化为何能在企业当中广泛应用?
    数据可视化为何能在企业当中广泛应用?这是一个值得探讨的话题。在当今信息爆炸的时代,企业每天都会产生和处理大量的数据,这些数据蕴含着丰富的信息和潜在的商业价值。然而,面对海量数据,如何高效地分析、理解和利用它们,成为了企业管理者们亟需解决的问题。数据可视化技术以其独特的优......
  • 蓝桥杯嵌入式 第六届国赛 更新中……
    题目配置注意事项复制LCD的工程,先配置资源---勾选完选项一定要再看一眼,可能选择错误ADC:配置ADC2_IN15,对应PB15引脚EEROM,配置PB6和PB7按键输入模式PB0、PB1、PB2、PA0LED一定要使能PD2PWM互补输出,用TIM15TIM6-10ms基准定时器代码-默写大师先......
  • 嵌入式硬件、软件最小设计系统都包含哪些部分
    嵌入式硬件最小设计系统的组成部分嵌入式硬件最小设计系统通常包括以下几个基本部分:嵌入式微处理器:作为系统的核心,负责执行指令和控制其他硬件部件。存储器:包括SDRAM、ROM、Flash等,用于存储操作系统、应用程序和数据。电源电路:为系统提供稳定的电力供应。时钟电路:提供系统运......