#申请原创#
@21小跑堂
在基于C语言的嵌入式开发中,static关键字的应用是比较多的,所谓static,翻译为静态的,主要用来修饰变量和函数,其修饰的变量存放在全局/静态存储区,可能这也是为何用static来表示此关键字的原因吧。 那具体怎么使用static呢?使用它到底有什么好处呢?我们一起来看看吧。 首先,可以使用static来声明静态局部变量。 所谓静态局部变量,也就是在函数内部用static修饰的局部变量,为了防止全局变量满天飞的情况出现,即限制变量的作用域仅在函数内部,又需要变量的生命周期延长到整个程序运行期间,此时你就可以使用static来声明一个局部变量,即为静态局部变量。 静态局部变量只需要初始化一次,下次调用函数的时候会保留上一次的值,默认初始化值为0。 其实很多时候都会用到静态局部变量,包括但不限于以下情况: 定时器中断服务程序里面需要通过累加计数来执行定时任务,这个计数值就可以加static来修饰,比如下面的每隔一定时间执行打印的代码: void TMR3_GLOBAL_IRQHandler(void)
{
static uint16_t printCnt = 0; //静态局部变量,累加计数
if(tmr_flag_get(TASK_TIMER_TYPE, TMR_OVF_FLAG) != RESET)
{
//set print interval
if(++printCnt >= 5000)
{
printCnt = 0;
debugPrintfFlag = TRUE;
}
tmr_flag_clear(TASK_TIMER_TYPE, TMR_OVF_FLAG);
}
}
又或者是一些需要**上一次状态的操作,比如下面的首次执行函数时需要操作一次配置的代码: static void adc_sample(void)
{
static uint8_t reg_config_flag = 0;
//sample config
if(0 == reg_config_flag)
{
reg_config_flag = 1;
adc_sequence_reg_config();
}
//add your code
}
这里需要注意一点: 对于元素较多的数组,如果栈空间资源有限,尽量不要声明为静态局部变量,因为大数组会占用大量栈空间,容易导致溢出,此时可以将大数组定义为全局变量。 其次,可以使用static来声明静态全局变量。 所谓静态全局变量,也就是在某个源文件里声明的,其作用域仅限当前文件的全局变量。同样地,为了增加代码的可读性,可维护性和健壮性,如果某个全局变量只用在某个源文件,此时你就可以将其声明为静态全局变量,这样,当其他文件试图调用它时,程序编译则会报错。 比如某个用于存放设备配置参数的全局变量g_DeviceConfigPara是通过函数读写接口来封装和操作的,这个时候你就可以将g_DeviceConfigPara声明为静态全局变量,主要代码如下: static uint8_t g_DeviceConfigPara = 0;
void set_device_para(uint8_t config_data)
{
g_DeviceConfigPara = config_data;
}
uint8_t get_device_para(void)
{
return g_DeviceConfigPara;
}
这样,其他源文件通过set_device_para和get_device_para两个函数接口来访问静态全局变量g_DeviceConfigPara就可以了,也不会出现全局变量到处飞的现象了。 最后,可以使用static来声明静态函数。 类似于静态全局变量,所谓静态函数,也就是所定义的函数的作用域仅在该源文件,其他文件无法调用此函数。当你看到某个函数的声明上加上了static,就说明该函数只用在该文件,一目了然,增加代码可读性。 以下代码展示了一个静态函数的定义和使用: //声明一个静态函数
static void adc_sample(void)
{
//add your code
}
//调用静态函数,外部调用adc_handle
void adc_handle(void)
{
adc_sample();
}
以上通过代码示例的方式讲解了static关键字在C语言嵌入式开发中的三种常见应用,希望能给大家提供一些参加价值,会的朋友给帖子点个赞也可以的~~。
|