[技术讨论] 【C语言实战经验10】static关键字的常见用法

[复制链接]
 楼主| dffzh 发表于 2025-7-18 08:52 | 显示全部楼层 |阅读模式
#申请原创#
@21小跑堂


在基于C语言的嵌入式开发中,static关键字的应用是比较多的,所谓static,翻译为静态的,主要用来修饰变量和函数,其修饰的变量存放在全局/静态存储区,可能这也是为何用static来表示此关键字的原因吧。
那具体怎么使用static呢?使用它到底有什么好处呢?我们一起来看看吧。
首先,可以使用static来声明静态局部变量。
所谓静态局部变量,也就是在函数内部用static修饰的局部变量,为了防止全局变量满天飞的情况出现,即限制变量的作用域仅在函数内部,又需要变量的生命周期延长到整个程序运行期间,此时你就可以使用static来声明一个局部变量,即为静态局部变量。
静态局部变量只需要初始化一次,下次调用函数的时候会保留上一次的值,默认初始化值为0。
其实很多时候都会用到静态局部变量,包括但不限于以下情况:
定时器中断服务程序里面需要通过累加计数来执行定时任务,这个计数值就可以加static来修饰,比如下面的每隔一定时间执行打印的代码:
  1. void TMR3_GLOBAL_IRQHandler(void)
  2. {
  3.     static uint16_t printCnt = 0;  //静态局部变量,累加计数

  4.     if(tmr_flag_get(TASK_TIMER_TYPE, TMR_OVF_FLAG) != RESET)
  5.         {
  6.         //set print interval
  7.         if(++printCnt >= 5000)
  8.                 {
  9.                         printCnt = 0;
  10.                         debugPrintfFlag = TRUE;
  11.                 }   
  12.         tmr_flag_clear(TASK_TIMER_TYPE, TMR_OVF_FLAG);
  13.         }                       
  14. }
又或者是一些需要**上一次状态的操作,比如下面的首次执行函数时需要操作一次配置的代码:
  1. static void adc_sample(void)
  2. {
  3.         static uint8_t reg_config_flag = 0;

  4.     //sample config
  5.         if(0 == reg_config_flag)
  6.         {
  7.             reg_config_flag = 1;
  8.             adc_sequence_reg_config();
  9.         }
  10.         //add your code
  11. }
这里需要注意一点:
对于元素较多的数组,如果栈空间资源有限,尽量不要声明为静态局部变量,因为大数组会占用大量栈空间,容易导致溢出,此时可以将大数组定义为全局变量。
其次,可以使用static来声明静态全局变量。
所谓静态全局变量,也就是在某个源文件里声明的,其作用域仅限当前文件的全局变量。同样地,为了增加代码的可读性,可维护性和健壮性,如果某个全局变量只用在某个源文件,此时你就可以将其声明为静态全局变量,这样,当其他文件试图调用它时,程序编译则会报错。
比如某个用于存放设备配置参数的全局变量g_DeviceConfigPara是通过函数读写接口来封装和操作的,这个时候你就可以将g_DeviceConfigPara声明为静态全局变量,主要代码如下:
  1. static uint8_t g_DeviceConfigPara = 0;

  2. void set_device_para(uint8_t config_data)
  3. {
  4.     g_DeviceConfigPara = config_data;
  5. }

  6. uint8_t get_device_para(void)
  7. {
  8.     return g_DeviceConfigPara;
  9. }
这样,其他源文件通过set_device_para和get_device_para两个函数接口来访问静态全局变量g_DeviceConfigPara就可以了,也不会出现全局变量到处飞的现象了。
最后,可以使用static来声明静态函数。
类似于静态全局变量,所谓静态函数,也就是所定义的函数的作用域仅在该源文件,其他文件无法调用此函数。当你看到某个函数的声明上加上了static,就说明该函数只用在该文件,一目了然,增加代码可读性。
以下代码展示了一个静态函数的定义和使用:
  1. //声明一个静态函数
  2. static void adc_sample(void)
  3. {
  4.         //add your code
  5. }

  6. //调用静态函数,外部调用adc_handle
  7. void adc_handle(void)
  8. {
  9.     adc_sample();
  10. }
以上通过代码示例的方式讲解了static关键字在C语言嵌入式开发中的三种常见应用,希望能给大家提供一些参加价值,会的朋友给帖子点个赞也可以的~~。

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

本版积分规则

109

主题

1164

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部