基于cortex M4内核空调实时控制系统
layout: post
title: 基于cortex M4内核空调实时控制系统
description: 基于cortex M4内核空调实时控制系统
categories:
- STM32
tags: FreeRTOS
摘要
目前,物联网技术越来越发达,各种芯片、传感器都如雨后春笋层出不穷,空调的功能也越来越多。本文设计了一种基于cortex M4内核的实时操作系统,解决空调在具有非常复杂功能的情况下的逻辑处理和防堵塞的问题。该控制系统硬件单元由嵌入式M4内核的32位芯片等模块组成,软件单元采用免费、开源的FreeRTOS实时操作系统,能够提高软件系统的实时性,并通过降低阻塞来保证软件的稳定性。
前言
空调的智能化发展越来越迅速,早期空调仅有模式、温度、风速、定时、风向等几个功能点,而现在不仅这些功能的控制要更加精确,也添加了很多的传感器,例如温度传感器、TVOC传感器、二氧化碳传感器、PM2.5传感器等等,基于这些传感器,空调可以感知到用户家中各类环境温度,从而通过程序判断自动进入某种进程;加上通过WIFI、蓝牙等通信网络,和其他家里的家电组成“物联网”,这就是如今空调的智能化方向。但是,要实现越来越复杂的功能,必定需要越来越高的硬件平台需求,以及越来越复杂的软件系统和越来越多的异常处理,本文介绍了一种基于cortex M4内核的实时操作系统,以一种高稳定性和高实时性的方式让空调的智能化更加稳定,并且给未来的更多功能预留了大量的程序空间。
M4内核优势
①性能较强
M4内核的处理器均采用32位架构,外部存储空间能够达到4G,基本的程序空间也能达到512K甚至1M,工作频率高达84MHZ,超频工作情况下,能达到168MHZ,是如今空调使用的20MHZ处理器运算速度的8倍。
如今很多空调的主控芯片为了降本,将程序flash不断压缩,已经难以规划出足够的RAM开发新的功能了,而采用M4内核的32位处理器则可以很好的解决这个问题。
②性价比高
如今的M4内核处理器已经不仅限于ST一家独大,国产处理器,如兆易创新GD32、灵动微MM32、华大HC32等产品也参考了STM32的设计模式,设计出了Pin对Pin的芯片产品,能够直接替换进口新品,并且其价格相对进口新品更低,也能获得足够的技术支持。
③外设资源丰富
M4内核处理机有非常丰富的资源,例如大量串口(可复用)、IIC、CAN、IIS、SDIO等等,为以后空调智能化提供了极大的发展空间。
实时操作系统
实时操作系统是通过任务调度、任务优先级区分来达到实时性目的的操作系统。其相对于现在的“裸机运行”的空调程序来讲,有极大的提升。如今的空调控制系统中,不可避免的在主函数中使用一个while(1)循环,来包含程序要运行的所有的内容,但是不可避免的,程序在运行或是通信过程中,会出现一些delay()函数或是_nop_();函数,这些函数的存在让程序运行更有规律,但是同样造成了CPU资源的浪费,所有的程序都在一个串行的结构下运行,实时性得不到保障。同时如今的空调软件已经非常复杂或是臃肿,在后期越来越多的功能出现时,软件的迭代升级将变得极为困难。因此我们不得不引入实时操作系统来改善我们的软件生态。
如今市面上有许多较为成熟的实时操作系统,例如FreeRTOS、μcosII等等。在这里我们选择FreeRTOS作为空调控制系统,此系统市场占有率很高,并且由于其开源和免费特性,FreeRTOS技术在不断改进,用户数量在不断增多,兼容性也越来越强。
空调任务调度
将如今的空调程序分解,大致分为如下功能:掉电数据读取、模式状态判断、步进电机控制、初始化、蜂鸣器、显示通信计时、WIFI延时处理、红外解码、故障处理、记忆数据处理、按键检测、按键处理、显示屏发送、显示屏接收、WIFI发送、WIFI接收、室温接收、睡眠键处理、节能处理、干燥处理、睡眠运行、自动柔风、自检运行、显示屏数据处理、模式运行、显示屏故障计时、WIFI故障计时、定时开机、定时关机。可见基础功能已经有了很复杂的逻辑,并且由于系统在一条串行的线路上运行,还需要对系统时间进行校准、处理异常发生。
将while(1)循环中各个功能的处理转化为不同任务,可以将同一功能整合,例如故障处理和故障显示计时可直接合并为故障处理,在任务调度系统中会自动处理堵塞关系,不必担心计时时任务堵塞导致其他功能失效。
具体任务优先级示例如表1所示。
表1 任务优先级
| 序号 | 任务 | 优先级 |
| —- | ———— | —— |
| 1 | 掉电数据读取 | 6 |
| 2 | 模式状态判断 | 3 |
| 3 | 步进电机控制 | 2 |
| 4 | 初始化 | 5 |
| 5 | 蜂鸣器 | 4 |
| 6 | 显示通信 | 3 |
| 7 | WIFI通信 | 4 |
| 8 | 红外解码 | 4 |
| 9 | 传感器接收 | 1 |
| 10 | 自动柔风 | 2 |
| 11 | 自检运行 | 2 |
| 12 | 智能功能 | 2 |
| 13 | 故障处理 | 2 |
| 14 | 定时功能 | 1 |
由于任务调度系统自身防堵塞的特性,可以直接将所有功能(包括其计时、延时)放入任务函数内,而不用担心其占用CPU时间而导致系统时间出错或无法执行其他功能,同一优先级的功能会共同占用CPU时间,也就是说会并行运行。暂时不调用的函数可以使用相应的API使其进入挂起状态,不占用CPU资源。
并且如果有需要再加的新功能,只需要定义任务优先级,创建任务,并不需要担心过多的逻辑处理。
FreeRTOS移植
在FreeRTOS官方网站上找到FreeRTOS V9.0.0版本,此版本使用人数最多,并且没有后期更新版本后的很多没有必要的功能,整改代码源文件较为精简。
使用M4内核可直接从下载的压缩包中的Demo文件夹中找到相应的工程文件,但是由于这些demo工程文件相对较为复杂,我们只选取其中最为核心的部分。
工程内容截图如图1所示
图1 工程文件内容
主要步骤可概括为:
1)复制FreeRTOS必要核心文件
2)修改FreeRTOSConfig.h头文件
3)指定头文件路径
4)修改stm32f4xx_it.c中断服务函数
如图1所示:需要的文件包括croutine.c、event_group.c、list.c、queue.c、tasks.c、timers.c、heap_4.c、port.c以及FreeRTOSConfig.h。
其中,src文件夹主要包含了FreeRTOS中通用的头文件和C文件,是大部分FreeRTOS函数定义的位置,由于采用了大量的宏定义,修改后也适用于各种处理器和编译器,。
Port文件夹中则是存放内存相关、处理器架构的代码,同样也是从官方文件拷贝过来。
FreeRTOSConfig.h则是从Demo文件夹中,相应的处理器例程中拷贝过来,再在Keil中指定头文件路径。这个头文件中我们可以对一些我们需要的功能进行宏定义。
最后配置SysTick 中断服务函数, FreeRTOS由于其开源特性,经过了长时间的发展后,已经很容易与各类芯片内核匹配,我们只需要注释掉库文件中的PendSV_Handler()与SVC_Handler()这两个函数,因为FreeRTOS文件中自适应匹配了M4内核这两个函数的功能。
部分代码展示
//task1任务函数
void task1_task(void *pvParameters)
{
u8 task1_num=0;
while(1)
{
task1_num++; //任务执1行次数加1
subMainKeyRead(); // 按键检测处理
subMainKeyHandle(); // 按键功能处理
printf("任务1已经执行:%d次\r\n",task1_num);
if(task1_num==5)
{
if(Task2Task_Handler != NULL)
{
vTaskDelete(Task2Task_Handler);
Task2Task_Handler=NULL;
printf("任务1删除了任务2!\r\n");
}
}
}
vTaskDelay(1000);
}
```C
//task2任务函数
void task2_task(void *pvParameters)
{
u8 task2_num=0;
while(1)
{
task2_num++;
subMainModeRun();
printf("任务2已经执行:%d次\r\n",task2_num);
vTaskDelay(1000);
}
}
```c
//主函数调用
void main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init(168);
uart_init(115200);
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();
}
```c
//任务创建函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )task1_task,
(const char*)"task1_task",
(uint16_t)TASK1_STK_SIZE,
(void*)NULL,
(UBaseType_t)TASK1_TASK_PRIO,
(TaskHandle_t*)&Task1Task_Handler);
xTaskCreate((TaskFunction_t )task2_task,
(const char*)"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void*)NULL,
(UBaseType_t)TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
总结
本文将空调主控芯片更换为更为强大的M4内核处理器,运行速度是传统空调的8倍,RAM空间提升至8倍大小。并且搭载FreeRTOS实时操作系统,极大避免了CPU资源的浪费;相对于传统空调的“裸机”系统,有以下优点:
\1) 高实时性,由于其任务堵塞机制的存在,CPU资源不会被延时函数或任务卡死等情况浪费,响应速度相对于“裸机”系统有很大的提升
2)高内聚、低耦合:符合软件开发的开发原则,任务定义好后便于移植。
3)高并发性,相对于“裸机”系统的串行处理方式,实时操作系统将任务区分优先级,高优先级的任务能够打断低优先的任务,同一优先级的任务共同使用CPU资源
\4) 高开发效率,由于FreeRTOS市场占有率极高并且开源,很多厂商都对此操作系统进行了优化,将很多软件常用功能进行封装,我们只需要调用相关API,不用做过多的开发。
5)可发展范围广、空间大,很多厂商的软件只能在操作系统上运行,乐鑫、TI提供的一些关于WIFI的SOC SDK。
参考文献
[1] 熊一鹏,岳伟.FreeRTOS多任务调度机制在监控单元中的应用[J].单片机与嵌入式系统应用,2021,21(09):64-66.
[2] 靳大为,何磊.FreeRTOS在液压支架电液控系统中的应用[J].现代工业经济和信息化,2021,11(09):126-128.DOI:
10.16525/j.cnki.14-1362/n.2021.09.53.
[3] 闫敏. 基于OneNet物联网平台的家用智能断路器系统[D].河南科技学院,2021.DOI:10.27704/d.cnki.ghnkj.
2021.000093.
[4] 罗成志,王文斌,沈勇,张鑫.基于阿里云的新能源汽车空调状况监测系统设计[J].单片机与嵌入式系统应用,2021,21(01):46-49.
[5] 瑞萨电子扩展其Arm Cortex内核MCU产品家族[J].单片机与嵌入式系统应用,2021,21(02):94.
[6] 薛川. 基于ARM的智能家居系统设计与实现[D].电子科技大学,2020.DOI:10.27005/d.cnki.gdzku.2020.001664.