修饰指针
常量指针(常指针),可以理解为常量的指针,即这个是指针,但指向的是个常量,const限定了指针指向空间的值不可修改;
指针常量,本质是一个常量。指针常量的值是指针,这个值因为是常量,所以不能被赋值。const限定了指针不可修改;
int i = 5;
int k = 10;
int const *p1 = &i; // 常量指针
int * const p2 = &k; // 指针常量
对于指针p1, const修饰的是*p1,即p1指向的空间的值不可改变,例如*p1 = 20;就是错误的用法;但是p1的值是可以改变的,例如p1 = &k;则没有任何问题。
对于指针p2, const修饰的是p2,即指针本身p2不可更改,而指针指向空间的值是可以改变的,例如*p2= 15;是没有问题的,而p2 = &i;则是错误的用法。
高阻态
很显然,当处理器从目标外设读数据时,我们希望其它没有被选上的芯片的数据总线不会对目标外设所要传送的数据有影响,那怎么办呢?实际上,当芯片没有被选中时,其数据总线都处于高阻态。
所谓的高阻态,我们可以理解成这一管脚在外设芯片内部是断开的,如此一来,显然不会对处理器从目标外设读取数据造成任何的影响了。我们说当一个芯片没有被选中或是没有被使能时,其数据总线一定是处于高阻态的。前面用了“门”的开和关来打比方,那“门”是指什么呢?是指外设的数据总线,片选信号的作用就是控制将外设的数据总线与处理器的数据总线相连或是断开。
static用法
常见的局部变量和全局变量的特点可简单概况为:
局部变量会在每次声明的时候被重新初始化(如果在声明的时候有初始化赋值),不具有记忆能力,其作用范围仅在某个块作用域可见;
全局变量只会被初始化一次,之后会在程序的某个地方被修改,其作用范围可以是当前的整个源文件或者工程。
static关键词在嵌入式开发中使用频率较高,可以在一定程度上弥补局部变量和全局变量的局限性。
驱动
总线上的数据是谁放上去的我们就说谁是那一时刻的驱动者。也就是说,当处理器向外设写数据时,它是在驱动数据总线的,而当处理器从目标外设读取数据时,目标外设是在驱动数据总线的。对于地址总线,因为只可能从处理器向目标外设写,所以地址总线永远是由处理器驱动的。当一个芯片没有被选中时,我们说它并不驱动数据总线。
静态局部变量
满足局部变量的作用范围,但是拥有记忆能力,不会在每次生命周期内都初始化一次,这个作用可来实现计数功能,例如:在下面这个函数中,变量num就是静态局部变量,在第一次进入cnt函数的时候被声明,然后执行自加操作,num的值就等于1;当第二次进入cnt函数的时候, num不会被重新初始化变成0,而是保持1,再自增则变成了2,以此类推, 其作用域仍然是cnt这个函数体内。
void cnt(void)
{
static int num = 0;
num++;
}