首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我怎么能不在这个嵌入式程序中使用全局变量呢?

在嵌入式程序中,避免使用全局变量可以通过以下几种方式实现:

  1. 使用局部变量:将需要共享的数据作为参数传递给函数或者作为局部变量在函数内部定义。这样可以避免全局变量的使用,同时保证数据的封装性和安全性。
  2. 使用静态变量:在函数内部使用静态变量来保存需要共享的数据。静态变量的作用域仅限于定义它的函数内部,但是其生命周期会持续到程序结束,因此可以实现数据的共享。
  3. 使用指针传递:将需要共享的数据通过指针传递给函数。这样可以在函数内部通过指针访问和修改数据,避免了全局变量的使用。
  4. 使用消息队列或者邮箱:通过消息队列或者邮箱的方式实现不同任务之间的数据共享。任务可以通过发送消息或者将数据放入邮箱中来实现数据的传递和共享。
  5. 使用全局结构体:将需要共享的数据封装在一个全局结构体中,不直接使用全局变量。通过访问结构体成员来获取和修改数据,避免了直接使用全局变量的问题。

以上方法可以根据具体的应用场景和需求选择使用。在实际开发中,可以根据程序的复杂度和可维护性来权衡选择合适的方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

漫谈C变量——夏虫不可语冰

> 静态变量   在嵌入式系统,确定的(Deterministic)通常是“简单可靠”的代名词,因此在追求可靠性的嵌入式项目中尽可能使用静态变量是有道理的。...基于这一原因,后面将不对全局变量和静态局部变量之流做区分,统一称为静态变量。 > 静态变量放在哪里?...“.bss” 段——之所以这么做是因为编译器觉得:通过循环赋值的方法给这帮小变量初始化成0太不划算了,初始化他们的程序都比变量本身还大,干脆放几个0到RW的初始值表里,由RW数据的初始化程序顺手处理好了...在MDK(也就是ARM Compiler),这个脚本叫做scatter-loading file;在IAR和GCC也有对应的LinkerScript,只不过语法规则不同,感兴趣的人可以查阅对应的手册...(此时,堆既不在RW里,也不在ZI里)。

2.1K20

浅谈text段、data段和bss段

