26大厂面试(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

全部评论
好多年没用rtos了,好多我都忘记了
点赞 回复 分享
发布于 11-01 20:39 陕西

相关推荐

秋招结束了,前前后后也得到了很多网友的帮助,所以想着写一个帖子给大家参考一下个人背景:本科双非,硕士IP地某211,电子信息类专业,在实验室一直给老师干横向,无论文无专利无实习投递方向:制造业主要投嵌入式(linux),互联网投C++和客户端,前期属于是有啥投啥,大约投了250家,35家给了面试简历项目:一个实验室项目(Qt上位机+嵌入式应用),一个xv6,还有一个凑数的实验室项目OFFER情况:互联网拿到了BAT中的两家,但部门和岗位都比较边缘,还有杂七杂八的制造业公司,最后去了某芯片外企中厂,拿到最高的offer大约40w出头总结:1. 能实习的同学还是尽量去实习,个人明显感觉到有实习的同学机会要多很多,offer质量也好很多,有很多大包2. 一些要求不算很高的公司通常就问一些常见的八股,面试前可以多背背,我自己是参加了代码随想录的八股训练营,虽然有点智商税,但是面试问到了确实可以很熟练的说出来3. 在官网投递的同时也可以看看BOSS,BOSS上可以找到很多细分的小部门,而且在BOSS上投递有些不占用官网的投递次数,机会会更多一些4. 个人面试主要集中在8月底-9月底,最多的时候一天会面三四轮,刚开始压力确实很大,后面9月中旬拿了某互联网公司的意向压力就小多了5. 对于一些大厂,大家谈薪的时候可以适当的多报一些,像我自己明显感觉谈薪谈的不是很好,保温时期望薪资报的比较保守,后面和HR谈完也没有A,感觉最后offer的base还是很有机会拉高一些的6. 最开始面试会比较紧张,投递的时候可以先投没那么想去的,或者不管能不能去,在3-5月找实习的时候投几个公司练练手7. 秋招持续时间很长,8-9月份会有很多测评和笔试要做,确实会占用比较多的精力,等到10-11月还有不少机会,如果没有拿到满意的offer可以多坚持坚持上面算是个人感悟吧,希望能给大家一些帮助,祝愿大伙都能拿到满意的offer,也希望自己最后能过盲审顺利毕业
点赞 评论 收藏
分享
评论
5
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务