[MM32硬件] 【灵动微电子MM32F0121测评】5、FreeRTOS移植

[复制链接]
 楼主| 发表于 2025-6-14 22:41 | 显示全部楼层 |阅读模式
移植FREEROTS需要先下载FREERTOS组件,去官网下载即可,这里就不多赘述了
下载好的freerots组件有以下几个文件夹
62856684d8753f013c.png
在之前创建的工程内添加这些文件,一个是port文件夹,一个是core文件夹,按以下方式添加即可
在includepath添加这些文件的路径
51694684d8873cc76e.png
由于mm32f0121是cortex-m0内核,所以port.c文件选择ARM_CM0内的port.c
63287684d8773e74de.png
在mm32f0120_it.c内删除PendSV_Handler和SVC_Handler函数,因为FreeRTOS需要使用这两个函数,所以会重复定义。
在SysTick_Handler函数内还需要做处理,SYSTICK使用1KHzsystick定时器中断处理函数,在SysTick_Handler添加FreeRTOS的计数函数
  1. extern void xPortSysTickHandler(void);
  2. void SysTick_Handler(void)
  3. {
  4.          if (0 != PLATFORM_DelayTick)
  5.     {
  6.         PLATFORM_DelayTick--;
  7.     }
  8.         #if (INCLUDE_xTaskGetSchedulerState  == 1 )
  9.     if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  10.     {
  11.   #endif  /* INCLUDE_xTaskGetSchedulerState */  
  12.       xPortSysTickHandler();
  13.   #if (INCLUDE_xTaskGetSchedulerState  == 1 )
  14.     }
  15.   #endif  /* INCLUDE_xTaskGetSchedulerState */
  16. }
以上基本就移植完成
然后开始配置FreeRTOSConfig.h,主要是修改中断节拍频率和堆栈大小,这里设置的频率是1KHZ,堆栈大小是128字节
  1. #define configCPU_CLOCK_HZ                                                  (SystemCoreClock)

  2. //RTOS系统节拍中断的频率。即一秒中断的次数,每次中断RTOS都会进行任务调度
  3. #define configTICK_RATE_HZ                                                  (( TickType_t )1000)

  4. //可使用的最大优先级
  5. #define configMAX_PRIORITIES                                          (32)

  6. //空闲任务使用的堆栈大小
  7. #define configMINIMAL_STACK_SIZE                                ((unsigned short)128)
  8.   
然后开始创建工程
  1. void Task_Start_Init(void)
  2. {
  3.         // 创建开始任务
  4.         xTaskCreate( (TaskFunction_t)Task_Start,                // 任务函数
  5.                                  (const char *  )"task_start",                // 任务名
  6.                                  (uint16_t                )START_STK_SIZE,        // 任务堆栈大小
  7.                                  (void*                        )NULL,                                // 传递给任务函数的参数
  8.                                  (UBaseType_t   )START_TASK_PRIO,        // 任务优先级
  9.                                  (TaskHandle_t* )StartTask_Handler);// 任务句柄
  10.         vTaskStartScheduler();                         
  11. }
先创建一个启动任务,在该任务内创建LED任务和Printf任务,然后删除启动任务
  1. void Task_Start(void *pvParamemters)
  2. {

  3.         taskENTER_CRITICAL();                // 进入临界区
  4.         // 创建其它任务
  5.         xTaskCreate( (TaskFunction_t) Task_LED,                                // 任务函数
  6.                                  (const char *  ) "task_Led",                        // 任务名
  7.                                  (uint16_t                ) LED_STK_SIZE,                        // 任务堆栈大小
  8.                                  (void*                        ) NULL,                                                // 传递给任务函数的参数
  9.                                  (UBaseType_t   ) LED_TASK_PRIO,                        // 任务优先级
  10.                                  (TaskHandle_t* ) LEDTask_Handler);                // 任务句柄
  11. //                                 // 创建开始任务
  12.         xTaskCreate( (TaskFunction_t) Task_Printf,                                // 任务函数
  13.                                  (const char *  ) "task_Printf",                        // 任务名
  14.                                  (uint16_t                ) PRINTF_STK_SIZE,                        // 任务堆栈大小
  15.                                  (void*                        ) NULL,                                                // 传递给任务函数的参数
  16.                                  (UBaseType_t   ) PRINTF_TASK_PRIO,                        // 任务优先级
  17.                                  (TaskHandle_t* ) PrintfTask_Handler);                // 任务句柄         
  18.         vTaskDelete(StartTask_Handler);               
  19.         taskEXIT_CRITICAL();

  20. }
由于该任务比较简单,因此使用的堆栈大小也不大
  1. TaskHandle_t        LEDTask_Handler = NULL;                // 任务句柄
  2. #define        LED_TASK_PRIO                        6        // 任务优先级
  3. #define LED_STK_SIZE                                64        // 任务堆栈大小

  4. TaskHandle_t        PrintfTask_Handler = NULL;                // 任务句柄
  5. #define        PRINTF_TASK_PRIO                        6        // 任务优先级
  6. #define PRINTF_STK_SIZE                                64        // 任务堆栈大小
LED任务和Printf任务函数,LED是呼吸灯,Printf是1秒打印一次Hello 21ic, Hello MM32F0121
  1. void Task_LED(void *pvParamemters)
  2. {
  3.         uint32_t i = 0;
  4.         while(1)
  5.         {

  6.                 TIM1->CCR1 = 1440 - (i++%1440);
  7.                 TIM1->CCR2 = (i++%1440);

  8.                 vTaskDelay(3);
  9.         }

  10. }
  11. void Task_Printf(void *pvParamemters)
  12. {
  13.         while(1)
  14.         {
  15.                 printf("Hello 21ic, Hello MM32F0121\r\n");

  16.                 vTaskDelay(1000);
  17.         }

  18. }
效果如下,间隔1秒打印一次
57663684d8939bd773.png
92559684d8983d87cb.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

256

帖子

3

粉丝
快速回复 返回顶部 返回列表