STM32에서 static 및 extern

3465 단어
오늘 직렬 통신으로 블루투스 데이터를 수신하여 중단을 일으켰습니다. 어떤 엉뚱한 시작 파일에 계속 끼어 있는 것을 발견했습니다. 여러 번 검사를 했지만 문제를 발견하지 못했습니다. 마지막으로 문제를 받아들인 데이터의 변수는 국부 변수일 뿐이고 초기 값을 부여하지 않았습니다. 그래서 순서는 함수 운행을 중단하는 것뿐입니다. 그래서 앞으로 변수를 쓸 때 반드시 초기화해야 합니다.
 
void USART1_IRQHander(void)
{
	static u8 r;
	
	TIM_Cmd(TIM1,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷
	if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
	{
		r = USART_ReceiveData(USART1);
		USART_SendData(USART1,r);
		if(r == 'a')
		{
			PWMA += 100;
			if(PWMA >7199)
			{
				PWMA = 5000;
			}
		}
		if(r == 'c')
		{
			PWMA -= 100;
			if(PWMA <5000)
			{
				PWMA = 5000;
			}
		}
		if(r == 'b')
		{
			PWMB += 100;
			if(PWMB >7199)
			{
				PWMB = 5000;
			}
		}
		
	  while(USART_GetITStatus(USART1,USART_IT_TC) != SET);
	}
	USART_ClearITPendingBit(USART1,USART_FLAG_TC);
	TIM_Cmd(TIM1,ENABLE);//¿ªÆô¶¨Ê±Æ÷
}

static와 extern을 다시 한 번 말씀드리겠습니다.
static는 함수 내부에서 변수를 0으로 초기화하고 다음에 이 변수의 값을 호출할 때 지난번 변수 값이지만 같은 파일에서만 변수 값을 전달할 수 있습니다. static로 정적 전역 변수를 성명하면 정적 국부 변수와 일치합니다.
extern은 전역 변수에 대한 성명에 사용되며, 보통 헤더 파일에서 성명하며, 전역 변수 값을 여러 파일 사이에서 전달할 수 있습니다
 
 
참고할 블로그 내용
https://www.cnblogs.com/King-Gentleman/p/5350563.html
1. 역할 영역에서 볼 때:
C++ 변수는 정의된 위치에 따라 라이프 사이클에 따라 역할 영역이 달라지며 역할 영역은 6가지로 나눌 수 있습니다.
전역 작용역, 국부 작용역, 문장 작용역, 클래스 작용역, 명명 공간 작용역과 파일 작용역.
1> 글로벌 변수는 전역 역할 영역을 가집니다.전역 변수는 하나의 원본 파일에 정의만 하면 모든 원본 파일에 작용할 수 있습니다.물론 전역 변수 정의가 포함되지 않은 다른 원본 파일은 extern 키워드로 전역 변수를 다시 설명해야 합니다.
2> 정적 국부 변수는 국부 작용역을 가지고 있으며 한 번만 초기화된다. 첫 번째 초기화부터 프로그램 실행이 끝날 때까지 계속 존재한다. 전역 변수와 다른 점은 전역 변수는 모든 함수에 대해 볼 수 있고 정적 국부 변수는 자신을 정의하는 함수체에만 항상 볼 수 있다는 것이다.
3> 국부 변수도 국부 작용역만 있고 자동 대상(auto)이다. 프로그램이 실행되는 동안 계속 존재하지 않고 함수 실행 기간에만 존재한다. 함수의 한 번 호출 실행이 끝난 후에 변수는 취소되고 그들이 차지하는 메모리도 회수된다.
4> 정적 전역 변수도 전역 작용 영역을 가진다. 전역 변수와 전역 변수의 차이점은 프로그램이 여러 개의 파일을 포함하면 그 변수를 정의하는 파일에 작용하고 다른 파일에 작용하지 않는다는 것이다. 즉static 키워드로 장식된 변수가 파일 작용 영역을 가진다는 것이다.이렇게 하면 두 개의 서로 다른 원본 파일이 같은 이름의 정적 전역 변수를 정의하더라도 그것들도 서로 다른 변수이다.
2. 할당된 메모리 공간을 보면 다음과 같습니다.
1> 전역 변수, 정적 국부 변수, 정적 전역 변수는 모두 정적 저장소에서 공간을 분배하고 국부 변수는 창고에서 공간을 분배한다
2> 글로벌 변수 자체가 정적 저장 방식이고 정적 글로벌 변수도 당연히 정적 저장 방식이다.이 두 가지는 저장 방식에 있어서 결코 다르지 않다.이 두 가지 차이는 비정상적인 전역 변수의 작용역은 전체 원본 프로그램이지만 하나의 원본 프로그램이 여러 개의 원본 파일로 구성될 때 비정상적인 전역 변수는 각 원본 파일에서 모두 유효하다는 데 있다.정적 전역 변수는 그 역할 영역을 제한한다. 즉, 이 변수를 정의한 원본 파일에서만 유효하고 같은 원본 프로그램의 다른 원본 파일에서는 사용할 수 없다.정적 전역 변수의 작용역은 하나의 원본 파일에 국한되어 있기 때문에 이 원본 파일의 함수만 공용할 수 있기 때문에 다른 원본 파일에서 오류를 일으키지 않도록 할 수 있습니다.
1) 전역 변수, 정적 전역 변수 및 정적 국부 변수는 모두 프로그램의 정적 데이터 저장소(전역적으로 볼 수 있음)에 놓여 다음 호출 시 원래의 값을 유지할 수 있다.이 점은 그것들과 퇴적 변수, 퇴적 변수의 차이이다.
2) 정적 변수(정적 국부 변수와 정적 전역 변수 포함)는static로 컴파일러에게 변수의 작용 범위 내에서만 볼 수 있음을 알려준다.이 점은 그것과 전체 변수의 차이점이다.
이상의 분석을 통해 알 수 있듯이 국부 변수를 정적 변수로 바꾸면 저장 방식이 바뀌고 생존 기간이 바뀐다.전역 변수를 정적 변수로 바꾼 후 역할 영역을 바꾸어 사용 범위를 제한했다.따라서 static이라는 설명부호가 서로 다른 곳에서 작용하는 것은 다르다.주의를 기울여야 한다.
Tips:
A. 전역 변수가 단일 C 파일에서만 접근할 경우 이 변수를 정적 전역 변수로 수정하여 모듈 간의 결합도를 낮출 수 있다.
B. 전역 변수가 단일 함수로만 접근할 경우 이 변수를 이 함수의 정적 국부 변수로 변경하여 모듈 간의 결합도를 낮출 수 있다.
C. 동적 전역 변수, 정적 전역 변수, 정적 국부 변수에 접근하는 함수를 설계하고 사용할 때 리셋 문제를 고려해야 한다. 왜냐하면 그들은 모두 정적 데이터 저장 구역에 놓아서 전역적으로 볼 수 있기 때문이다.
D. 만약에 우리가 다시 들어갈 수 있는 함수가 필요하다면 함수에static 변수를 사용하는 것을 피해야 한다(이런 함수는'내부 메모리'기능을 가진 함수라고 부른다)
E. 함수에서 static 변수를 사용해야 하는 경우: 예를 들어 함수의 반환 값이 포인터 유형일 경우 static의 국부 변수의 주소를 반환 값으로 하고 auto 유형일 경우 잘못된 포인터로 되돌려야 한다.
전재 대상:https://www.cnblogs.com/baiji/p/11438765.html

좋은 웹페이지 즐겨찾기