11051|0

525

帖子

235

TA的资源

版主

楼主
 

嵌入式编程知识点: “static, const, volatile”, “绝对地址访问”, “死循环”小结 [复制链接]

本帖最后由 wsdymg 于 2018-6-27 08:16 编辑

static:
  • 在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.
  • 在文件域内(但在函数体外),一个被声明为静态的变量可以被文件域内所有函数访问,但不能被文件域外其它函数访问。它是一个本地的全局变量.
  • 在文件域内,一个被声明为静态的函数只可被这一文件域内的其它函数调用。那就是,这个函数被限制在声明它的文件的本地范围内使用.


const:
只读(不能简单说“常数”)
Ø关键字const的作用是为给读你代码的人传达非常有用的信息
Ø使用关键字const能产生更紧凑的代码
Ø合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改
举例
  • const int a;  int const a;  // a是一个常整数
  • const int * a;              // a是一个指向常整数的指针
  • int * const a;              // a是一个指向整数的常指针


volatile:
阻止编译器优化
定义为volatile的变量是说这变量可能会被意想不到地改变.
优化器在用到这个变量时必须每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份
volatile变量使用的几种情况:



  • I/O接口电路的硬件寄存器(如:状态寄存器)
  • 中断服务子程序中会访问到的非自动变量
  • 多任务中被几个任务共享的变量


举例
  • volatile const unsigned char eventI2C;


声明只读的无符号字符变量 eventI2C
const:本程序不应该试图去修改它
volatile:可能被外界(硬件、其他进程)改变
  • // 例如这个求平方的函数
  • int square(volatile int *ptr)
  • {
  •     return (*ptr) * (*ptr);  // 这个会可能会出错, 因为在第二次寻址时如果被中断修改了 ptr 中的值, 则结果出错
  • }



访问绝对地址:
  • // ARM 中 UART寄存器定义, 很多器件的头文件中都可见到
  • #define ULCON0      (*(volatile unsigned long *)0x01D00000)
  • #define UCON0       (*(volatile unsigned long *)0x01D00004)
  • #define UFCON0      (*(volatile unsigned long *)0x01D00008)
  • #define UMCON0      (*(volatile unsigned long *)0x01D0000C)
  • #define UTRSTAT0        (*(volatile unsigned long *)0x01D00010)
  • #define UERSTAT0        (*(volatile unsigned long *)0x01D00014)
  • #define UFSTAT0     (*(volatile unsigned long *)0x01D00018)
  • #define UMSTAT0     (*(volatile unsigned long *)0x01D0001C)
  • #define UTXH0       (*(volatile unsigned long *)0x01D00020)
  • #define URXH0       (*(volatile unsigned long *)0x01D00024)
  • #define UBRDIV0     (*(volatile unsigned long *)0x01D00028)

死循环:
  • // 第一种:
  • while (1)
  • {
  •     // 这种最常见了, 就是条件一直为 1, 循环不止.
  • }
  • // 第二种:
  • for (;;)
  • {
  •     // 这种也很常见, 我倒觉得这个很好理解, 真正的无条件循环.
  • }

这两种循环编译后的结果现在已经没区别了, 因为很多编译器可以轻易的优化.

点赞 关注
个人签名爱电子,爱生活

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表