嵌入式软件工程师面试题(八)

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
个人主页:嵌入式基地
系列专栏:嵌入式习题专栏
微信公众号:嵌入式基地

嵌入式软件工程师面试题(八)

  • 1、在FreeRTOS中,任务通知的运行机制是怎么样的?
  • 2、什么情况下会栈溢出?如何避免?
  • 3、深复制和浅复制的区别?
  • 4、从一个源文件到可执行文件的过程?
  • 5、简述一下快速排序的步骤
  • 6、头文件的两种包含方式的区别,<>与""区别
  • 7、CAN通信介绍;CAN通信报文的标识符有几位?
  • 8、C语言结构体怎么定义节省内存

1、在FreeRTOS中,任务通知的运行机制是怎么样的?

  • 点击查看 原题更多的解析与讨论

任务通知的数据结构包含在任务控制块中,只要任务存在,任务通知数据结构就已经创建完毕,可以直接使用。
任务通知可以在任务中向指定任务发送通知,也可以在中断中向指定任务发送通知,FreeRTOS 的每个任务都有一个 32 位的通知值,任务控制块中的成员变量 ulNotifiedValue就是这个通知值。
只有在任务中可以等待通知,而不允许在中断中等待通知。
如果任务在等待的通知暂时无效,任务会根据用户指定的阻塞超时时间进入阻塞状态,我们可以将等待通知的任务看作是消费者;其它任务和中断可以向等待通知的任务发送通知,发送通知的任务和中断服务函数可以看作是生产者,当其他任务或者中断向这个任务发送任务通知,任务获得通知以后,该任务就会从阻塞态中解除。

2、什么情况下会栈溢出?如何避免?

  • 点击查看 原题更多的解析与讨论

1.局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
2.递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
3.指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。 解决这类问题的办法有两个, 一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。

3、深复制和浅复制的区别?

  • 点击查看 原题更多的解析与讨论

浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。
深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象。

4、从一个源文件到可执行文件的过程?

  • 点击查看 原题更多的解析与讨论

主要包括4个过程:

  1. 预处理;
    2.编译(产生.s文件,-s);
    3.汇编(产生.o或者.obj文件,-c);
  2. 链接

5、简述一下快速排序的步骤

  • 点击查看 原题更多的解析与讨论

1.从数列中挑出一个元素,称为 “基准”;
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置;
3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;

6、头文件的两种包含方式的区别,<>与""区别

  • 点击查看 原题更多的解析与讨论

< >引用的是编译器的类库路径里面的头文件,#include <> 的查找位置是标准库头文件所在目录;
" "引用的是你程序目录的相对路径中的头文件, #include “” 的查找位置是当前源文件所在目录。

7、CAN通信介绍;CAN通信报文的标识符有几位?

  • 点击查看 原题更多的解析与讨论

CAN 是ISO国际标准化的串行通信协议。
CAN 控制器根据两根线上的电位差来判断总线电平。
总线电平分为显性电平和隐性电平,二者必居其一。
发送方通过使总线电平发生变化,将消息发送给接收方。
通信报文标识符有标准格式和扩展格式两种格式。
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID。

8、C语言结构体怎么定义节省内存

  • 点击查看 原题更多的解析与讨论

1.在保证值域足够的情况下,用小字节变量代替大字节变量,如用short替代int
2.将各成员按其所占字节数从小到大声明,以尽量减少中间的填补空间(字节对齐)。
3.可以取消字节对齐,#pragma pack(1),当然这会牺牲效率,谨慎采用。

你可能感兴趣的:(牛客网嵌入式刷题专栏,面试,嵌入式面试,面试题,单片机,can)