FreeRTOS实时操作系统
实时操作系统
RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。在实时操作系统中,我们可以把要实现的功能划分为多个任务,每个任务负责实现其中的一部分,每个任务都是一个很简单的程序,通常是一个死循环。 RTOS操作系统:FreeRTOS,UCOS,RTX,RT-Thread,DJYOS等。 RTOS操作系统的核心内容在于:实时内核。
嵌入式操作系统:
- 大部分有源代码(C语言编程);
- 可移植性强;
- 有很高的硬件依赖性(汇编语言编程,压缩代码执行时间);
- 可裁剪性(根据项目需求裁剪操作系统,缩短内核占用空间);
- 可剥夺型操作系统内核;
- 多任务管理;
- 调度任务执行时间可确定性;
嵌入式操作系统的作用:
操作系统是个软件(管理底层硬件,并且上层应用提供接口)
FreeRTOS
-
Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
-
操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。
-
FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
-
选择FreeRTOS:
(1)FreeRTOS是免费的,学习RTOS操作系统的话 uC/OS是首选,但要做产品的话,免费的FreeRTOS操作系统就是个不错的选择。
(2)许多半导体厂商产品的 SDK(Software Development Kit—软件开发工具包) 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。
(3)简单,因为FreeRTOS 的文件数量很少。 -
FreeRTOS操作系统特点:
FreeRTOS 的内核支持抢占式,合作式和时间片调度。
提供了一个用于低功耗的 Tickless 模式。
系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、软件定时器等等。
FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F429。
FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
高可移植性,代码主要 C 语言编写。
高效的软件定时器。
强大的跟踪执行功能。
堆栈溢出检测功能。
任务数量不限。
任务优先级不限。
FreeRTOS在STM32F103移植
前期准备
FreeRTOS源码: 官网源码,尽量下载长期支持版本
创建好的空工程,方便排查是移植问题还是工程问题;
源码目录分析
FreeRTOS–>Source打开:
FreeRTOS–>Source–>portable打开:
FreeRTOS–>Demo打开:
移植
-
将整个Source文件夹移植到项目文件夹下,更名为“FreeRTOS”;
-
其他文件夹不动,将portable文件夹下的RVDS和MemMang文件夹选择内容拷贝到portable文件夹下,如下:
-
拷贝Demo文件夹下,关于STM32F103在keil编译器下的FreeRTOSConfig.h到user文件夹;
-
添加C文件到工程下:目录如下:
-
添加头文件路径:
-
修改FreeRTOSConfig.h
添加
#define configUSE_TIME_SLICING 1 //使能时间片调度(默认式使能的)
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //硬件计算前导零指令,如果所使用的, MCU 没有这些硬件指令的话此宏应该设置为 0
#define configUSE_TICKLESS_IDLE 0 //置 1:使能低功耗 tickless 模式;置 0:保持系统节拍(tick)中断一直运行
#define configUSE_QUEUE_SETS 1 //启用队列
#define configUSE_TASK_NOTIFICATIONS 1 //开启任务通知功能,默认开启
#define configUSE_MUTEXES 1 //使用互斥信号量
#define configUSE_RECURSIVE_MUTEXES 1 //使用递归互斥信号量
#define configUSE_COUNTING_SEMAPHORES 1 //为 1 时使用计数信号量
#define configQUEUE_REGISTRY_SIZE 10 //设置可以注册的信号量和消息队列个数
#define configUSE_APPLICATION_TASK_TAG 0
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
#define configUSE_MALLOC_FAILED_HOOK 0 //使用内存申请失败钩子函数
#define configCHECK_FOR_STACK_OVERFLOW 1// 大于 0 时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数如果使用的话此值可以为 1 或者 2,因为有两种栈溢出检测方法
#define configGENERATE_RUN_TIME_STATS 0 //启用运行时间统计功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configUSE_TIMERS 1 //启用软件定时器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
#define configTIMER_QUEUE_LENGTH 10 //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
//可选函数配置选项
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
//中断服务函数 也可以修改起始文件
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
- 修改STM32f10x_it.c
/**
* @brief This function handles SVCall exception.
* @param None
* @retval None
*/
//void SVC_Handler(void)
//{}
/**
* @brief This function handles PendSV_Handler exception.
* @param None
* @retval None
*/
//void PendSV_Handler(void)
//{}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
//void SysTick_Handler(void)
//{}
void vApplicationStackOverflowHook(void)
{
while(1)
{}
}
- 编写多任务功能main.c
此处以一个任务举例
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "freertos.h"
#include "task.h"
TaskHandle_t ledHandle=NULL;
void LEDTesk(void *p)
{
while(1)
{
//功能
LED_Off(GPIOE,2);
LED_Off(GPIOE,3);
LED_Off(GPIOE,4);
LED_Off(GPIOE,5);
vTaskDelay(500);
LED_On(GPIOE,2);
LED_On(GPIOE,3);
LED_On(GPIOE,4);
LED_On(GPIOE,5);
vTaskDelay(500);
}
}
int main(void)
{
Led_Config();
xTaskCreate(LEDTesk,"led",56,NULL,2,&ledHandle);
vTaskStartScheduler();
while (1)//启动成功,将不会执行该出
{
}
}
- 编译,下载,灯闪烁
FreeRTOS任务运行管理
官网API链接:FreeRTOS操作任务管理API函数
结束语
实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。
l 商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。
l 免费型的实时操作系统在价格方面具有优势,目前主要有Linux,μC/OS是一种源码开放的商业RTOS。
学习实时操作系统:
嵌入式系统以应用为中心,应用时选择“适用”的操作系统;
自己“写”RTOS——一种学习态度;