打印
[MM32软件]

基于MM32F5270移植FreeRTOS

[复制链接]
741|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1. 简介

在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS)可以更合理、更有效地利用 CPU 的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性。

FreeRTOS是一个RTOS类的嵌入式实时操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。

MM32F5270是一款搭载了安谋科技 Arm® Cortex-M33/STAR-MC1内核的MCU产品,其工作频率可达 120MHz,具有256KB Flash和192KB RAM,内置单精度浮点运算单元(Floating Point Unit,FPU),并支持数字信号处理(Digital Signal Processing, DSP)扩展,提供实时处理和高级中断处理能力,实现性能和电源效率的平衡,适合用于各种类型的实时控制应用。

本系列微课堂基于MM32F5270 MCU初步学习使用FreeRTOS开发,不足之处欢迎指出。

参考资料:
FreeRTOS官网:www.freertos.org
灵动微电子官网:www.mm32mcu.com
访问 https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_performance/mm32f5270/ 获取MM32F5270更多信息。


2. FreeRTOS移植

2.1 源码下载

点击官网标题下的Download可以去下载FreeRTOS源码,当前版本是V10.5.1(task.h文件中有注明版本)。




内容如下:



包括3个文件夹、4个HTML格式的网页和2个.txt文档,重点在于上面的FreeRTOS 和FreeRTOS-Plus两个文件夹,其中FreeRTOS文件夹的内容就是FreeRTOS内核源码,而Plus版本还包括内核以外的组件和第三方补充,对于FreeRTOS移植,我们只需要用到FreeRTOS内核源码就行了。

FreeRTOS文件夹内容:




Demo文件夹里面是 FreeRTOS的例程;
License文件夹里面是相关的许可信息;
Source文件夹是FreeRTOS源码;
Test文件夹是FreeRTOS的相关测试。


Source文件夹内容:



其中.c文件就是FreeRTOS的源码文件,include文件夹是源码包含的一些头文件,portable文件夹是FreeRTOS操作系统和具体硬件的连接层。

portable文件夹内容:



不同MCU内核及编译环境对应的portable文件有所差异,MemMang文件跟内存管理相关。

2.2 移植

移植 FreeRTOS首先需要一个基础工程,可以参考MM32F5270 LibSamples创建工程,或直接在任一例程基础上改动。


1) 向工程中添加FreeRTOS源码

在工程中新建一个名为FreeRTOS的文件夹:




将FreeRTOS相关文件复制到此文件夹下:



portable文件夹只留下GCC和MemMang两个文件夹,其他的都可以删除。



2) 向工程分组中添加文件
打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组中添加文件:




port.c文件位于portable\GCC\ARM_CM33_NTZ\non_secure文件夹。
heap_4.c文件位于portable\MemMang文件夹,提供RTOS内核所需的内存分配。


3) 添加头文件路径
添加FreeRTOS源码的头文件路径:




4) 加入FreeRTOSConfig.h文件
FreeRTOSConfig.h是FreeRTOS的配置文件,通过宏定义来完成对系统的配置和裁剪。可以自己创建(参考 http://www.freertos.org/a00110.html),也可以从FreeRTOS的官方移植工程中复制。这里复制FreeRTOS\Demo\CORTEX_MPU_M33F_Simulator_Keil_GCC\Config\FreeRTOSConfig.h。

5) 修改重复定义的函数
FreeRTOS在port.c中定义了SysTick_Handler()、SVC_Handler()和PendSV_Handler()这三个函数,需要将工程mm32f5270_it.c中定义的三个同名函数注释掉。

6) 编译和修改
编译后如果一些报错或警告,根据提示修改即可,一般和Contex-M33的特定配置选项有关,如configENABLE_MPU、configENABLE_FPU、configENABLE_TRUSTZONE 根据实际应用情况来适配。
另外还要在FreeRTOSConfig.h修改如下宏定义:
设置configCPU_CLOCK_HZ为120000000,和当前MCU配置的系统时钟频率一致。
设置configTICK_RATE_HZ为1000,即FreeRTOS时钟节拍周期是1ms。




3. 验证

