本帖最后由 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会导致大量资源被系统消耗,如果用来做作品的话不一定满足使用场景。
|