前言
Linux与RTOS是校招八股的时候很喜欢考察的知识,在这里并没有把两个操作系统完全的独立开去讲,放在一起对比或许可能加深印象。我们讲Linux的内核有五部分组成:进程调度、内存管理、文件系统、网络接口、进程间通信,所以我也将从这五方面出发 + 中断管理去对比和RTOS的不同。本篇只是一个开始的介绍。
- RTOS是什么?和前后台程序的区别是什么?
- 前后台程序: 前台就是中断 后台就是while循环。 整个系统的结构简单,但是对时间敏感的任务相应较差。比如在中断响应结束后想要快速执行某项任务也得等while循环到
- 实时操作系统:是一种专门设计用于实时应用程序的操作系统。实时应用程序需要在特定的时间约束内对事件作出快速响应,因此RTOS旨在提供可靠、可预测的系统响应性能
- 实时操作系统的特点就是:确定性:(能在确定时间完成指定任务) / 可预测性 / 高可靠性
- 如何移植FreeRTOS?
- sysTickHandler PendSVHandler 与 SVCHandler 的移植
sysTickHandler : 任务调度 延时任务处理
PendSVHandler : 任务切换 堆栈的保存
SVCHandler : FreeRTOS中用来进入第一个任务 - 选择一种内存管理算法
后面会细讲 - FreeRTOSConfig.h的配置
使能什么调度原理
CPU的时钟频率
sysTickHandler调用的频率
受FreeRTOS管理中断的
- RTOS的启动流程
-
4.1首先是裸机上电后的启动流程
-
step1 给SP指针和PC指针赋值 PC指针指向Rest_Handler
cortex-M3规定 起始地址必须存放堆顶指针 第二个地址是复位中断向量入口地址,因为启动的时候会从0x00000000取出值传给SP指针 0x00000004的值赋给PC指针-
SP指针的值是怎么出现在bin文件开头?
来自startup.s中这样定义的段,这个段会在链接过程放在bin文件的开头
-
ResetHandler是谁写的
也在startup.s中
-
-
step2:执行Rest_Handler
- 2.1 执行SystemInit
初始化时钟这个核心外设 - 2.2 执行__main函数
主要是用来初始化程序运行必要的堆/栈环境 把bin文件中的DATA段搬到内存,清空ZI段,最终跳转main函数–这是直接用汇编写的
- 2.1 执行SystemInit
-
-
4.2main函数创建开始任务 开启任务调度函数vTaskStartScheduler();
-
4.3vTaskStartScheduler()做了什么事情?
- 创建空闲任务线程
- 创建定时器服务任务线程
- 设置PendSV 和 sysTick优先级为最低
- 初始化一些全局变量,设置调度器状态为Ture
- 初始化时钟节拍计数器、初始化临界区嵌套计数器,如果ARM内核支持FPU,还会使能FPU
- 启动第一个任务–通过使能SVC异常
- 通过SVCHandler跳转第一个任务
- Linux的启动流程
5会放在一个专门的篇章—启动与升级篇去讲 - 硬实时与软实时的区别
硬实时严格限定在规定时间完成任务
软实时允许出现一定的时间偏差,在随着时间偏差的增大 整个系统的正确性就开始了下滑 - RTOS和Linux的区别?
关于这个问题 我希望后面把五个Linux内核子系统讲清楚之后,就明了了