FreeRtos专篇【简答版】
1.概述与移植
简述freertos系统
freertos是一个实时操作系统,它内核比较小,可移植性高,适用于多种硬件平台,具有任务调度,中断管理等功能;
裸机开发和rtos开发的区别?
裸机开发直接对硬件进行操作,没有任务调度机制,需要手动管理内存,没有同步机制;
rtos不依赖于硬件平台,可移植性高,有任务调度机制,内存管理机制,和同步机制;
2.为什么会在项目中使用RTOS?
对于简单的单一任务,我们会考虑裸机开发;但对于业务比较复杂的,我们会使用rtos,可以更好的实现复杂的业务逻辑同时更具有实时性;
3.freertos启动流程?
1.硬件初始化;2.系统初始化;3.创建任务;4.开启调度器;
4.freertos如何移植?有没有对代码裁剪的经验?讲讲移植了哪些文件,他们有什么作用。
移植:
1.在源程序中创建freertos文件夹
2.在文件夹中创建src存放source的核心文件,就是.c文件
3.在文件夹中创建port存放MenMang内存管理文件和RVDS处理器架构相关代码
4.最后再将include头文件和FreeRTOSConfig.h配置文件移植进来即可
裁剪:
task.c和list.c是必须的,其他的核心文件按需选择即可;
RVDS中只留下我们使用到的芯片的即可,其他可以删除;
内存管理有5个文件,我们一般留heap_4.c,其他可以删除
5.Freertos和linux的区别?
freertos的内核比linux微小,是轻量级的系统,此外实时性比linux高;
6.为什么Freertos的实时性比linux更高?
① freertos是抢占式的,高优先级的任务可以立马运行;
② freertos有高效的中断处理机制,确保对中断事件的快速响应;
linux也可以配置成实时系统,但是linux的调度算法更加注重的是系统的稳定性和公平性而不是实时性,它的进程调度和中断响应更加复杂,可能会有一定的延迟,影响了实时性;(上下文切换,核态切换等)
7.Freertos的heap文件?5种内存管理机制
Freertos定义了一个很大的全局数组ucHeap[configTOTAL_HEAP_SIZE],从这个数组里分配内存;下图是创建三个任务的过程;
有五种内存管理机制;
heap_1.c:只分配不删除,只有pvPortMalloc,没有实现vPortFree;
heap_2.c:最佳匹配算法,但不会合并相邻的空闲内存,碎片化严重;
假设heap有3块空闲内存:5字节、25字节、100字节,pvPortMalloc想申请20字节,找出最小的、能满足pvPortMalloc的内存:25字节,把它划分为20字节、5字节;
heap_3.c:使用标准C库里的malloc、free函数,configTOTAL_HEAP_SIZE不再起作用;
注:C库里的malloc、free函数并非线程安全的,Heap_3中先暂停FreeRTOS的调度器,再去调用这些函数,使用这种方法实现了线程安全。
heap_4.c:首次适应算法,会把相邻空闲内存合并为一个大的空闲内存,可以较少内存的碎片化;
假设堆中有3块空闲内存:5字节、200字节、100字节,pvPortMalloc想申请20字节,找出第1个能满足pvPortMalloc的内存:200字节,把它划分为20字节、180字节
heap_4.c:Heap_5分配内存、释放内存的算法跟Heap_4是一样的,不局限于管理一个大数组:它可以管理多块、分隔开的内存。
7.在FreeRTOS中,如何创建和删除任务?
创建任务是分为动态创建和静态创建,静态创建需要事先分配好TCB和栈;
删除任务可以分为自杀和被其他任务杀,其他任务删除任务可以直接进行清理,自杀的需要空闲任务来清理;
8.TCB结构体是什么?
用于表示任务的结构体,有栈指针,栈顶指针,优先级,名字,状态等;
9.FreeRTOS任务函数怎么写?
xTaskCreate:任务函数,任务名称,栈深度,参数,优先级,handle指针;
函数创建步骤:①创建TCB;②创建栈;③在栈里写入函数地址、参数;
细节:
创建任务创建一个待恢复的现场(伪造现场),开始运行之前要先将现场恢复进去;pc和R0分别写入函数地址和函数参数;其他存在TCB中,TCB包括:栈顶指针,栈底指针,函数,优先级,两个链表;
10.FreeRTOS的任务堆栈大小怎么考虑的?
栈的大小由临时变量和函数的调用深度来决定,需要工程师按经验去分配;
11.任务的状态有哪几种?阻塞和暂停有啥区别?
Running、Ready、blocked、suspend;阻塞是等待时间事件或同步事件发生;暂停是自己暂停或者其他任务要求其暂停;
12.freertos的多任务同步机制列举?
队列、信号量、互斥量、事件组、任务通知;
13.freertos使任务切换的方式有哪些?
1.高优先级任务创建之后抢占
2.任务主动放弃CPU
3.systick时间片轮转
4.系统调用 such as:任务切换函数taskYIELD()进行任务切换
其他问题可关注专栏
嵌入式软件工程师面试完全指南
面经一共32篇文章,12w+字数,包含全部最新的面试必问考点,4.7w+同学学习,2800+订阅,非常适合在找工作面经薄弱的同学,3200+订阅还会涨价,提前订阅提前享受,持续更新中。
原帖链接:https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM