嵌入式C语言之基础知识(一)

变量类型及作用域

关键字名称备注举例
auto自动变量
  • 一般用于声明局部变量,可以省略
  • 在声明区域内有效
  • 程序执行到该区域时自动创建,退出时销毁
  • 一般存储在程序的栈空间

void func(void)

{

    auto int i = 0;

    ...

}

extern外部变量
  • 用于声明全局变量
  • 在函数体外声明时,可以省略该关键字
  • 程序执行的整个生命周期内有效
  • 一般存储在程序的DATA段

extern int a = 0;

int b = 1;

void func(void)

{

    ...

}

register寄存器变量
  • 声明自动变量的一种特殊形式
  • 用于建议编译器把变量存储在寄存器内

void func(void)

{

    register int i = 0;

    while (i++ < 100)

    {

          ...

    }

}

static静态变量
  • 可以用于声明静态变量
  • 程序执行的整个生命周期内有效
  • 一般存储在程序的DATA段
  • 变量只初始化一次
  • 在函数体内声明时,作用域为该函数体
  • 在函数体外声明时,作用域为本文件

void func(void)

{

    static int i = 5;

    printf("%d\n", i);

    i++;

}

第一次:5

第二次:6

宏定义及位操作

宏定义用下面的格式来实现,它具有(a). 使得程序便于修改;(b). 提高程序运行效率;(c). 增加程序可读性等优点。在编译过程中,宏在预编译阶段会被展开。

#define 宏名[(参数)]  [宏体]

以下是几个用宏定义实现的位操作。

// 把data的第n位置位
#define SET_BIT(data, n) (data | (1 << n))

//把data的第n位清零
#define CLR_BIT(data, n) (data & ~(1 << n))

//把data的第n位反转
#define INV_BIT(data, n) (data ^ (1 << n))

关键字volatile

volatile的本意是易变的,可用于修饰变量,提醒编译器它后面所定义的变量随时都有可能改变,编译器不应对它进行优化或者使用缓存的值,而是每次都从对应的内存地址里面读取它的值。在嵌入式开发中,一般用于修饰指向寄存器的变量。比如一个寄存器的地址是0x8000A000,要读取它的值时就可以写成:

int value = *(volatile unsigned int *)0x8000A000;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值