STM32上跑FreeRTOS:实时任务调度全解析
一、前言
STM32F103ZET6上边可以架什么操作系统?
答:可以架FreeRTOS()系统和RT-Thread等,不可以架Linux,因为没有Linux需要的存储单元。
RTOS(Real Time Operation System):实时操作系统。
围绕FreeRTOS学会使用各种API
正点原子开发板:http://www.openedv.com/docs/boards/stm32/zdyz_stm32f103_warshipV4.html
任务的管理:任务的创建、删除、挂起、恢复
任务之间的通信:事件标记组、队列、信号量、任务通知(轻量信号量)
(一)任务的执行方式
1.轮询方式
int main(){
while(1){
feed();
}
}
如果我们在轮询一件事情的时候遇见第二件事情,解决方式有:
(1)前后台(通常是裸机系统)
前台去写中断函数,后台进行轮询。
//后台喂饭
int main(){
while(1){
feed();
}
}
//前台
void 中断(){
while(1){
message();
}
}
(2)状态机
让函数短一些,可以将一个函数拆分成若干个小步骤。
void feed(){
static int flag=1;
//c的静态常量存储在静态存储区
switch(flag){
case 1:
盛饭;
flag++;
break;//每次运行的时间只有1s。下一秒再进另一个函数运行1s在退回来
case 2:
舀饭;
flag++;
break;
case 3:
....
break;
}
}
void message(){
....
}
int main(){
feed();
message();
//启动调度器,让操作系统的内核启动起来,让cpu自己去工作
start_scheduler();
}
二、嵌入式实时操作系统概述
2.1 什么是操作系统?
最底层的软件,用来控制和管理硬件的,为用户的应用程序提供服务。
2.2 什么是实时操作系统?
当外界事件或数据产生时候,能够接受并以足够快的速度处理,其处理结果又能在规定时间内来内阁制生产过程或对处理系统做出快速响应。
和非实时系统的区别?
非实时的系统的任务中没有时间限制。
2.3 操作系统的基本功能
(1)任务管理
任务(进程)是程序的一次执行。
(2)CPU管理
CPU管理的含义在于多任务OS对CPU的分配,分配对CPU的所有权。
(3)内存管理
根据内存占用大小的不同去分配内存。
(4)文件管理
对文件进行新建、修改、 删除回收等

可抢占型:原任务可以被中间唤起的任务中断,去执行唤起的任务,完成后再执行原任务
不可抢占型:时间片轮转,原任务不能被唤起的任务抢占,只有执行完原任务才能够执行下一个任务
通常优先级相同的情况下用时间片轮转的方式进行任务。优先级不同就是可抢占型,高优先级打断低优先级。
2.4 实时操作系统的基本特征
(1)实时操作系统首先是多任务操作系统
(2)多级中断机制
(3)优先级调度机制
裸机:前后台形式,通常是前台中断服务函数,后台是大的while(1)循环(应用程序)
痛点:
①实时性比较差
②delay(空等待,cpu不执行其他代码)
③结构臃肿(实现功能放在无限循环)
RTOS:实时操作系统,强调实时性
优点:
①分而治之:实现功能划分为多个任务
②延时函数:任务调度
③抢占式:高优先级任务抢占低优先级任务
⑤任务堆栈:每个人物都有自己的栈空间
寻找更高优先级的任务,寻找到并直接跳到最高优先级任务去执行,每一个任务切换的时机,必然是切换到最高优先级的任务,体现了它的实时性。
三个原则
①高优先级的任务绝对不能够一直运行!!(低优先级没有运行的机会)
②中断的优先级高于任何一个任务(可以打断任何任务,想让一个任务优先级很高,不如直接做成中断)。
③任务的优先级可以设置成相同的
三、FreeRTOS 基础知识
3.1 任务的调度(算法)
使用相关的调度算法来决定当前需要执行哪个任务
(算法是由写操作系统内核工程师完成的,即内核源码)
(1)抢占式调度(针对优先级不同的任务)※
高优先级抢占低优先级。
(在Free RTOS中,优先级越高,数字越大)
①任务优先级高先执行
②高优先级任务不停止,低优先级任务无法执行
③被抢占的任务进入等待
(2)时间片调度※
当优先级相同情况下,由时间片调度,遇见阻塞直接跳到下一个任务。
(FreeRTOS 的时间片1ms轮转一次)
Systick(滴答定时器)
(3)协程式调度(已经不常见了)
当前执行任务会一直运行,同时高优先级的任务不会抢占低优先级任务。
3.2 任务的状态(分时操作系统)
(1)运行态:正在执行的任务一定处于运行态(STM32中同一时刻只有一个任务处于运行态,因为只有一个内核)
(2)就绪态:所有任务创建自动进入就绪态;能被运行,但还没被运行,相当于ready的状态。
(3)阻塞态:因为延时或者等待外部事件的发生而导致运行态无法运行
(4)挂起态:类似于暂停,调用vTaskSuspend()进入挂起态,需要用vTaskResume()进行解除,之后进入就绪态。
注意:
①只有就绪态可转变成运行态
②其他状态的任务想要运行,必须要先变成就绪态
③任务创建完成,该任务自动变成就绪态
④让运行态变成阻塞态可以用延时或者添加运行条件

除了运行态,其他三个状态都会有对应的任务状态列表:
·就绪列表 pxReadyTasksLists
·阻塞列表 pxDelayedTasksLists
·挂起列表 xSuspendedTasksLists
会从高优先级一个一个地去寻找任务
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)