打印
[MM32硬件]

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

[复制链接]
858|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stb988|  楼主 | 2025-6-21 23:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
        本篇测评移植freeRTOS, 实现多任务操作,1秒打印Hello 21ic, Hello MM32F0121"字符串,让LED闪烁.
        要移植,先得去下载源码,可以直接去官网下载https://www.freertos.org/,我这里下载的是



下载完后就是移植文件,下面的文件中有很多其它类别的文件,这里只要复制核心文件就可以了

打开这个文件夹,复制里面的文件到示例工程中











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

#define configUSE_PREEMPTION                    1
#define configUSE_IDLE_HOOK                     0
#define configUSE_TICK_HOOK                     0
#define configCPU_CLOCK_HZ                      (72000000UL)
#define configTICK_RATE_HZ                      ((TickType_t)1000)
#define configMAX_PRIORITIES                    (5)
#define configMINIMAL_STACK_SIZE                (64)  // word, 64*4 = 256 bytes
#define configTOTAL_HEAP_SIZE                   ((size_t)(6*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 configCHECK_FOR_STACK_OVERFLOW          1
#define configUSE_RECURSIVE_MUTEXES             0
#define configUSE_MALLOC_FAILED_HOOK            1
#define configUSE_APPLICATION_TASK_TAG          0
#define configUSE_COUNTING_SEMAPHORES           0

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

/* API function inclusion */
#define INCLUDE_vTaskPrioritySet                1
#define INCLUDE_uxTaskPriorityGet               1
#define INCLUDE_vTaskDelete                     1
#define INCLUDE_vTaskCleanUpResources           0
#define INCLUDE_vTaskSuspend                    1
#define INCLUDE_vTaskDelayUntil                 1
#define INCLUDE_vTaskDelay                      1

/* Cortex-M specific */
#define configPRIO_BITS                         2  // Cortex-M0
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY     3
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY  1
#define configKERNEL_INTERRUPT_PRIORITY          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY     ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

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

/* Hook SysTick/PendSV/SVC */
#define xPortPendSVHandler      PendSV_Handler
#define vPortSVCHandler         SVC_Handler
#define xPortSysTickHandler     SysTick_Handler

#endif


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

extern void freeRTOS_Demo(void);

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

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

void vLED1Task(void *pvParameters) {
    while(1) {
        PLATFORM_LED_Toggle(LED1);
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void vLED2Task(void *pvParameters) {
    while(1) {
        PLATFORM_LED_Toggle(LED2);
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

void vPrintTask(void *pvParameters) {
    while(1) {
        printf("Hello MM32F0121 FreeRTOS!\r\n");
        vTaskDelay(pdMS_TO_TICKS(2000));
    }
}

void vApplicationMallocFailedHook(void)
{
    printf("Malloc failed!\r\n");
    taskDISABLE_INTERRUPTS();
    while(1);
}

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

void freeRTOS_Demo(void)
{
    xTaskCreate(vLED1Task, "LED1", LED_TASK_STACK_SIZE, NULL, 2, NULL);
    xTaskCreate(vLED2Task, "LED2", LED_TASK_STACK_SIZE, NULL, 2, NULL);
    xTaskCreate(vPrintTask, "Print", PRINT_TASK_STACK_SIZE, NULL, 3, NULL);
   
    vTaskStartScheduler();
   
    // 正常不会执行到此
    printf("Scheduler failed to start.\r\n");
    while(1);
}

接下来就是编译,正常是0错误,0警告,下载到开发板,效果如下

使用特权

评论回复
沙发
AdaMaYun| | 2025-7-31 17:52 | 只看该作者
移植FreeRTOS实现打印

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

390

帖子

2

粉丝