嵌入式软件面试问题总结

1.DCS

答:DCS一般指分散控制系统。 分散控制系统是以微处理器为基础,采用控制功能分散、显示操作集中、兼顾分而自治和综合协调的设计原则的新一代仪表控制系统。集散控制系统简称DCS。也可直译为“分散控制系统”或“分布式计算机控制系统”。

2.FreeRTOS 优先级设置

答:FreeRTOS 操作系统是设置的数值越小任务优先级越低

3.全双工和半双工的区别?

答:全双工和半双工的区别是传输过程不同以及速度不同等。

1、半双工是指传输过程中同时只能向一个方向传输.一方的数据传输结束之后,另外一方再回应。

2、全双工是指两方能同时发送和接受数据。在这种情况下就没有拥堵的危险,数据的传输也就更快。

4.FreeRTOS任务调度的方式

答:FreeRTOS 操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。 实际应用主要是
抢占式调度和时间片调度,合作式调度用到的很少。

拓展:
 抢占式调度
每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,
比如 vTaskDelay。
 时间片调度
每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如
vTaskDelay,才会执行同优先级任务之间的任务切换。
在小型的嵌入式 RTOS 中,最常用的的时间片调度算法就是 Round-robin 调度算法。这种调度算法
可以用于抢占式或者合作式的多任务中。另外,时间片调度适合用于不要求任务实时响应的情况

5.FreeRTOS中各个任务访问同一资源,怎么保证不冲突

答:任务间的通信和同步机制

在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了。 使用全局变量相比事件标志组主要有如下三个问题:

1、使用事件标志组可以让 RTOS 内核有效地管理任务,而全局变量是无法做到的,任务的超时等机制需
要用户自己去实现。
2、使用了全局变量就要防止多任务的访问冲突,而使用事件标志组则处理好了这个问题,用户无需担心。
3、使用事件标志组可以有效地解决中断服务程序和任务之间的同步问题。

拓展:
事件标志组:事件标志组是实现多任务同步的有效机制之一。 每创建一个事件标志组,用户可以使用的事件标志是
24 个。
消息队列:重要的通信机制 。个或者多个任务可以通过 RTOS 内核服务从队列中得到消息。通常,先进入消息队列的消息先传
给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS
的消息队列支持 FIFO 和 LIFO 两种数据存取方式。
信号量:计数信号量 + 二值信号量
计数信号量:任务间的同步和资源共享机制 。
平时使用信号量主要实现以下两个功能:
(1)两个任务之间或者中断函数跟任务之间的同步功能,这个和前面章节讲解的事件标志组是类似的。其实就是共享资源为 1 的时候。
(2)多个共享资源的管理,就像机房上机的例子 。(多个资源可以被多个任务访问的情况,是什么情况呢?)
二值信号量:当共享资源为一个时,和多值信号量一样,和事件标志组类似,只是它最多有24的标志(相当于创建24个二值信号量)。
互斥信号量:,通二值信号量类似,但是它有优先级继承(Priority inheritance)的功能,这样就有效地防止出现优先级翻转的问题 。

6.FreeRTOS是怎么实现任务的现场保护的

答:freertos在初始化的时候,会占用一块静态内存,作为操作系统用的栈,然后在这个栈上面进行入栈 出栈操作,在任务调度的时候,会将之前那个任务的局部变量存到这些栈里面

freertos对全局变量加上互斥,主要是防止两个任务同时对这个全局变量修改和读取,导致任务之间的数据出现错误,所以一般都是要加上对应的互斥量的

7.RS232与RS485的区别

请添加图片描述

8.为什么要使用嵌入式实时操作系统?什么情况下需要使用嵌入式实时操作系统?

(1)操作系统可以降低开发难度。

操作系统协调了不同功能程序以让他们共同完成同一个工作。同时操作系统又隔离了各个功能程序让它们的耦合程度降低。这样就方便设计人员编写各个功能模块,同时整个系统的结构也更加清晰。特别是系统逻辑结构复杂,功能模块较多的情况下操作系统的这一优点体现的更加明显。

同时,由于用任务划分整个流程,编写程序的时候逻辑以及时序会相对简单。只需要考虑单个任务所完成的功能,不用过多的考虑人物之间的耦合关系。

(2)增加代码可读性。给后续代码维护带来方便。

使用操作系统。可对代码进行层次管理,驱动归驱动,应用层归应用层。而且任务里的功能都很明显。每个任务的优先级,执行周期都是可以预期的。程序比较庞大的时候,拥有操作系统的程序的可读性将远远高于裸奔的芯片。(详情可以看看multiwii飞控的程序。。)

(3)增加代码可移植性。

使用操作系统的时候,每个任务的执行时间,优先级,延时的长短。也就是大部分逻辑方面,操作系统中都已经设定好了。且对需要处理的事分成多个任务处理。每个任务相对独立。当需要对代码进行移植的时候,只需要将操作系统移植,然后再将驱动程序移植就基本可以完成原功能。若未使用操作系统,移植一个逻辑,时序较为复杂的代码将是一场灾难。。

(4)需要用到操作系统的情况一般都是:

【1】需要同时处理多个任务(其实就是做到非阻塞);

【2】对实时性要求较高(各式各样的中断处理);

【3】mcu用得起操作系统(资源太少就别想了那么多,费力不讨好)

9.串口通讯,9600bit/s的波特率,数据格式是8,N,1, 请问一秒可以传输多少个字节的数据

答:波特率通常单位是bit/s,也就是 二进制位/秒

无校验位时9600/(8+1+1)=960bit(有校验位时8+1+1应该再加 1)

拓展:
CAN波特率的常用单位Kbps(每秒千比特),也就是kbit/s

10.Linux中进程和线程的区别

答:进程是具有一定独立功能的程序关于某个数据集的划分尺度小于进程,使得多线程程序的并发性高;

(1)一个程序至少有一个进程,一个进程至少有一个线程;

(2)线程的划分尺度小于进程,使得多线程程序的并发性高;

(3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;

(4)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;

(5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这是进程和线程的重要区别。

猜你喜欢

转载自blog.csdn.net/WalterBrien/article/details/125088021