임베디드

HAL 함수 분석

sdafdq 2025. 9. 13. 08:43

저번에도 말 했지만, 일단은 HAL은 하드웨어 가상 층의 약자.

 

원래는 회로 동작으로 제어해야 할 하드웨어를, 가상적으로 하드웨어로 제어하는 것.

 

 

 

분석할 함수

HAL_Init()

MX_GPIO_Init()

HAL_GPIO_WritePin(핀포트, 핀, 쓸지안쓸지.)

 

먼저 HAL_Init()

여기에 

#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()

내부에 이 함수를 사용하는데, #define 쫌 오래되서 까먹음.

 

#define은 상수 정의용으로, 

전처리기라고 해서 컴파일 하기 전에 처리된다. 그래서, 걍 어디서든 쓸 수 있는걸로 앎.

 

근데 저거는 단순 텍스트 치환용임. 그래서 변수 주소 찾아서 값 찾아오는 그런 상수같은 느낌이랑은 좀 다름.

걍 단순하게 텍스트를 치환해버리는 거.

 

단점은 타입 안정성 없음. 걍 치환해버리는거니. 

 

그래서 현대에서는 뭐 const라고 따로 나왔나 봄. 상수 정의용으로는. 

매크로 함수도 

#define SQUARE(x) x * x
int result = SQUARE(3 + 2); // 3 + 2 * 3 + 2 = 11 (의도한 25 아님)
// (3 + 2) * (3 + 2)가 되는게 아니고 그대로 치환시켜버리는 거라.

이렇게 그대로 치환시켜주는거라, 의도한 답과 다를 수 있음.

 

근데, 임베디드 시스템은 코드도 적고 자원 소모에 신경을 많이 써야 해서, 이거 씀.

함수 호출은 뭐 돌아올 주소, 이런 거 다 내부적으로 메모리에 저장해야 되서, 오버헤드가 좀 있음.

범용컴퓨터는 성능이 꽤 괜찮으니 걍 쓰는데, 임베디드는 싸이클이고, 성능이 제한적이니.

 

근데 저거는 그냥 치환이니, 따지고 보자면 하드코딩이나 마찬가지.

 

위의 저런 경우만 좀 조심해서 사용하면 될 듯.

 

 

또 주의점.

#include해서 헤더로 포함 시, 여러 c파일이나 h파일에서 사용할 수 있는데,

그럴 경우 겹칠 수 있음.

 

그럴 경우 헤더가드를 쓰거나 한다.

근데 그래도 같은 이름 전처리기로 쓰는 건 주의를 해야 할 듯.

 

아마 줄 순서에 따라 바뀔 듯.

 

#define MAX 100

#define MAX 50

이면 50일 듯.

 

#define MAX 100

#define MAX 50

#include "config.h"

했는데 저기 안에 MAX 25면 25가 될 듯.

 

# 들어가 있는 건 다 전처리기 작업이니.

 

 

 

여튼 전처리기 이야기 했고,

 

저 HAL_Init()

HAL 라이브러리에 대하여 초기화 하는 함수 살펴 보겠음.

 

들어가 보면,

 

HAL_StatusTypeDef HAL_Init(void)
{
  /* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
    defined(STM32F102x6) || defined(STM32F102xB) || \
    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
    defined(STM32F105xC) || defined(STM32F107xC)

  /* Prefetch buffer is not available on value line devices */
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

  /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  HAL_InitTick(TICK_INT_PRIORITY);

  /* Init the low level hardware */
  HAL_MspInit();

  /* Return function status */
  return HAL_OK;
}

이렇게 되어 있음.

 

걔중에서,

__HAL_FLASH_PREFETCH_BUFFER_ENABLE();

이거 먼저.

 

HAL라이브러리는 여러 파일로 나눠놨음.

설정같은 건 h파일에, 실제로 좀 계산되는 함수는 c파일로 해놨나 봄. 

위에 함수같은게 c파일.

 

c도 여러개, h도 여러 개.

 

__HAL_FLASH_PREFETCH_BUFFER_ENABLE();

이거는, HAL 라이브러리 중 h 파일 하나에

 

#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTBE)

 

이렇게 정의되어 있음.

 

 

 

'임베디드' 카테고리의 다른 글

1. OT  (0) 2026.01.29
HAL 라이브러리 안 쓰고 LED 제어 구현  (0) 2025.09.13
GPIO 제어해보기  (0) 2025.09.09
임베디드 코드  (0) 2025.09.09
코드 입력 주의점  (0) 2025.09.09