정적 변수 수정
1 변형 정적 블록 변수를 사용하여
- 이는 정적 저장 기간, 블록 범위와 연결하지 않고있다.
변수는 프로그램이 종료 할 때 종료 프로그램이 로딩 될 때 생성되고, 그 범위는 블록의 블록 외부에 호출 될 수 없다. - 그것은 단지 컴파일시에 한 번 초기화. 당신이 명시 적으로 초기화하지 않는 경우, 0 기본적으로 초기화.
#include <stdio.h>
void trystat(void);
int main(void)
{
int count;
for (count = 1; count <= 3; count++)
{
printf("Here comes iteration %d:\n", count);
trystat();
}
return 0;
}
void trystat(void)
{
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %d\n", fade++, stay++);
}
程序执行结果 :
여기서 반복되어 1 :
페이드 = 1 = 1로 유지
여기서 온다 반복 2 :
페이드 = 1 = 2를 유지
여기에서 반복되어 3 :
페이드 = 1 유지 = 3
여기서 변수가 (1) stay
,이 개시로부터로드 된 프로그램이 종료 될 때까지 존재한다. 그러나,이 범위로 한정되는 trystat()
기능 블록. 이 기능이 실행되는 경우에만 프로그램을 사용할 수 있습니다 stay
그것은 특정 개체에 액세스 할 수 있습니다.
(2) 변수는 stay
그 값이 1 씩 증가 기억하지만 페이드 변수마다 다시 시작한다. 그것은 초기화의 차이점을 지적 : fade
에서 trystat()
각 통화의 재 초기화를하고, stay
변수는 한 번만 초기화됩니다.
제자리에 이미 후 (3) 프로그램의 정적 변수가 메모리로로드된다. 문 static int stay = 1;
trystat () 함수에 만 허용하는 컴파일러를 알려줍니다 trystat()
함수가 변수를 확인할 수를, 그것은 문이 실행시 실행되지 않습니다.
도 2는 임의의 함수의 외부 정적 변수를 사용하여 수정
- 그것은 정적 저장 시간, 파일 범위 및 내부 링크가 있습니다.
현재 파일에서 그 범위는 (기능은 동일한 파일에 사용할 수있다), 다른 파일에 의해 호출 할 수 없습니다 - 그것은 단지 컴파일시에 한 번 초기화. 당신이 명시 적으로 초기화하지 않는 경우, 0 기본적으로 초기화.
정적 수정 기능을 사용하여
- 범위는 멀티 파일 함수 이름 충돌의 가능성을 방지하기 위해 파일의 사용이 현재 정의 된 제한합니다. 인터페이스의 기능, 따라서 다른 파일이 동일한 함수 이름 충돌을 사용 방지, 정전기 수정 사용을 권장하지 않는 한 일반적으로 파일.
static BOOL wavTaskCreated = FALSE;
static QueueHandle_t wav_msg_queue = NULL;
static WAV_PLAY_QUEUE_t wavPlayQueue;
static bool wav_get_version_flag = false;
static char wav_version[32];
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type)
{
}
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName)
{
}
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo)
{
}
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size)
{
}
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size, uint32_t volume)
{
}
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR)
{
}
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType)
{
}
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type)
{
}
void Wav_Init(void)
{
DA_Init(16000);
if (!wavTaskCreated)
{
wavTaskCreated = TRUE;
xTaskCreate(wav_task, "WAV", STACK_SIZE_TASK_WAV, NULL, PRIORITY_TASK_WAV, NULL);
wav_msg_queue = xQueueCreate(WAV_MSG_QUEUE_LENGTH, sizeof(WAV_MESSAGE_t));
wavPlayQueue.pWavTypeTable = malloc(WAV_PALY_QUEUE_MAX * sizeof(WAV_TYPE_t));
}
wavPlayQueue.front = 0;
wavPlayQueue.end = 0;
wavPlayQueue.sizeNow = 0;
wavPlayQueue.totalSize = WAV_PALY_QUEUE_MAX;
}
bool Wav_Play(WAV_TYPE_t wav_type, bool force)
{
if (!wavTaskCreated)
{
return false;
}
if (force)
{
vPortEnterCritical();
watchdog_feed();
Wav_Play_Inernal(wav_type);
vPortExitCritical();
return true;
}
bool rv = Wav_Put_Queue(wav_type, false);
vTaskDelay(30);
return rv;
}
위의 사용 브로드 캐스트 WAV DA 플랫폼 프로그램 조각이다,
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type);
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName);
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo);
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size);
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size, uint32_t volume);
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR);
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType);
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type);
내부 기능에 대한 전술 한 기능을 static
변경.
void Wav_Init(void);
bool Wav_Play(WAV_TYPE_t wav_type, bool force);
이것은 두 개의 기능 모듈 인터페이스 정적 변형을 사용하지 않고, 외부 호출 (DA 초기화 기능 WAV 플레이)했다.