目录
RTOS的概念
用人来类比单片机程序和RTOS
程序简单示例
提出问题
RTOS的概念
用人来类比单片机程序和RTOS
妈妈要一边给小孩喂饭,一边加班跟同事微信交流,怎么办? 对于单线条的人,不能分心、不能同时做事,她只能这样做:
- 给小孩喂一口饭
- 瞄一眼电脑,有信息就回复
- 再回来给小孩喂一口饭
- 如果小孩吃这口饭太慢,她回复同事的信息也就慢了,被同事催:你半天都不回我?
- 如果回复同事的信息要写一大堆,小孩就急得哇哇大哭起来
这种做法,在软件开发上就是一般的单片机开发,没有用操作系统
对于眼明手快的人,她可以一心多用,她这样做:
- 左手拿勺子,给小孩喂饭
- 右手敲键盘,回复同事
- 两不耽误,小孩以为“妈妈在专心喂饭” ,同事以为她在专心聊天
- 但是脑子只有一个,虽然说“一心多用”,但是谁能够同时思考两件事情
- 只是她反应快,上一秒钟还在思考夹哪个菜给小孩,下一秒钟考虑给同事回复什么信息
这种做法,在软件开发上就是使用操作系统,在单片机里叫做使用RTOS
RTOS的意思就是:Real-Time operating system,实时操作系统
我们使用的Windows也是操作系统,被称为通用操作系统,使用Windows时,我们经常碰到程序卡死,停顿的现象,日常生活中这可以忍受。
但是在电梯系统中,你按住开门键时如果没有即刻响应,即使只是慢个1秒,也会夹住人。
在专用的电子设备中,实时性很重要
程序简单示例
// 经典单片机程序
void main()
{
while (1)
{
喂一口饭();
回一个信息();
}
}
------------------------------------------------------
// RTOS程序
int a;
喂饭() 栈A
{
int b = 2;
int c;
c = b+2;==> 1. b+2, 2. c = new val
---------------> 切换
while (1)
{
喂一口饭();
}
}
回信息() 栈B
{
int b;
while (1)
{
回一个信息();
}
}
void main()
{
create_task(喂饭);
create_task(回信息);
start_scheduler();
while (1)
{
sleep();
}
}
提出问题
什么叫做线程?回答这个问题之前,先想想怎么切换线程?怎么保存线程?
线程是函数吗?函数需要保存吗?
函数在Flash中,不会被破坏,无需保存
函数执行到哪?需要保存吗?
需要保存
函数里用到了全局变量,全局变量需要保存吗?全局变量在内存上,还能保存到哪里去?
全局变量无须保存
函数里用到了局部变量,局部变量需要保存吗?
局部变量保存在栈里,也是在内存里,只要避免栈不被破坏即可,局部变量无需保存
运算的中间值需要保存吗?中间值保存在哪里?
在CPU的寄存器里,另一个线程也要用到CPU寄存器,所以CPU寄存器需要保存
函数运行了哪里?
它也是一个CPU寄存器,名为“PC”
汇总:CPU寄存器需要保存!
保存在哪里?
保存在线程的栈里
怎么理解CPU寄存器,怎么理解栈?