[FreeRTOS] 2. 포팅

시작-STM32 새 프로젝트 만들기

  • File > New > STM32 Project
  • Board Selector > Commercial Part Number > 자신의 보드 ( 제껀 NUCLEOF411RE ) > Next
  • 프로젝트 이름 입력 > Next > Yes > Yes
  • 첫 프로젝트 생성시 패키지를 다운받게된다.
    • 핫스팟 환경이라서 너무 느리다..🥱
    • HAL, CMSIS 등이 깔리는 중이다.
  • 전부 설치하면 화면이 나온다
  • middle ware > FreeRTOS> 인터페이스 > CMSIS V1> 저장
    • .ioc에서 설정을 변경하고 저장하면 코드가 설정에 맞게 업데이트 된다.
    • 우선순위 갯수도 늘려보자
      MAX Priorities ( 우선순위 갯수 ) 7 > 20
    • 저장하면 값이 변경된다.

원하는 파일 빨리찾기

  • Seach > FileSearch 로 원하는 코드를 빨리 찾자
  • 이렇게 코드를 찾는 건 이클립스 툴들 공통된 사항이다.
  • osKernelStart() 를 찾은 결과다.
    • vTaskStartScheduler() : FreeRTOS의 멀티태스킹 함수 이다.
    • CMSIS함수는 이렇게 껍데기만 덮어씌운 함수들이 많다.
    • 이렇게 덮어져 있는 함수를 '레퍼함수' 라고 한다.
  • CMSIS
    • ARM 사가 만든 ARM 코어들이 모두 호환할 수 있게 사용하는 그런 라이브러리.

포팅

  • osKernelStart()를 통해 멀티태스킹에 필요한 스케쥴러 함수를 부를 수 있다.
    • os 로 시작하는 함수들의 특징 : 어떤 OS가 사용되던, 사용 가능하다.
  • 메인문에서 StartDefaultTask() 함수를 내 마음대로 바꿔서 사용해보자.
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
	printf("\r\n[TASK]StartDefaultTask \n"); // <-
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END 5 */
}
  • 하지만, printf()가 되지 않음을 확인할 수 있다.

printf()를 뚫어보자

  • 다른 printf 를 뚫기위해, 다른 예제들에서 main.c 에 있는 이 코드를 긁어서, 우리 코드에 넣어야 한다.
int __io_putchar(int ch)
{
 if ( ch == '\n' )
	 HAL_UART_Transmit(&huart2, (uint8_t*)&"\r", 1, HAL_MAX_DELAY);
 HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
 return ch;
}
  • UART로 printf에 있는 버퍼들을 보내는 코드이다.
  • USER_CODE_BEGIN ~ END 사이에 넣자. 그래야 코드 업데이트 시 삭제가 안됨
  • UART로 printf() 가 뚫린 모습을 볼 수 있다.

LED 도 켜보자

  • main.c > MX_GPIO_Init() 코드에 있는 LED 코드를 들고오자.
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
  • 우리의 Task 함수도 0.5초에 한번씩 LED가 깜빡이게 고쳐보자.
void StartDefaultTask(void const * argument)


{
  /* USER CODE BEGIN 5 */
	printf("\r\n[TASK]StartDefaultTask \n");
  /* Infinite loop */
  for(;;)
  {
	  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
	  osDelay(500);
	  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
	  osDelay(500);
  }
  /* USER CODE END 5 */
}
  • LD2가 깜빡인다. 아주 쉽게 성공

Tip

  • main에서 스케쥴러가 돌아가면, main의 Loop문이 돌지 않아도 Task함수로 멀티태스킹이 되서 잘 돌아감.

좋은 웹페이지 즐겨찾기