[APM32F4] 【APM32F402R Micro-EVB】-6-FreeRTOS体验

[复制链接]
 楼主| 南来之风 发表于 2025-7-27 14:38 | 显示全部楼层 |阅读模式
本文体验在keil环境下CMSIS-FreeRTOS在APM32F402上的使用。

内核初始化:
  1. /*
  2.   Initialize the RTOS Kernel.
  3. */
  4. osStatus_t osKernelInitialize (void) {
  5.   osStatus_t stat;
  6.   BaseType_t state;

  7.   if (IRQ_Context() != 0U) {
  8.     stat = osErrorISR;
  9.   }
  10.   else {
  11.     state = xTaskGetSchedulerState();

  12.     /* Initialize if scheduler not started and not initialized before */
  13.     if ((state == taskSCHEDULER_NOT_STARTED) && (KernelState == osKernelInactive)) {
  14.       #if defined(USE_TRACE_EVENT_RECORDER)
  15.         /* Initialize the trace macro debugging output channel */
  16.         EvrFreeRTOSSetup(0U);
  17.       #endif
  18.       #if defined(USE_FreeRTOS_HEAP_5) && (HEAP_5_REGION_SETUP == 1)
  19.         /* Initialize the memory regions when using heap_5 variant */
  20.         vPortDefineHeapRegions (configHEAP_5_REGIONS);
  21.       #endif
  22.       KernelState = osKernelReady;
  23.       stat = osOK;
  24.     } else {
  25.       stat = osError;
  26.     }
  27.   }

  28.   /* Return execution status */
  29.   return (stat);
  30. }


创建线程:
  1.     /* Create the thread */
  2.     ledThreadID = osThreadNew(Led_Thread, NULL, &ledThreadattr);
  3.     if (ledThreadID == NULL)
  4.     {
  5.         printf("Create led thread failed!\r\n");
  6.     }

  7.     usartThreadID = osThreadNew(Usart_TestThread, NULL, &usartThreadattr);
  8.     if (usartThreadID == NULL)
  9.     {
  10.         printf("Create usart thread failed!\r\n");
  11.     }


启动调度器:
  1.     /* Start the RTOS scheduler */
  2.     osKernelStart();


其中LED线程与USART任务定义如下:
  1. void Led_Thread(void *argument)
  2. {
  3.     UNUSED(argument);

  4.     while (1)
  5.     {
  6.         /* Toggle LED2 */
  7.         BOARD_LED_Toggle(LED2);
  8.         osDelay(1000);
  9.     }
  10. }

  11. /**
  12. * [url=home.php?mod=space&uid=247401]@brief[/url]   Usart1 test task
  13. *
  14. * @param   argument  Not used
  15. *
  16. * @retval  None
  17. */
  18. void Usart_TestThread(void *argument)
  19. {
  20.     UNUSED(argument);

  21.     while (1)
  22.     {
  23.         /* Print message */
  24.         printf("Hello, world!\r\n");
  25.         osDelay(1000);
  26.     }
  27. }


实物演示:
IMG_7410.GIF
真的问题不大 发表于 2025-8-4 09:43 | 显示全部楼层
问问lz,操作运行上感觉怎么样,也想申请一块
暖茶轻语 发表于 2025-8-6 15:55 | 显示全部楼层
看起来你已经成功地在APM32F402上运行了FreeRTOS,并且创建了线程。你的代码示例对于初学者来说非常有用。如果遇到任何问题,社区总是乐于帮助解决。
FrostShimmer 发表于 2025-8-7 14:42 | 显示全部楼层
我也喜欢FreeRTOS
不过,printf()函数是不是可重入的啊?
作业天敌在此 发表于 2025-8-8 08:28 | 显示全部楼层
看起来你已经成功地在APM32F402上运行了FreeRTOS,并且创建了LED和USART线程。你的代码示例对于初学者来说非常有帮助。如果你有任何性能优化的问题或者遇到任何bug,欢迎继续讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部