freeRTOS面试会问到的问题。
1.信号量:信号量是一种计数机制,用于控制同步,它可以被视为一个资源,需要使用者获取它获取它执行相应的操作,之后再释放信号量,使得其他任务也能够获取这个资源。需要根据具体应用调整FreeRTOS的配置,需要根本具体应用调整FreeRTOS的配置,如调整任务堆栈大小、内存管理配置、中断控制器等等。总之,在配置FreeRTOS的同时配置中断需要根据具体处理器的特性进行,具体的中断处理程序程序设计也需要
1.FreeRTOS的移植与配置以及使用。
-
1移植到哪些平台,讲讲移植过程,占用哪些硬件资源。
可以移植到多种平台,包括单片机、嵌入式处理器、微处理器等等。
1.2移植过程:
- 选择对应目标处理器架构的FreeRTOS版本。
- 安装相应的工具链。
- 对FreeRTOS进行配置。
- 实现FreeRTOS底层函数。
- 搭建FreeRTOS应用程序,实现任务调度。
1.3.占用硬件资源:
移植FreeRTOS对硬件资源的占用,与具体的应用场景有关。需要根据具体应用调整FreeRTOS的配置,需要根本具体应用调整FreeRTOS的配置,如调整任务堆栈大小、内存管理配置、中断控制器等等。
2.FreeRTOS都需要配置哪些,中断是怎么配置的,需要注意什么?
内存管理:需要为FreeRTOS分配一定的内存空间。
任务管理:需要配置任务的堆栈大小、优先级等。
时钟和定时器:需要配置FreeRTOS使用哪个时钟源和定时器。
信号量和队列:需要配置信号量和队列的大小和类型。
调度器配置:需要选择FreeRTOS的调度器类型和优化设置。
在配置中断时,需要首先了解目标处理器的中断控制器的工作原理和寄存器的使用。一般,可以按照以下步骤进行中断配置。
1.开启中断:需要将处理器中断控制器相应的中断开关打开。
2.设置中断优先级:需要设置中断请求的优先级,以保证高优先级中断的及时响应。
3.写入中断向量表:需要在处理器的中断向量表中写入中断处理程序的地址。
配置中断时需要注意以下几点:
1.中断控制器的操作必须是原子的,需要使用响应的临界区代码区。
2.不同处理器的中断控制器操作方式可能不同,需要根据具体的处理器来中断控制器的驱动程序。
3.中断处理程序应该简短,有效率,最好不要在中断中调用太多的函数,以免影响处理器系统的响应性能。
总之,在配置FreeRTOS的同时配置中断需要根据具体处理器的特性进行,具体的中断处理程序程序设计也需要进行相应的考虑。
3.FreeRTOS中的IPC通信都用过哪些?
1.信号量:信号量是一种计数机制,用于控制同步,它可以被视为一个资源,需要使用者获取它获取它执行相应的操作,之后再释放信号量,使得其他任务也能够获取这个资源。通过配置信号量,任务就能能够控制共享资源。
2.队列:队列可能于任务之间传递数据。它提供了发送一个消息的任务和接收一个消息的任务之间的缓冲区。队列中的消息都是一定格式的,FreeRTOS常用的队列有有限队列(设定最大可存放的数据个数)和无限队列(不设定队列大小)。
3.事件:事件用于任务之间交换消息,但是在事件中在处理消息可以根据消息的种类进行不同的处理。事件可以包含一个或多个消息,并且可以事件标志位。
这些 IPC 机制可以很好地支持任务间的通信和协调,使得任务之间不再需要通过共享全局数据来完成协作。
4.FreeRTOS中的上下文切换是怎么实现的?(内核调度)
一般面试官会问你,freeRTOS的中断服务函数有那些?(系统定时器sysTick,PendSV)
会让你解释你对这两种中断的认识:
系统定时器,它以最低中断优先级运行,然后寻找到一个上下文切换,将就绪任务添加到就绪表(就是阻塞完毕的任务)或者将一些挂起的任务(从挂起到恢复)放入就绪表,在就绪表当中,会给到下一个任务(或者异常中断处理函数)中进行判断,来触发任务的切换。
所以系统定时器的作用就是用来管理就绪表的。
异常处理中断处理函数xPortPendSVHandler():主要是调用vTaskSwitchContext从就绪表当中寻找到优先级最高的且就绪任务。
但是对于PendSV的作用,就是用于上下文切换的,用于触发任务调度的,怎么触发任务调度的呢?它的主要核心就是会在port.c文件中的__asm void xPortPendSVHandler( void )进行调用bl vTaskSwitchContext(核心),这个函数的功能就是找到就绪表当中最高优先级的任务,进行一个任务切换。
SysTick优先级高于外部中断,OS抢占IRQ进行任务调度触发Fault,示意图如下。
SysTick结合PendSV就能完美的解决上述问题。
(1)任务A呼叫SVC 来请求任务切换(例如,等待某些工作完成)
(2) OS接收到请求,做好上下文切换的准备,并且挂起一个PendSV异常。
(3)当CPU 退出SVC后,它立即进入PendSV,从而执行上下文切换。
(4)当PendSV执行完毕后,将返回到任务B,同时进入线程模式。
(5)发生了一个中断,并且中断服务程序开始执行
(6)在ISR执行过程中,发生 SysTick 异常,并且抢占了该ISR。
(7)OS 执行必要的操作,然后 pend 起 PendSV异常以作好上下文切换的准备。
(8)当 SysTick退出后,回到先前被抢占的ISR中,ISR继续执行
(9) ISR 执行完毕并退出后,PendSV服务例程开始执行,并且在里面执行上下文切换。
(10)当PendSV执行完毕后,回到任务A,同时系统再次进入线程模式。
FreeRTOS系统的任务切换最终都是在PendSV中断服务函数中完成的,UCOS也是在 PendSV中断中完成任务切换的。
5.简述FreeRTOS中的任务调度?
FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。
合作式调度
亦称为FreeRTOS的协程,实际上是线程并发出来的,每个线程并发出来的协程共用一个栈空间。合作式调度主要用在资源有限的设备上面,现在已经很少使用了。出于这个原因,后面的 FreeRTOS 版本中不会将合作式调度删除掉,但也不会再进行升级了。
抢占式调度
每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay。
时间片调度
每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。如果用户在 FreeRTOS.h 中禁止使用时间片调度,那么每个任务必须配置不同的优先级。
路径:FreeRTOS.h
#ifndef configUSE_TIME_SLICING #define configUSE_TIME_SLICING 1 #endif
更多推荐
所有评论(0)