[活动专区] 【杰发科技AC7802x测评】4. 极简方式移植FreeRTOS

[复制链接]
1202|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包了。简单方便快捷

1685715366260.png

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

1685715375892.png

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

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

1685715381891.png

1.2 集成freeRTOS到工程

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

1685715519928.png

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

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

2 代码实现

2.1 创建任务

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

  1. #include "gpio.h"
  2. #include "timer.h"
  3. /* FreeRTOS includes. */
  4. #include "FreeRTOS.h"
  5. #include "task.h"


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

  10. int main(void)
  11. {
  12.     InitDelay();
  13.     InitDebug();
  14.     GPIO_LedInit();
  15.     TIMER_PrdInit();
  16.                                 //创建led1任务
  17.     xTaskCreate((TaskFunction_t )led1_task,            //任务函数
  18.                 (const char*    )"led1_task",          //任务名称
  19.                 (uint16_t       )LED1_STK_SIZE,        //任务堆栈大小
  20.                 (void*          )NULL,                  //传递给任务函数的参数
  21.                 (UBaseType_t    )LED1_TASK_PRIO,       //任务优先级
  22.                 (TaskHandle_t*  )&LED1Task_Handler);   //任务句柄  


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

  24.     while (1)
  25.     {

  26.     }
  27. }

  28. void led1_task(void *pvParameters)
  29. {
  30.         while(1)
  31.         {
  32.                 GPIO_ToggleLedPrd();
  33.                 vTaskDelay(500);
  34.         }
  35. }


2.2 编译错误处理

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

1685715924093.png

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

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

1685716102040.png

3 试验结果

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

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


1685716387449.gif

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

本版积分规则

10

主题

66

帖子

1

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