面试题记录

本贴只记录自己遇到的部分面试题,为了方便自己阅读。

逆置函数 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 }

代码转载自此

任务调度的方式

这个问题问得我有点懵逼,嵌入式操作系统任务调度方式,没什么概念,事后研究了一下,我怀疑问的是发生调度的原因。如果有知道的小伙伴希望能够指点一下。
调度原因:

  1. 本身任务执行完毕;
  2. 任务延时,让出cpu资源;
  3. 发生中断抢占cpu资源;
  4. 信号量、事件等唤醒处理任务‘;
  5. 优先级更高的任务抢占cpu。
    若有其他方式,敬请留言指正。
    具体有关任务的知识,这个个人觉得不错。
    实时操作系统任务调度

中断需要注意的点

  1. 无返回值,无参数;
  2. 尽量短,不处理费时操作(包括printf),若有费时操作时,一般由另一个任务处理,中断负责发送信号量或事件通知。
  3. 避免浮点运算;
    总之,就是要尽快结束,避免一切耗时操作。
    中断处理过程

程序如何启动的

  1. 初始化硬件(SDRAM,NAND,NORFLASH,关闭看门狗等);
  2. 从存储器中加载image到RAM中;
  3. 跳转到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年有什么规划(技术专家,项目管理)
  • 为这个规划做了什么准备
  • 如果录取了你,有什么原因可能让你不来上班,有什么原因会让你离职
  • 离开现在这家公司的原因
  • 现在的薪资水平,期望薪资是多少
  • 如果以低于你期望的薪资录用你,你会怎么做
  • 你觉得没有录取你的原因是什么
  • 什么时候有的辞职念头,导火索是什么
  • 你平时会给自己充电吗,以什么方式充电
  • 工作中遇到最大的困难是什么
  • 你的工作内容是什么,时如何与他人协作的
  • 客户有问题反馈时,要怎么处理,简单说一下你的处理流程
  • 让你负责一个项目,你会怎么做
  • 让你后悔的一件事是什么
  • 对我们的公司了解多少

心得:
技术面大部分的问题都会围绕着你的简历项目来问,所以简历上写的东西一定是要自己会的,起码原理是要了解的,不然一问三不知,就觉得你是不是在水项目。
项目之外的技术问题呢,如果会的话当然最好,把原理和实现讲清楚明白,如果不会的话,就往自己会的地方扯,反正不能简单的说不会,实在扯不动,就表现出虽然我不知道,但是我很感兴趣,希望提问者给你解答,并表示事后自己会再查资料了解。
非技术问题呢,这个需要面试前做好准备,这不仅仅是为了应付面试,也确实很有必要想清楚自己想要是什么,想做的是什么。这部分最重要的核心就是真诚,说的东西得懂,不然架不住深问。如果确实有些问题不知道怎么真诚的回答,可以去事先抱几天的佛脚,再经过一番修饰,说的就能像那么回事了。

这次先记录到这,后续抽空把上面的问题简单回答一下

暂时就这些内容,后续会持续更新。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值