本贴只记录自己遇到的部分面试题,为了方便自己阅读。
逆置函数 reverse()
在C语言中并没有这个函数,存在于C++等高级语言中。用于将颠倒数组中元素的顺序,例如
extern char *_reverse(char *buf);
char *buf = “abcdef”;
char *tmp = _reverse(buf);
printf("%s", tmp); //fedcba
简单的实现方法如下:
1 #include<stdio.h>
2
3 void reverse(char *str){
4 char temp;
5 char* end = str;
6 if(str){//找到字符串的结尾位置
7 while(*end != '\0')
8 ++end;
9 }
10 --end;//从 null 往前回退一个字符
11 while(str < end){
12 temp = *end;
13 *end-- = *str;
14 *str++ = temp;
15 }
16 }
17 int main(){
18 char test[20] = "i am a boy";
19 printf("%s\n",test);
20 reverse(test);
21 printf("%s\n",test);
22 }
任务调度的方式
这个问题问得我有点懵逼,嵌入式操作系统任务调度方式,没什么概念,事后研究了一下,我怀疑问的是发生调度的原因。如果有知道的小伙伴希望能够指点一下。
调度原因:
- 本身任务执行完毕;
- 任务延时,让出cpu资源;
- 发生中断抢占cpu资源;
- 信号量、事件等唤醒处理任务‘;
- 优先级更高的任务抢占cpu。
若有其他方式,敬请留言指正。
具体有关任务的知识,这个个人觉得不错。
实时操作系统任务调度
中断需要注意的点
- 无返回值,无参数;
- 尽量短,不处理费时操作(包括printf),若有费时操作时,一般由另一个任务处理,中断负责发送信号量或事件通知。
- 避免浮点运算;
总之,就是要尽快结束,避免一切耗时操作。
中断处理过程
程序如何启动的
- 初始化硬件(SDRAM,NAND,NORFLASH,关闭看门狗等);
- 从存储器中加载image到RAM中;
- 跳转到RAM运行;
嵌入式系统启动过程
标准协议的速率
I2C:100K,400K,3.4M
SPI:跟控制器的性能有关,但是为了提速有dual,qual,spi
可重入函数
实时操作系统中,常常会有多个任务调用同一个函数,这个函数就是可重入函数。
可重入函数需满足:
- 不使用任何静态变量;
- 无动态内存的申请,释放(malloc,free);
- 不使用标准IO
- 可以随时被打断而不影响原有的数据。
总之,判断标准就是无论何种情况下运行或打断此函数,都不会影响它的数据。
临界区
访问共有资源的函数片段,在这个片段执行过程中,其他所有的任务都需要停止,不可被打断,不可多个线程或任务同时访问,在该片段前后需要实现同步机制,以确保互斥。
例:
多个任务需要读写flash时,多个任务需要调用打印机时,多个任务需要使用串口打印时。
在处理这些公用资源时,常常加入互斥锁,保证其正常使用。
原子操作
不可被分割的操作,类比原子是物质的最小单位,当然你可以说原子还可以拆分,但是拆分后已经不是原来的物质了。
在进行原子操作时不可打断,原子操作是一个整体,不可打断(分割)。
需要软件和硬件的同时支持,部分CPU可在其执行时给系统总线加锁。
//2021年06月07日
面试到后面基本是人事面,总监面,技术问题比较少,这里总结下主要问到的问题。
技术问题
- 有没有了解过静态检查,如果让你设计一个静态检查,你有什么思路
- 你对AWorks(工作中主要用到的嵌入式实时操作系统)了解有多少
- TCP三次握手,四次挥手的过程,有什么标志位
- C语言的面向对象怎么设计
- 把welcome to cvte 通过转换输出 cvte to welcome
- 对linux了解有多少,与嵌入式系统的区别
- Volitale 的用法
- static的用法
- 全局变量,局部变量,静态变量的存储区域
- 指针数组,数组指针,函数指针,函数指针数组等
- const的用法,使用场景
- 进程与线程的区别,与AWorks的任务区别
非技术问题
- 未来3-5年有什么规划(技术专家,项目管理)
- 为这个规划做了什么准备
- 如果录取了你,有什么原因可能让你不来上班,有什么原因会让你离职
- 离开现在这家公司的原因
- 现在的薪资水平,期望薪资是多少
- 如果以低于你期望的薪资录用你,你会怎么做
- 你觉得没有录取你的原因是什么
- 什么时候有的辞职念头,导火索是什么
- 你平时会给自己充电吗,以什么方式充电
- 工作中遇到最大的困难是什么
- 你的工作内容是什么,时如何与他人协作的
- 客户有问题反馈时,要怎么处理,简单说一下你的处理流程
- 让你负责一个项目,你会怎么做
- 让你后悔的一件事是什么
- 对我们的公司了解多少
心得:
技术面大部分的问题都会围绕着你的简历项目来问,所以简历上写的东西一定是要自己会的,起码原理是要了解的,不然一问三不知,就觉得你是不是在水项目。
项目之外的技术问题呢,如果会的话当然最好,把原理和实现讲清楚明白,如果不会的话,就往自己会的地方扯,反正不能简单的说不会,实在扯不动,就表现出虽然我不知道,但是我很感兴趣,希望提问者给你解答,并表示事后自己会再查资料了解。
非技术问题呢,这个需要面试前做好准备,这不仅仅是为了应付面试,也确实很有必要想清楚自己想要是什么,想做的是什么。这部分最重要的核心就是真诚,说的东西得懂,不然架不住深问。如果确实有些问题不知道怎么真诚的回答,可以去事先抱几天的佛脚,再经过一番修饰,说的就能像那么回事了。
这次先记录到这,后续抽空把上面的问题简单回答一下
暂时就这些内容,后续会持续更新。。。