目录

  • (一) 详解const、static和volatile
    • 1、static关键字的作用
    • 2、volatile关键字的性质
    • 3、const关键字的作用
    • 4关键字的组合使用

嵌入式C语言编程中经验教训总结

C语言是目前主流的系统编程语言,而嵌入式C语言,是C语言在嵌入式系统中的扩展,不同于pc平台,嵌入式的cpu处理器可以说是五花八门,高中低档齐全,架构也不相同,所以,嵌入式的c程序编写往往具有鲜明的系统特征,例如会涉及到操作硬件,需要自己编写操作硬件的函数,可用的内存就是芯片上的ram空间,处理器的性能大体决定了程序的运行速度,处理器的资源配置也决定了可用资源的多少。嵌入式C程序在编译链接完成后,一般会有如下的输出:


在Program Size行中我们可以看到:

  1. Code,全程为Readonly code Memory,为只读代码段
  2. RO-data,全程为Readonly data Memary 只读数据段
  3. RW-data,readwrite data Memary 读写数据段
  4. ZI-data,Zero Initialize,没有初始化,默认初始化0的可读写变量的大小

通常地说,我们编写的代码大小,也就是最终烧写到处理器FLASH中的空间就是:Code + RO Data + RW Data,而程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data,在嵌入式的c语言中,我们如何确定或分配这些空间昵,这就是const、static和volatile的主要作用。

(一) 详解const、static和volatile

1、static关键字的作用

在嵌入式C语言中static有下性质:

  • (1)声明变量:
    在函数体中,一个被声明为静态的变量在这一函数被调用过程中只会被分配一次内存,且整个运行期间不会重新分配;在函数体外、本源文件内,该变量只能该源文件内的所有函数访问,但不能被其他源文件的函数访问。它是一个本地的全局变量,即便extern外部声明也不可以。

    (2) 声明函数
    在某源文件内,一个被声明为静态的函数仅仅只可以被该源文件的其它函数调用。也就是说,这个函数被限制在声明它的源文件的本地范围之内使用。
    举例如下:
    int fun_Test(void)
    {
    unsigned char test_A=0;
    static unsigned char test_B=0;
    test_A++;
    test_B++;
    }
    调用上面的fut_Test()函数就会发现,每次调用该函数的时候,test_A++被执行后,其值只能是1;test_B就会一直的加下去,直到加到255,达到最大值溢出变成0,也就是说,普通的变量在执行完函数后,其内存的空间将会被释放,但是Static所修饰的变量的内存空间将不会被释放,虽然调用函数的时候,有对test_B进行了初始化,语句也会被跳过。

2、volatile关键字的性质

volatile 中文解释是易变的,作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。在我们的编辑器中,常常会将我们的代码优化,提高代码的执行速度,但如果有一个语句没有写操作,或者是读取操作,编辑器就自作聪明的保存了该内存空间的某一时刻的值, 用于以后的计算,虽然该内存单元中内容改变了,但是程序中用到的变量还是该时刻的保存值,多以会出现一些意想不到的错误,而Volatile的作用就是提醒编译器,这个内存单元空间中的内容是在变动的,编译器优化的时候每次都从变量的内存地址读取,而不是从寄存器或者cache缓存中读取。常常在下面几种情况下,须使用volatile:

1:多线程环境下,一个线程使用的全局变量,但是他的值会被其他线程更新的情况下。

  1. 变量可能被中断处理程序更新

3:对数据采集类应用,外部传感器数据映射到内存单元的寄存器

如果系统有完备的信号量、中断或消息机制,volatile并非不可或缺,但volatile关键字提供了一个简单可靠的快速响应外界变化的方法,虽然反复操作效率有点低。

3、const关键字的作用

const定义的变量,也称常量,更准确的说const变量一旦初始化完成后,是不能被修改的,始终都是不变的,一旦申明后就不能被修改了,嵌入式c语言中 ,const 全局变量存储在RO Data数据段,而const局部变量存储在栈中,代码块结束时释放。

嵌入式程序中,在存储空间分配上,变量加const修饰符,会存储在flash中而不是ram中,通常,flash空间会比ram空间大好多倍,这就有效的节省了ram空间的占用。
例如:const double PI = 3.141599265;

上面定义了const变量PI,定义后,在其他程序中,是无法对PI进行修改赋值的,这就保证了整个 系统中PI的一致性,不会因为其他有的地方重新定义PI=3.14等带来的精度误差。

4关键字的组合使用

上面的关键字也可以组合使用,例如:
static const规定变量在当前的模块中是只读的变量,无法被全局中被其他模块读取。例如对公司log图片点阵,我们当然不希望在不同模块中展示的log会出现不一致,如果我们如下定义:

static const unsignedi char LogDitArray[16384] ={0x00,0x00,0xC0,0xC0,0xC0,0x80,0x00,0x80,
。。。 。。。
0x00,0x00,0xC0,0xC0,0xC0,0x80,0x00,0x10
}

