static意为静态的,如果在一个函数中定义了一个静态变量,第一次调用这个函数时且赋值后这个变量将会存在于内存中,该函数运行结束后,该变量不会被释放。当你再次调用该函数时,这个静态变量不会被重新建立。如果在Keil中你在一个.C文件中定义了一个带static关键字的函数或定义了一个静态的变量,其作用域只限定在该.C文件内,在其他文件内无法进行调用,即使用extern也会报错,提示你该变量未定义。(错误类型可能是 error: #114: function "PWM_GPIO_Config" was referenced but not defined)
例如我现在有一个unit_config.c、unit_config.h、main.c三个文件
首先在unit_config.c里对静态函数进行定义
//unit_config.c
static void PWM_TIMx_Config(void)
{
...
}
static void PWM_GPIO_Config(void)
{
...
}
其次在unit_config.h内对静态函数进行声明
//unit_config.h
#ifndef __UNIT_CONFIG_H
#define __UNIT_CONFIG_H
static void PWM_GPIO_Config(void);
static void PWM_TIMx_Config(void);
#endif
在mian.c中调用这两个静态函数就会报错
//main.c
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"
int main(void)
{
PWM_GPIO_Config();
PWM_TIMx_Config();
while(1)
{
}
}
报错内容是:
error: #114: function "PWM_GPIO_Config" was referenced but not defined
static void PWM_GPIO_Config(void);
error: #114: function "PWM_TIMx_Config" was referenced but not defined
static void PWM_TIMx_Config(void);
为了防止这种情况发生,可以在unit_config.c和unit_config.h内稍做变化,在unit_config.c内定义一个函数,在这个函数内调用你所需要的静态函数,这两个静态函数就可以间接被main.c调用了。
//unit_config.c
void PWM_Config(void)
{
PWM_GPIO_Config();
PWM_TIMx_Config();
}
//unit_config.h
void PWM_Config(void);
在mian.c内调用这个函数就不会报错了。
//main.c
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"
__IO u32 TimingCounter=0;
int main(void)
{
PWM_Config();
while(1)
{
}
}