[MM32硬件] 【灵动微电子MM32F0121测评】+移植FreeRTOS,实现打印和led闪烁

[复制链接]
3954|1
 楼主| stb988 发表于 2025-6-21 23:13 | 显示全部楼层 |阅读模式
        本篇测评移植freeRTOS, 实现多任务操作,1秒打印Hello 21ic, Hello MM32F0121"字符串,让LED闪烁.
        要移植,先得去下载源码,可以直接去官网下载https://www.freertos.org/,我这里下载的是
屏幕截图 2025-06-21 225739.png


下载完后就是移植文件,下面的文件中有很多其它类别的文件,这里只要复制核心文件就可以了
屏幕截图 2025-06-21 230013.png
打开这个文件夹,复制里面的文件到示例工程中
屏幕截图 2025-06-21 230155.png

屏幕截图 2025-06-21 230215.png
屏幕截图 2025-06-21 230233.png
屏幕截图 2025-06-21 230246.png
屏幕截图 2025-06-21 230321.png


屏幕截图 2025-06-21 230338.png


复制完后,还需要一个FreeRTOSConfig.h,内容如下
  1. #ifndef FREERTOS_CONFIG_H
  2. #define FREERTOS_CONFIG_H

  3. #define configUSE_PREEMPTION                    1
  4. #define configUSE_IDLE_HOOK                     0
  5. #define configUSE_TICK_HOOK                     0
  6. #define configCPU_CLOCK_HZ                      (72000000UL)
  7. #define configTICK_RATE_HZ                      ((TickType_t)1000)
  8. #define configMAX_PRIORITIES                    (5)
  9. #define configMINIMAL_STACK_SIZE                (64)  // word, 64*4 = 256 bytes
  10. #define configTOTAL_HEAP_SIZE                   ((size_t)(6*1024))
  11. #define configMAX_TASK_NAME_LEN                 (10)
  12. #define configUSE_TRACE_FACILITY                0
  13. #define configUSE_16_BIT_TICKS                  0
  14. #define configIDLE_SHOULD_YIELD                 1
  15. #define configUSE_MUTEXES                       1
  16. #define configQUEUE_REGISTRY_SIZE               0
  17. #define configCHECK_FOR_STACK_OVERFLOW          1
  18. #define configUSE_RECURSIVE_MUTEXES             0
  19. #define configUSE_MALLOC_FAILED_HOOK            1
  20. #define configUSE_APPLICATION_TASK_TAG          0
  21. #define configUSE_COUNTING_SEMAPHORES           0

  22. /* Software timer definitions. */
  23. #define configUSE_TIMERS                        0

  24. /* API function inclusion */
  25. #define INCLUDE_vTaskPrioritySet                1
  26. #define INCLUDE_uxTaskPriorityGet               1
  27. #define INCLUDE_vTaskDelete                     1
  28. #define INCLUDE_vTaskCleanUpResources           0
  29. #define INCLUDE_vTaskSuspend                    1
  30. #define INCLUDE_vTaskDelayUntil                 1
  31. #define INCLUDE_vTaskDelay                      1

  32. /* Cortex-M specific */
  33. #define configPRIO_BITS                         2  // Cortex-M0
  34. #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY     3
  35. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY  1
  36. #define configKERNEL_INTERRUPT_PRIORITY          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
  37. #define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

  38. #define configASSERT(x) if ((x) == 0) { taskDISABLE_INTERRUPTS(); for(;;); }

  39. /* Hook SysTick/PendSV/SVC */
  40. #define xPortPendSVHandler      PendSV_Handler
  41. #define vPortSVCHandler         SVC_Handler
  42. #define xPortSysTickHandler     SysTick_Handler

  43. #endif


还去屏蔽原来自带的延时函数,和两个中断函数,
main.c内容
  1. #include "platform.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"

  4. extern void freeRTOS_Demo(void);

  5. int main(void)
  6. {
  7.     PLATFORM_Init();  // 初始化硬件,比如LED GPIO等
  8.     freeRTOS_Demo();
  9.     while (1);
  10. }
新建一个freeRTOS_Demo.c,内容如下
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "platform.h"
  4. #include <stdio.h>

  5. // 任务栈大小 (单位:word)
  6. #define LED_TASK_STACK_SIZE 128
  7. #define PRINT_TASK_STACK_SIZE 256

  8. void vLED1Task(void *pvParameters) {
  9.     while(1) {
  10.         PLATFORM_LED_Toggle(LED1);
  11.         vTaskDelay(pdMS_TO_TICKS(100));
  12.     }
  13. }

  14. void vLED2Task(void *pvParameters) {
  15.     while(1) {
  16.         PLATFORM_LED_Toggle(LED2);
  17.         vTaskDelay(pdMS_TO_TICKS(500));
  18.     }
  19. }

  20. void vPrintTask(void *pvParameters) {
  21.     while(1) {
  22.         printf("Hello MM32F0121 FreeRTOS!\r\n");
  23.         vTaskDelay(pdMS_TO_TICKS(2000));
  24.     }
  25. }

  26. void vApplicationMallocFailedHook(void)
  27. {
  28.     printf("Malloc failed!\r\n");
  29.     taskDISABLE_INTERRUPTS();
  30.     while(1);
  31. }

  32. void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
  33. {
  34.     printf("Stack overflow in task: %s\r\n", pcTaskName);
  35.     taskDISABLE_INTERRUPTS();
  36.     while(1);
  37. }

  38. void freeRTOS_Demo(void)
  39. {
  40.     xTaskCreate(vLED1Task, "LED1", LED_TASK_STACK_SIZE, NULL, 2, NULL);
  41.     xTaskCreate(vLED2Task, "LED2", LED_TASK_STACK_SIZE, NULL, 2, NULL);
  42.     xTaskCreate(vPrintTask, "Print", PRINT_TASK_STACK_SIZE, NULL, 3, NULL);
  43.    
  44.     vTaskStartScheduler();
  45.    
  46.     // 正常不会执行到此
  47.     printf("Scheduler failed to start.\r\n");
  48.     while(1);
  49. }

接下来就是编译,正常是0错误,0警告,下载到开发板,效果如下
VID_20250621_224705.mp4_20250621_231224.gif
AdaMaYun 发表于 2025-7-31 17:52 | 显示全部楼层
移植FreeRTOS实现打印
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

402

帖子

2

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