而且在嵌入式系统的设计也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。...在采用段式内存管理的架构(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序未初始化的全局变量的一块内存区域,一般在初始化时...比如,在C语言程序编译完成之后,已初始化的全局变量保存在.data 段,未初始化的全局变量保存在.bss 段。 text段: 用于存放程序代码的区域, 编译时确定, 只读。...也是通常所说的静态存储区,赋了初值的全局变量、常量和静态变量都存放在这个域。 而bss段不在可执行文件,由系统初始化。...BSS段的大小从可执行文件得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零,包含data和bss段的整个区段此时通常称为数据区。

2.1K11
  • 嵌入式Linux要学哪些东西?你真的造吗?

    看到网上有很多很强大很有趣的程序,我们都可以尝试去做,可是如何去做程序是什么,怎么写?这时我们需要学习一些语言,比如比较基础的C语言,比如面向对象的C++,Java等。...3、写完程序了发现不就是一个很普通的文件吗,怎么能像别人写的程序一样运行起来?...这时我们需要知道如何编译一个程序,需要知道编译器及一些其他工具的使用,比如GCC,在开发的过程我们为了提供工作效率还会用到Make,Shell等,为了能够很好的管理我们代码的不同版本,我们还需要知道什么是...5、当我们再进一步的话,我们会发现我们什么有很多的东西都运行的是Linux系统,可是他们和我的PC运行的Linux有什么区别,为什么电 脑要用风扇而手机不用风扇,我们打开网页查找手机的详细参数的时候...本人认为到第九点你已经是一个高级的嵌入式Linux人物 了,工资待遇已经不用说,咋说也得15K往上了,如果做管理30K也是有的。

    1.5K10

    一个程序员怎么才算精通python

    全局变量 关于Python的全局变量,我们先从一个问题开始:Python有没有全局变量?可能你看到这个问题的时候就蒙圈了,没关系,来解释一下。...但是,从C/C++/Java程序员的角度来说,Python是没有全局变量的。因为,Python的全局变量并不是程序级别的(即全局唯一),而是模块级别的。...关于数组和链表的知识,想大家都知道了,这里就不再赘述。如果我们在写代码的过程,对于自己最常用的数据结构,连它的时间复杂度都不知道,我们又怎么能够写出高效的代码。...写不出高效的代码,那我们又怎么能够声称自己精通这门编程语言。 既然list是一个数组,那么,我们要使用链表的时候,应该使用什么数据结构?...结论 这篇文章很长,但是,相信对很多人都会有帮助。这里想说的是,Python是一门编程语言,使用范围非常广泛,大家不要去追求精通Python程序语言自身,而应该将精力放在自己需要解决的实际问题上。

    3.2K101

    嵌入式入门篇】嵌入式0基础沉浸式刷题篇1

    ** 推荐给大家一款刷题、面试的神器,也是用这一款神器进行学习Verilog硬件代码进行嵌入式入门的!...现假设我们的点类Point是属于多维空间中的点,其中包含多个相同类型(类型未知)的变量(第一个一定是x)表示坐标,你能否使用宏定义的方式,从使用空间的角度算出这个点类有多少个变量?...于是牛牛就想知道这个m最后到底等于多少,你能帮牛牛实现这个递归函数,返回m的值吗?...所以,只要我们能保证程序在编译过程不出错,那么在程序的运行过程我们便可以通过指针间接修改该const修饰的变量的值。...Q5:嵌入式机器的大小端 问题描述:数据的低位保存在内存的高地址,而数据的高位保存在内存的低地址称之为大端模式(BE),而小端模式(LE)则反之。

    8110

    真刀真枪模块化(1)——一本糊涂账

    事实上,如果讨论的对象是嵌入式软件,很多人可能真的没有看过猪跑。在话题变得更像都市传说的之前,想问一个问题: 为什么要模块化?...---- 根据我们在《什么是嵌入式(上)》的描述,程序(软件)是“程序员尝试去固化的自己的思维”;而模块(硬件)则是“业已固化的逻辑”,读懂一段程序,实际上就是要通过死的代码逻辑去反推模块构作者的思维...那么从第一线程序员的视角来看这个问题: 为什么程序员要阅读模块的代码实现?   笔者问过不同从业时间/经验的程序员,从过来的的角度来看,无非是以下几个原因: 学习目的——想知道别人是怎么实现的。...,必然要怀疑模块,而且甚至有很多不负责任的程序员天然的会首先怀疑模块——不是自己写的,怎么能放心——所以调试的时候必然: 要有源代码,否则就不会调试了 必然要阅读模块的代码,否则就不知道究竟这个源代码是不是对的...既然在模块的使用过程,无论是学习目的还是调试目的都不需要阅模块的源代码,那么可以明确的得出结论:程序员在使用模块的过程完全不需要,也不应该浪费项目的时间来阅读源代码。

    34540

    Android studio常用插件之行云流水coding

    Prettify Android Postfix Completion JSONOnlineVewer 后记 1 前言 现如今,做Android开发的大部分都转移到AS了吧,从ADT转过来确实方便快捷很多,可作为程序员...我们都知道AS是基于IDEA开发的,IDEA的特点就是插件多,那么AS有没有什么插件能让高(偷)效(懒)写代码?以下是常用的几个插件,效率提升挺多的。...Plugins.gif 好了,了解了怎么装插件之后该谈下常用的插件了!快捷键默认Windows,括号里是mac的。...Gson_control_enter.gif 5 Android ButterKnife Zelezny 作为一个懒人,没用过懒人库怎么能叫懒人呢,现阶段最火的懒人库非butterknife莫属,使用注解方式...findbyid和onclick,这也就少写一些代码,怎么能算懒使用Android_ButterKnife_Zelezny自动生成findbyid和onclick代码才叫懒嘛!

    78710

    真刀真枪模块化(3.5)——骚操作?不!这才是正统

    对我们嵌入式程序员来说,需要记住:如果你想让编译器生成最优代码,那么请务必要尽可能的多向编译器提供信息,并且一定要让编译器知道这个信息的作用范围。...后者说:这个变量是定义在别的C源代码里的,只知道这些,它具体什么地址,跟其它全局变量之间前后有啥关系不知道。 你看这信息量的多寡,高下立判吧?...接下来,针对这些全局变量,我们又如何能“让编译器知道信息的作用范围”?聪明的你一定已经猜到了:这里的“变量作用范围信息”其实就是想办法告诉编译器“这些全局变量究竟被谁使用了”。 具体怎么做?...此时怎么办?有没有啥灵丹妙药?没事,还有救: 先给每个这样的全局变量加上static; 把所有用到了对应全局变量的C源代码都 #include 到同一个C源代码。...通过把所有用到了对应全局变量的C源代码都 #include 到同一个C文件,我们成功的向编译器传达了一个信息:所有用到这个变量的人我都给你找齐了,边界就是当前的C源代码,你又可以随心所欲了!

    31740

    C语言中,全局变量滥用的后果竟如此严重?

    全局变量 作为一个嵌入式工程师 肯定有前人提示过你不要滥用 就在之前丰田公司就出过这么一档子事儿 某位软件工程师因使用超过10000 个全局变量 在法庭上被“喷”是“一坨”代码 在工程实践 总共采用5...而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件不能使用它。...在.h文档里面定义许多杂乱的结构体,extern一堆令人头皮发麻的全局变量,然后再这个模块里边赋值123,那个模块里边判断123分支决定做什么。 每当看到这种程序总要戚眉变脸而后拍桌怒喝。...全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。...5.单片机的os-less系统,只有栈没有堆的用法,那些默认对堆分配空间的“startup.s”,可以大胆的把堆空间干掉。 6.程序模型?如何分析抽象出来,从哪个角度进行模型构建

    1.3K20

    新人怎样学习嵌入式Linux?

    C语言要学到什么程度?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。...嵌入式应用开发和PC上的应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。...但是Flash一般是只能读不能直接写的,如果用到全局变量,这些全局变量在哪里?    答:全局变量应该在内存里 3. 那么谁把全局变量放到内存里去?    ...你别指望把它读完,1800多页,上下两册是某一块不清楚时,就去翻一下它。任何一部分,这书都可以讲上2、3百页,非常详细。并且是以某个目标来带你分析内核源码。...那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序?  答:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。

    5.1K10

    3-学习GPRS_Air202(需要知道的关于Lua的一些基本的知识)

    但是社会的进步怎么能离得开技术人才....... 希望能用自己的通俗易懂的技术文章唤起很多人学习的乐趣..让知识变得从未如此性感.... 知识是枯燥的吗??就现在感觉,知识就是工具,也是乐趣....用的这个软件测试lua的程序 ? ? 自己不再用luastudio,因为老是会强退。。。 先说什么,,想一想 如果不会lua请看我这一系列的文章 ?...前面那个数控制,用来指定一个起始点; 然后select函数将返回指定的多重返回值序列  起点开始 到 序列末尾为止  的部分 ? ? 现在需要得到传进来的值 第一种 ? 第二种 ?...如果写的程序少没啥子问题...万一多了...变量函数一大堆.....真怕重名....就乱了 所以最好是每个文件能够独立起来,然后用到哪个文件里面的变量或函数就利用某种途径调用,,,,, 还记不记得C...其实_G 应该说是存储的咱文件里的全局变量,上面的那些打印出来的如:mode就是咱这个文件的全局变量,只不过这家伙是一个数组罢了 咱可以试一下 ? 写的太多了,,,后面的放到下一篇

    48550

    教你快速了解C语言中的作用域和常量

    一、变量作用域和生命周期 作用域 作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。...,而里面的大括号也在这个范围所以可以使用。...全局变量的作用域 前面介绍了全局变量的的生效范围是全局, 在不同.c文件也可以使用。 有因为我们程序是main()函数开始 出main函数结束 所以: 全局变量的作用域是整个工程。...全局变量的生命周期 由于我们全局变量的作用域是整个工程 而程序是从进入main( )函数开始,出main( )函数结束。 那么是不是可以说: 全局变量的生命周期是:整个程序的生命周期。...怎么能这样修改! 所以他肯定会给我们报错。

    21110

    关于可重入函数

    ,这里直接导致嵌入式 linux 系统应用进程的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...可重入函数主要用于多任务环境,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。...我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu 寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer 等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时...在中断处理函数调用有互斥锁保护的全局变量,如果恰好该变量正在被另一个线程调用,会导致中断处理函数不能及时返回,导致中断丢失等严重问题。

    72410

    C语言 | C++可重入函数

    ,这里直接导致嵌入式 linux 系统应用进程的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...可重入函数主要用于多任务环境,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。...我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu 寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer 等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时...在中断处理函数调用有互斥锁保护的全局变量,如果恰好该变量正在被另一个线程调用,会导致中断处理函数不能及时返回,导致中断丢失等严重问题。

    1.4K88

    怎么样才算是精通 Python?

    全局变量 关于Python的全局变量,我们先从一个问题开始:Python有没有全局变量?可能你看到这个问题的时候就蒙圈了,没关系,来解释一下。...但是,从C/C++/Java程序员的角度来说,Python是没有全局变量的。因为,Python的全局变量并不是程序级别的(即全局唯一),而是模块级别的。...关于数组和链表的知识,想大家都知道了,这里就不再赘述。如果我们在写代码的过程,对于自己最常用的数据结构,连它的时间复杂度都不知道,我们又怎么能够写出高效的代码。...写不出高效的代码,那我们又怎么能够声称自己精通这门编程语言。 既然list是一个数组,那么,我们要使用链表的时候,应该使用什么数据结构?...那么,哪一个是好的设计,哪一个是不好的设计?要回答这个问题,我们先来看一下在大家固有的观念,else语句起到什么作用。

    2.4K91

    linux进程内存布局

    这样的概念在当前的计算机程序设计是很重要的一个基本概念,而且在嵌入式系统的设计也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。...从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。 当程序在执行时动态分配空间(C的malloc函数),所分配的空间就属于heap。其概念与数据结构“堆”的概念不同。...text和data段都在可执行文件(在嵌入式系统里一般是固化在镜像文件),由系统从可执行文件中加载;而BSS段不在可执行文件,由系统初始化。 ?...而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件不能使用它。...对于可在当前源文件以外使用的函数,应该在一个头文件说明,要使用这些函数的源文件要包含这个头文件.static 函数在内存只有一份(.data),普通函数在每个被调用维持一份拷贝。

    3.1K41

    C语言可重入函数和不可重入函数

    可重入函数或者只使用局部变量,即保存在CPU寄存器或堆栈;或者使用全局变量,则要对全局变量予以保护。 说法2: 一个可重入的函数简单来说,就是:可以被中断的函数。...相信很多人都看过下面这个面试题 中断是嵌入式系统重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。...如果你丢掉了第三和第四点,不会太为难你的。不用说,如果你能得到后两点,那么你的被 雇用前景越来越光明了。 --> 如果说中断服务程序有返回值,那么它的值返回给谁?...也就是说中断服务程序链接在某一类中断源上,而这些中断源的产生是随机的,所以,中断服务程序并没有一个固定的调用者,也没有固定的返回地址,所 以返回值也没有用 的问题是,这里所说的printf()经常有重入的问题...有人能给解释一下么这个概念在嵌入式操作系统中比较重要,由于存在任务的调度,它 实时系统,可剥夺型内核是危险的,如同一个安静的水雷。可能会被触发,也可能安然无恙。

    3.5K30

    五撩Python

    如下: 有个注意点,第30行,这里有个return,就是程序如果运行到这里,就不需要再继续了,直接返回结果。函数可以有多个return。...函数外面的变量,比如上面的vip0等,这叫全局变量,就是在这个代码文件全部地方都可以访问。...在函数定义之前的全局变量,在函数里也可以用,但是,但是,如果你想在函数里修改全局变量的值一定要小心,比如本咖灰师修改了节假日折扣,如下: 虽然编辑器对第5行代码提出了一些异议,信心满满的选择忽视,然后运行了代码...而函数外输出的那个是全局变量。 那函数里如何修改全局变量,要像这样: 看看,这下编辑器表示情绪很稳定。...把本代码的几个全局变量移到函数里行不行。 如果调用这个函数一次,是没问题的。

    50260

    C语言:如何给全局变量起一个别名?

    我们知道,变量名称是给程序使用的。 在编译器的眼中,所有的变量都变成了地址。 请注意:这里所讨论的别名,仅仅是通过不同的标识符来引用同一个变量。...在上面这个帖子,作者首先想到的是通过宏定义,对变量进行重新命名。 这样的做法,将会在编译之前的预处理环节,把宏标识符替换为变量标识符。...现在非常流行插件编程,如果开发者想在插件通过一个变量别名来引用主程序的变量,这该如何处理? 本文提供两个方法来实现这个目的,并通过两个简单的示例代码来进行演示。 文末有示例代码的下载地址。...main.c定义了一个全局变量数组,编译成可执行程序main。 plugin.c通过一个别名来使用main.c全局变量。...在plugin.c,提供一个函数func_init,当动态库被main dlopen之后,这个函数就被调用,并且把真正的全局变量的地址通过参数传入。

    1.2K20
    领券