本帖最后由 dirty123 于 2025-7-26 22:49 编辑
本篇讲述极海APM32F402 Micro-EVB开发板移植FreeRTOS与运行。
开发板MCU APM32F402RBT6有128KB Flash,32KB RAM,32 位 Arm® Cortex®-M4F 内核,是可以移植使用FreeRTOS系统的。
一.代码准备
虽然官方APM32F402_403_SDK_V1.0.2\Examples\Board_APM32F402_Tiny\RTOS\CMSIS_FreeRTOS已经有移植好的FreeRTOS Demo,这里还是温故下,以下是一直步骤,可供参考。
1.下载FreeRTOS源代码。一直会用到其中的文件。
2.系统时钟
一般要实现SysTick_Handler滴答定时函数,PendSV_Handler中断函数,这里查了下Geehy使用了CMSIS-FreeRTOS中间件,具体实现在APM32F402_403_SDK_V1.0.2\Middlewares\CMSIS-FreeRTOS\CMSIS\RTOS2\FreeRTOS\Source\cmsis_os2.c和os_systick.c
3.FreeRTOS源文件工程添加。
这部分包括系统的任务、消息队列、定时器、事件等的库源代码及Port接入口及内存操作源文件。具体在工程中体现如下
4.系统配置
在Examples\Board_APM32F403_Tiny\RTOS\CMSIS_FreeRTOS\Include\FreeRTOSConfig.h是系统配置文件,可对系统进行配置与裁剪。
下面框图可以看到配置的系统堆栈大小(可影响到编译后的RAM与Flash使用情况)及系统定时器频率。右侧部分则是使能/失能了系统功能及系统中断的接入。
5.main函数代码
这里主要是初始化系统调度器后,创建了两个任务,在Led_Thread任务实现500ms间隔LED2闪烁,在Usart_TestThread任务实现间隔1s串口打印测试。两个任务都分配了512字节大小,优先级24.
main函数- int main(void)
- {
- USART_Config_T USART_ConfigStruct;
- /* USART config */
- USART_ConfigStructInit(&USART_ConfigStruct);
- USART_ConfigStruct.baudRate = 115200;
- USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
- USART_ConfigStruct.mode = USART_MODE_TX;
- USART_ConfigStruct.parity = USART_PARITY_NONE;
- USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
- USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
- BOARD_COM_Config(COM1, &USART_ConfigStruct);
- /* Configures LED 2,3 */
- BOARD_LED_Config(LED2);
- BOARD_LED_Config(LED3);
- printf("Welcome to use Geehy RTOS\r\n");
- /* Initialize the RTOS scheduler */
- osKernelInitialize();
- /* Create the thread */
- ledThreadID = osThreadNew(Led_Thread, NULL, &ledThreadattr);
- if (ledThreadID == NULL)
- {
- printf("Create led thread failed!\r\n");
- }
- usartThreadID = osThreadNew(Usart_TestThread, NULL, &usartThreadattr);
- if (usartThreadID == NULL)
- {
- printf("Create usart thread failed!\r\n");
- }
- /* Start the RTOS scheduler */
- osKernelStart();
- /* Infinite loop */
- while (1);
- }
Led_Thread任务
- void Led_Thread(void *argument)
- {
- UNUSED(argument);
- while (1)
- {
- /* Toggle LED2 */
- BOARD_LED_Toggle(LED2);
- osDelay(500);
- }
- }
Usart_TestThread任务
- void Usart_TestThread(void *argument)
- {
- UNUSED(argument);
- while (1)
- {
- /* Print message */
- printf("Hello, world!\r\n");
- osDelay(1000);
- }
- }
6.代码编译
编译后可以看到资源使用情况。Flash约10KB,RAM 约5KB。
二.测验
编译烧录后,可以看到LED2闪烁,系统正常运行串口日志如下
|