编译之后可在.map文件看到其分配到flash存储空间,且只能在本模块使用

嵌入式C语言编程中经验教训总结(一) 详解const、static和volatile相关推荐

  1. 嵌入式C语言编程中经验教训总结(二)LDS链接文件解析

    目录 为什么要用到lds链接脚本? lds文件语法结构 lds文件实例解析 好的朋友已经做过好多年的arm开发,却对底层的编译链接逻辑很少接触,主要原因在于现在大多数应用层的开发不需要从裸板开始,工程 ...

  2. 【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )

    文章目录 I . List 集合高阶函数引入 II . Kotlin 数据类 ( data class ) III . Java 代码 与 Kotlin 代码实现对比 ( 查询年龄最大的 ) IV . ...

  3. C语言易混淆关键词详解-const, static, extern, typedef, 声明

    Const Const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能 ...

  4. 【转】 嵌入式C语言编程中Inline函数的应用

    源地址:https://blog.csdn.net/vigour1000/article/details/9622037 有一段儿时间没写写经验笔记了,哎,也是自己这一段时间以来(其实最近一直是这个状 ...

  5. python惰性求值的特点_C#教程之C#函数式编程中的惰性求值详解

    https://www.xin3721.com/eschool/python.html 惰性求值 在开始介绍今天要讲的知识之前,我们想要理解严格求值策略和非严格求值策略之间的区别,这样我们才能够深有体 ...

  6. python编程顺序_Python编程中归并排序算法的实现步骤详解

    基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止.然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元 ...

  7. php socket recv 超时,socket编程中的超时设置示例详解之一

    简介: 在网络通讯中,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题. 所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回. 在我们直接调用s ...

  8. c语言在数学方面的应用编程,浅谈数学在C语言编程中的应用.doc

    浅谈数学在C语言编程中的应用 浅谈数学在C语言编程中的应用 [][]C语言对学习者的数学基础要求较高对一部分学生来说学好C语言有一定的困难.本文就本专业知识和自身对C语言的学习经验对数学在C语言编程中 ...

  9. c语言中错误executing,C语言编程中常见问题解读.doc

    C语言编程中常见问题解读 为什么vc6打开的文件却不能编译1 为什么一个vc6工程中有两个main函数不能编译成功?我想写两个程序怎么办?2 为什么v6不能编译程序,生成信息说compile和link ...

  10. 《C语言解惑》—— 第一篇 C语言编程中的对与错

    本节书摘来自华章出版社<C语言解惑>一 书中的第1章,第1.1节,作者:刘振安 刘燕君,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 C语言编程中的对 ...

最新文章

  1. 干掉 Postman?测试接口直接生成API文档,这个文档工具真香!
  2. 【c语言】蓝桥杯算法训练 整除问题
  3. 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- 组件的使用...
  4. 地铁7号线路图_南京地铁S1号线机场线,都经过哪些地方?如何查询地铁换乘?查询站点信息?...
  5. android sqlite 参数,Android SQLite3命令详解教程
  6. 两个摄像头合成一路_三星推出全新摄像头光电传感器ISOCELL GN1,性能直奔HM1
  7. Web前端笔记-two.js画三角形及画tip含tip旋转
  8. osx+配置+php扩展,Mac系统升级到10.9(mavericks)时安装php扩展问题解决
  9. 服务器生成php文件夹下,PHP创建文件以供下载,而不在服务器上保存
  10. 晚上无聊象征性收取了网友100元辛苦费,实现支持多语言功能的XML语言包版的C#的ASP.NET多语言支持例子程序...
  11. api下载文件三种方式
  12. Java Web架构知识整理
  13. linux中so文件如何打开,安卓手机如何打开.so文件?
  14. 用matlab音频欠采样率时域采样,matlab时域采样定理.doc
  15. office 2016 官方完整版
  16. html绘图插件,canvas,svg,vml绘图插件
  17. 多旋翼无人机技术详解
  18. 变身成为互联网设计师
  19. T470P笔记本安装固态以及固态中安装系统_完整步骤
  20. vue-seamless-scroll 使用

热门文章

  1. 国科大 - 模式识别与机器学习(黄庆明等)- 期末复习 - 试卷
  2. BP神经网络及其学习算法
  3. 【OpenCV】特征检测器 FeatureDetector
  4. FastReport VCL组件,面向频带的报告生成器
  5. 安装和卸载IE浏览器
  6. 「经济理财」 简七理财之小白理财入门篇9堂课
  7. vue-video-player文档_vue使用video和vue-video-player并且可实现视频铺满呦
  8. ResourceBundle 用法
  9. sftp 中文乱码 连接后_LINUX SFTP 中文 乱码
  10. Zune WIFI无线同步教程