STM32 CubeIDE에서 FreeRTOS를 앞에서 가져오기(CMSIS-RTOS 사용하지 않음!)
STM 32의 FreeRTOS
가장 일반화된 Arm Cortex-M 마이크로컴퓨터의 STM 32에서는 가장 일반화된 자유 RTOS FreeRTOS를 사용하고 싶다.
그때 장애가 됐던 게...
많은 해설문은'CubeIDE(CubeMX) 기반 코드 생성, CMSIS-RTOS 잠금장치를 통한 FreeRTOS 사용'을 전제로 한다
그렇습니다.
CubeIDE(CubeMX)로 코드를 만들면 FreeRTOS를 이동할 수 있는 항목을 어렵지 않게 만들 수 있어 편리하다.
하지만 CMSIS-RTOS 잠금장치를 동시에 생성하기 때문에 기본적으로 그쪽 잠금장치를 사용하기 때문에 방해가 된다는 의견도 있죠.
또한 CubeIDE(CubeMX)의 자동 생성 의존 중에는 자신이 좋아하는 버전의 FreeRTOS를 사용할 수 없다.
FreeRTOS 공식의 STM32를 위한 프레젠테이션 응용 프로그램은 IAR을 위한 것이 많은데 Atollic을 위한 것이 있지만 CubeIDE를 위한 것이 없다.또한 MCU 및 평가 기판의 일부만 지원합니다.
여기서 STM32 CubeIDE(CubeMX)에서 프로젝트의 큰 틀을 만드는 동시에 프로젝트 내에서 FreeRTOS를 자체적으로 가져올 때 주의사항을 정리할 것입니다.
전제 조건
이 기사는 다음 버전의 MCU를 사용했습니다.
CubeIDE(CubeMX)에서 항목 생성하기
CubeIDE(CubeMX)를 사용하여 프로젝트를 작성합니다.물론 FreeRTOS는 프로젝트에 포함되지 않습니다.
프로젝트 제작 시 주의사항은 다음과 같습니다.
SYS
여기서 주의해야 할 것은 Timebase Source입니다.
FreeRTOS는 기본적으로 Systick을 사용하므로 HAL의 Timebase Source를 Systick 이외의 시스템으로 설정하는 것이 좋습니다.여기에는 하드웨어 타이머 TIM16이 사용됩니다.
NVIC
NVIC 설정에서 먼저 주의해야 할 것은 Prority Group입니다.일반적으로 FreeRTOS는 Sub-Prity가 없는 Prority Group에서 실행됩니다.
또한 인터럽트 프로세서에서 FreeRTOS의 ISR safe API를 호출하면 인터럽트 우선 순위는
FreeRTOSConfig.h
에 설정된 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
와 같거나 큰 숫자(Cortex-M에서 숫자가 클수록 우선순위가 낮음)여야 한다.그림의 예에서 EXTI의 프로세서에서 ISR safe의 API를 호출하는 것을 전제로
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
를 5
로 설정하기 때문에 우선순위를 5
또는 더 큰 숫자로 설정합니다.또한 NVIC 코드에서 생성된 설정도 수정됩니다.SVC, PendSV, Systick의 프로세서는 FreeRTOS를 사용하기 때문에 CubeIDE(CubeMX)의 생성을 억제한다.
Project Manager
FreeRTOS의 메모리 관리를 사용할 때 표준 라이브러리에서 사용할 Heap을 확보할 필요가 없습니다.
Minimum Heap Size
용0x0
하면 됩니다.Minimum Stack Size
적정량을 설정합니다.※ 말은 그렇지만, 이 값은 린카 스크립트에만 반영되며, 램의 잔여량 검사에 사용되므로 너무 신경 쓸 필요가 없습니다.
여기에 설정해서 코드를 생성합니다.
FreeRTOS 프로젝트에 추가
코드가 생성되면 FreeRTOS를 프로젝트 폴더에 추가합니다.
FreeRTOS-Kernel을 프로젝트 파일 아래로 복사합니다.
단,portable 디렉터리 아래에는 일부분만 필요합니다.불필요한 파일이 포함된 경우 컴파일 오류와 기호 중복으로 인해 링크 오류가 발생하므로 필요한 파일만 복사하거나 항목 설정 설정 설정 설정 필터를 사용합니다.
portable/GCC/ARM_CM4F
portable/MemMang/heap_4.c
첫째, 핵심 구조 등에 따라 적합한 것을 선택한다.둘째, 사용할 무더기 관리 알고리즘의 출처를 선택한다.위에 힙이 떠요.사용 시 4 시.
참조: Freertos Heap의 알고리즘(공식)
또한 포함 디렉터리에 포함
portable/GCC/ARM_CM4F
하는 것도 잊지 마세요.FreeRTOSConfig.h
FreeRTOSConfig.h
를 생성하여 포함 디렉토리에 배치합니다.우선 주의해야 할 것은
configCPU_CLOCK_HZ
이다.CPU 클록이 맞습니다.의 값입니다.
다음은 CPU 클럭이 80MHz인 경우의 예입니다.
FreeRTOSConfig.h
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*
* See http://www.freertos.org/a00110.html
*----------------------------------------------------------*/
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ (80000000UL)
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES (5)
#define configMINIMAL_STACK_SIZE ((unsigned short)70)
#define configTOTAL_HEAP_SIZE ((size_t)(7 * 1024))
#define configMAX_TASK_NAME_LEN (10)
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 0
#define configGENERATE_RUN_TIME_STATS 0
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 0
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 0
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES (2)
/* Software timer definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY (3)
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE)
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 /* 15 priority levels */
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY \
(configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
/* Priority 5, or 95 as only the top four bits are implemented. */
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY \
(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
#define configASSERT(x) \
if ((x) == 0) { \
taskDISABLE_INTERRUPTS(); \
for (;;) \
; \
}
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#endif /* FREERTOS_CONFIG_H */
FreeRTOS를 사용할 수 있는 위 항목이 완료되었습니다.부팅 코드와 스크립트를 편집할 필요가 없습니다!
Reference
이 문제에 관하여(STM32 CubeIDE에서 FreeRTOS를 앞에서 가져오기(CMSIS-RTOS 사용하지 않음!)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/peterleif/articles/908c9dd433248a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)