开发板使用Mini-F5277-OB,编写简单的FreeRTOS应用代码,测试FreeRTOS的移植是否成功。设计四个任务:start_task()、led1_task ()、led2_task ()和 float_task(),功能如下:
        start_task():用来创建其他三个任务。
        led1_task ():控制 LED1 的闪烁,提示系统正在运行。
        led2_task ():控制 LED2 的闪烁。
        float_task():浮点测试任务,用于测试FPU是否工作正常。
代码如下:

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();

    xTaskCreate((TaskFunction_t)led1_task,
                (const char*) "led1_task",
                (uint16_t)LED1_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)LED1_TASK_PRIO,
                (TaskHandle_t*)&LED1Task_Handler);

    xTaskCreate((TaskFunction_t)led2_task,
                (const char*) "led2_task",
                (uint16_t)LED2_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)LED2_TASK_PRIO,
                (TaskHandle_t*)&LED2Task_Handler);

    xTaskCreate((TaskFunction_t)float_task,
                (const char*) "float_task",
                (uint16_t)FLOAT_STK_SIZE,
                (void *)NULL,
                (UBaseType_t)FLOAT_TASK_PRIO,
                (TaskHandle_t*)&FLOATTask_Handler);

    vTaskDelete(StartTask_Handler);
    taskEXIT_CRITICAL();
}


void led1_task(void *p_arg)
{
    while(1)
    {
        PLATFORM_LED_Toggle(LED1);
        vTaskDelay(100);
    }
}


void led2_task(void *p_arg)
{
    while(1)
    {
        PLATFORM_LED_Toggle(LED2);
        vTaskDelay(500);
    }
}


void float_task(void *p_arg)
{
    static float float_num=0.00;
    while(1)
    {
        float_num+=0.01f;
        printf("float_num = %.4f\r\n", float_num);
        vTaskDelay(1000);
    }
}

主函数:
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

    PLATFORM_Init();

    xTaskCreate( (TaskFunction_t)start_task,
                 (const char*) "start_task",
                 (uint16_t)START_STK_SIZE,
                 (void *)NULL,
                 (UBaseType_t)START_TASK_PRIO,
                 (TaskHandle_t*)&StartTask_Handler);

    vTaskStartScheduler();
}

程序执行情况:
板载LED1、LED2分别间隔100ms、500ms闪烁。
串口调试助手打印float_num的值不断增加,每次增加0.01,工程和KEIL已经设置使用FPU,调试观察会用到浮点寄存器s0、s2和浮点指令VLDR、VADD.F32。
与程序设置相符,FreeRTOS移植成功。








使用特权

评论回复
沙发
tpgf| | 2024-8-9 11:54 | 只看该作者
freertos这个系统是不是也分好几个版本呢  不同的版本对单片机的硬件要求也不相同吧

使用特权

评论回复
板凳
keaibukelian| | 2024-8-9 18:33 | 只看该作者
如果从零开始使用一个系统,应该如何操作呢

使用特权

评论回复
地板
guanjiaer| | 2024-8-11 20:32 | 只看该作者
同一个厂家的芯片移植的时候需要修改的地方相对来说 比较少吧

使用特权

评论回复
5
观海| | 2024-8-11 20:32 | 只看该作者
移植过程如果不出错 是不是就不会出现莫名其妙的现象呢

使用特权

评论回复
6
八层楼| | 2024-8-13 21:01 | 只看该作者
在同一个系列的芯片中进行移植 是不是就不需要更改什么了啊

使用特权

评论回复
7
heimaojingzhang| | 2024-8-14 10:09 | 只看该作者
freertos文件里边应该是不含有相关寄存器的设置代码吧

使用特权

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

本版积分规则

认证:上海灵动微电子股份有限公司
简介:上海灵动微电子股份有限公司成立于 2011 年,是中国本土通用 32 位 MCU 产品及解决方案供应商。 灵动股份的 MCU 产品以 MM32 为标识,基于 Arm Cortex-M 系列内核,自主研发软硬件和生态系统。目前已量产近 300 多款型号,累计交付超 4 亿颗,在本土通用 32 位 MCU 公司中位居前列。

83

主题

101

帖子

5

粉丝