[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함수로 멀티태스킹이 되서 잘 돌아감.
Author And Source
이 문제에 관하여([FreeRTOS] 2. 포팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@psh4204/FreeRTOS-3.-포팅
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
- 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 - 저장하면 값이 변경된다.

- vTaskStartScheduler() : FreeRTOS의 멀티태스킹 함수 이다.
- 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함수로 멀티태스킹이 되서 잘 돌아감.
Author And Source
이 문제에 관하여([FreeRTOS] 2. 포팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@psh4204/FreeRTOS-3.-포팅저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)