【嵌入式C语言】volatile关键字和const关键字

C语言中的volatile关键字

基本概念:在C语言中,volatile关键字修饰的变量是表示该变量是易变的,要求编译器不优化对该变量的读取。

当我们需要读取一个变量的值时,编译器为了加快访问速度,一般会在缓存中读取该变量的值,而不会直接去寄存器中去取值。我们在嵌入式开发时,经常要和各种开发板打交道,有时候寄存器的值并不是通过代码去修改的,而是某个芯片的外设修改的。也就是说,在嵌入式开发中,我们即使不通过程序修改寄存器的状态,寄存器的值可能也是变化的。加入我们在访问这种变量的时候不加volatile关键字,编译器默认会在缓存中取该变量的值,而这个值可能是一个旧值,该变量的真实值已经被外设等修改掉了,这就会出现问题,我们拿到的值并不是变量的最新值。加volatile关键字就是告诉编译器,不要进行优化,每次都去该变量的地址处去访问该值,这就保证了每次取到的都是变量的最新值

C语言中的const关键字

const用于定义一个常量,我们不能直接修改这个常量的值。

比如

const char str[] = "hello...";
//str[0] = 'a'; //编译不通过,提示不可修改

const关键字最基本的知识就是定义一个常量,其实在嵌入式中我们经常使用const定义常量来实现另一个目的。
我们知道,当我们定义一个变量或者字符串的时候,编译器会为这个变量分配内存(比如定义一个局部变量会在栈上分配内存,使用malloc为字符串在堆上分配内存等)。但是我们的堆栈内存是有限的,有时候我们希望一些变量特别是字符串不要占用堆栈内存,比如我们要打印一个字符串“hello C!”,这个字符串我们不需要对他进行任何修改,仅仅是打印这句话,并且有时候要打印很长一句话,这些长字符串会占用大量的堆栈内存,这是我们可以把他们定义为const常量,

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>


int main()
{
	const char str[] = "hello C!hello C!hello C!hello C!hello C!hello C!hello C!hello C!hello C!";

	printf("%s\n", str);

	system("pause");
	return 0;
}

const修饰的常量会存放在常量区,不会占用堆栈内存,这就达到了节省堆栈内存的目的。

posted @ 2022-03-09 21:11  Mindtechnist  阅读(14)  评论(0编辑  收藏  举报  来源