본문 바로가기
임베디드SW/Software for 임베디드

나만의 전역 변수 사용법 feat. 임베디드 SW, C언어

by 바이너리 임베디드 2022. 8. 8.

 

나만의 전역 변수 사용법

 

임베디드 SW를 구현하다 보면 전역 변수를 쓰게 됩니다.

 

전역 변수는 소프트웨어를 구현할 때 매우 큰 도움을 줍니다.

 

그러나 너무 달콤함 녀석이기 때문에 너무 자주 먹으면 배탈이 나기 마련입니다.

 

그래서 적절하게 사용하는 것을 권합니다.

 

그런데 이 적절하게라는 것이 참 어렵습니다.

 

전역 변수 사용에 관해서 개발자들이 10명이면 10명 모두 다르게 정의하고 사용하고 있기 때문입니다.

 

그래서 지금까지 개발하면서 내가 지향하는 전역 변수의 사용법에 대해서 적어 보려고 합니다.

 

이것이 정답은 아니지만 누군가에게는 도움이 되었으면 좋겠다는 생각입니다.

 

나만의 전역 변수 사용법 feat. 임베디드 SW, C언어
나만의 전역 변수 사용법 feat. 임베디드 SW, C언어

 

 

내가 생각하는 지양해야 할 전역 변수 사용 Case

 

  • a.c 파일
  • #include a.h
    
    uint32_t TestCnt = 0;
    
    void Afunc(void)
    {
    	TestCnt++;
    }
    
    void Bfunc(void)
    {
    	TestCnt += 2;
    }
  • b.c 파일
  • #include b.h
    
    extern uint32_t TestCnt;
    
    void Cfunc(void)
    {
    	TestCnt++;
    }
     

 

A라는 담당자가 a.c 파일을 열심히 만들어서 TestCnt라는 전역 변수를 쓰고 있었습니다.

 

그런데 b.c 파일의 담당자가 TestCnt변수가 필요해서 b.c 파일에 extern으로 TestCnt를 선언해서 사용하게 됩니다.

 

A 담당자 입장에서는 TestCnt변수가 의도하지 않은 동작으로 인해 자신의 함수 동작이 이상하게 동작하는지 알지 못하게 됩니다.

 

아오~~ 정말 스트레스받는 상황입니다!!

 

 

이런 일은 개발을 하다 보면 비일 비재하게 발생하게 됩니다.

 

그럼 제가 지향하는 방식으로 위에 있는 코드를 바꿔 보겠습니다.

 

  • a.c 파일
  • #include a.h
    
    static uint32_t TestCnt = 0;
    
    void Afunc(void)
    {
    	IncreaseTestCnt();
    }
    
    void Bfunc(void)
    {
    	PlusTwoTestCnt();
    }
    
    void IncreaseTestCnt(void)
    {
    	TestCnt++;
    }
    
    void PlusTwoTestCnt(void)
    {
    	TestCnt += 2;
    }
    

 

  • a.h
  • #ifndef _A_H_
    #define _A_H_
    
    extern void IncreaseTestCnt(void);
    extern void PlusTwoTestCnt(void);
    
    #endif /* _A_H_ */
    

 

  • b.file
  • #include b.h
    #include a.h
    
    void Cfunc(void)
    {
    	IncreaseTestCnt();
    }
    
     

우선 TestCnt를 static 전역 변수로 변경하여 사용합니다.

 

이 의미는 a.c 파일에서만 TestCnt 변수를 사용하겠다는 의미입니다.

 

그런데 다른 파일에서 TestCnt 변수를 써야만 한다고 할 때는 TestCnt 변수를 제어하는 인터페이스를 하나 만들어서 a.h 파일에 extern으로 선언해 놓습니다.

 

그럼 b.c 파일에서 a.h 헤더를 인클루드 한 후, 제공해주는 API를 사용하여 TestCnt를 뿔뿔 해줍니다.

 

 

 

이렇게 되면 TestCnt라는 변수의 쓰임 정의를 A파일에서 해주게 되므로 A파일을 담당하는 담당자가 관리해줄 수 있게 됩니다.

 

그래서 제가 만든 전연 변수는 웬만하면 Static으로 선언해주고 외부에서 쓰여야 한다면 인터페이스 함수를 만들어서 제공해주고 있습니다.

 

전역 변수 제가 지향하고 있는 방식대로 한번 써보시길 추천드립니다 :)

 

마치며..

그리고 임베디드 SW를 처음 시작하여 공부하고 있는 분이라면 아래 카페에 오셔서 같이 공유의 장을 만들어 가면 좋을 것 같습니다.

 

https://cafe.naver.com/binaryembedded

 

임베디드 유니버스 : 네이버 카페

임베디드 유니버스 : 임베디드의 세계로 초대합니다.

cafe.naver.com

 

 

댓글