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