打印
[活动专区]

【杰发科技AC7802x测评】4. 极简方式移植FreeRTOS

[复制链接]
677|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hehung|  楼主 | 2023-6-2 22:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hehung 于 2023-6-3 20:27 编辑

#申请原创# #技术资源#  

前言

FreeRTOS作为一款开源的嵌入式实时操作系统,广泛的运用在嵌入式行业,在芯片中集成嵌入式系统也是很有必要的一件事,可以方便的处理各个任务之间的关系,进行精确地时间控制等。

本文将讲解如何在AC7802X中集成FreeRTOS OS,并且方法十分简单,快捷高效。

开发环境:

- 系统:win10
- IDE:KEIL V5.34
- 单片机:CW32F030
- FreeRTOS:KEIL集成包CMSIS-FreeRTOS V10.5.1

> 由于AC7802X的资源较小,RAM只有4K,FLASH只有32K,并不适合上操作系统,但是这些资源本质上也是够用的,主要任务不多,堆栈够用即可。所以本文想测试一下FreeRTOS在小资源单片机上的使用情况。

1 准备工作

1.1 下载FreeRTOS

KEIL中是集成了FreeRTOS系统的,可以直接在 `Pack Installer`中安装,如下图,点击 `Install`即可。这样就不用去freeRTOS官网下载整个freeRTOS包了。简单方便快捷



下载过程中可能出现超时的问题,导致下载不成功,因为keil官网从国内访问不是很稳定。



出现上述情况,可以直接在keil官网去下载,使用迅雷要快很多,下载好了之后直接双击pack包安装即可。

官方地址:http://www.keil.com/pack/



1.2 集成freeRTOS到工程

1. 下载好freeRTOS的pack包之后,双击安装即可。
2. 安装完成之后,选择一个官方提供的示例工程打开,我使用的示例工程是01_GPIO_Basic
3. 打开工程,选择 `Manage Run-Time Environment`,选择 `RTOS`,配置相关信息,见下图:



4. 点击确定,编译,可以直接编译通过,因为官方提供的示例工程本来就是直接使用的CMSIS中的启动代码,所以使用CMSIS-FreeRTOS的库的时候,我们就什么都不需要做了。

> 以上步骤算是完成了对FreeRTOS的集成,接下来就是写一个任务进行实测了

2 代码实现

2.1 创建任务

如下,新建了一个任务,用于没500ms闪烁一次LED1和LED2。

#include "gpio.h"
#include "timer.h"
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"


#define LED1_TASK_PRIO                3                //任务优先级
#define LED1_STK_SIZE                 50          //任务堆栈大小
TaskHandle_t LED1Task_Handler;                //任务句柄
void led1_task(void *pvParameters);        //任务函数

int main(void)
{
    InitDelay();
    InitDebug();
    GPIO_LedInit();
    TIMER_PrdInit();
                                //创建led1任务
    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);   //任务句柄  


                vTaskStartScheduler();          //开启任务调度

    while (1)
    {

    }
}

void led1_task(void *pvParameters)
{
        while(1)
        {
                GPIO_ToggleLedPrd();
                vTaskDelay(500);
        }
}


2.2 编译错误处理

但是编译的时候会报如下错误,说明是RAM资源不够用了,bss和data区域数据保存不了,并且栈区也不够用。



说明RAM太小了,我们需要调整一下FreeRTOS中对堆栈的分区,减少RAM小号,因为我们只创建了一个任务,对堆栈以及RAM使用较少,我们做如下修改:

- 打开FreeRTOSConfig.h
- 修改为如下,原来堆栈分配的是4096,我们RAM只有4K相当于全部用于堆栈了,肯定不行,我们缩减一般用量
- 之后可以顺利编译通过



3 试验结果

如下图所示,可以成功的进行任务执行,移植成功。

> 虽然移植成功了,但是不推荐使用,因为资源实在是有限,使用了freeRTOS会导致大量资源被系统消耗,如果用来做作品的话不一定满足使用场景。




使用特权

评论回复

相关帖子

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

本版积分规则

10

主题

66

帖子

1

粉丝