嵌入式面试的题目分享

  

嵌入式面试的题目分享

  

1、 C语言基础

  1)指针、二重指针
  2)运算符
  3)代码阅读、分析、输出结果
  4)结构体的地址对齐
  5)const、extern、volatile等描述符

  

2、 硬件基础

  1)熟悉基本的电子元器件
  2)能看懂基本的电路图

  

3、 假设内存地址为0x53000000,如果要给该地址赋值0x02,那么如何操作?

//对于32bit系统来说,int和long都是4字节
*((volatile unsigned long *)0x53000000) = 0x02;

  

4、 怎么样往结构体里面动态添加成员?

  对C语言来说,主要有以下几种:
  1)尽量预先定义好可能要使用的成员(也可以使用联合体)
  2)添加指针成员或者链表成员,这样可以指向另一个结构体

  

4、 对于以下的main函数,有os和无os所使用的栈空间的大小是相同的吗?

void main(void)
{    
    while(1)    
    {        
           func1();    //本函数需要10K栈
           func2();    //本函数需要5K栈
           func3();    //本函数需要9K栈
           func4();    //本函数需要8K栈        
           func5();    //本函数需要9K栈    
    }
}

  1)在无OS的情况下,调用 func1函数时,分配 10k 的栈,而 func1 函数返回时,这 10k 栈空间就被释放掉。到 func2 函数时,再次分配 5k 的栈空间,依次循环。所以,整个程序的栈需求,就是这5个函数中需要栈最多的那个函数需要的栈空间:10K。
  2)如果要把这个程序移植到OS下,那就创建5个线程来调用 func1~5 这5个函数,这5个线程需要的栈分别是10K、5K、9K、8K、9K,而这5个栈是独立的,不能共用,程序总共需要的栈空间是(10+5+9+8+9)= 41K,线程栈一般是从堆中动态分配的,考虑到动态分配本身的开销,硬件须准备 50K以上的内存用于程序的运行栈。

  

5、cortex-M发生异常,处理流程是怎么样的?

  1)保存现场,将ARM寄存器压栈
  2)进入异常向量表,获取到对应异常的处理程序
  3)跳到该处理程序进行相关处理
  4)处理完成后,恢复现场,将ARM寄存器出栈

  

6、 怎么样能够不创建临时变量,交换两个数的值?

//方法一:通过两个数的和、差进行判断
void swarp(int *num1, int *num2)
{
    *num1 += *num2;
    *num2 = *num1 - *num2;
    *num1 -= *num2;
}

//方法二:用异或的方法
void swarp(int *num1, int *num2)
{
    *num1 = *num1 ^ *num2;
    *num2 = *num1 ^ *num2;
    *num1 = *num1 ^ *num2;
}

  

7、 对于网络数据的处理,是否都需要进行大小端的转换?

  内存的单位是字节,而 char 类型就是1个字节,不受主机字节序和网络字节序的影响,在内存中就一个单元,没有前后之分。
  数组是连续分配内存的,每个数组单元的存放空间是由数组类型决定,但是数组单元间的前后顺序是固定了的。那么在网络传输后,数组各单元的先后顺序不会改变,至于数组单元的值,如果数组类型不止占1个字节的话,就会发生改变。而字符串是字符数组,字符是占1个字节,所以接收端没有进行大小端转换的话也不会影响最终的字符串值。

  

8、 推挽输出和开漏输出有什么区别?

  1)推挽输出结构是由两个MOS或者三极管受到互补控制的信号控制,在任意时刻,两个晶体管一个在导通,一个在截止。推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。
  2)开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平。因为输出电平完全由上拉电阻连接的电源电平决定,所以可以很方便的调节输出的电平。

  

9、 Linux的signal信号函数格式,常用的信号及其处理方式

  略

  

10、GDB调试

  略

  

11、 POSIX标准提供的线程、互斥量、条件的相关函数有哪些?

  略

  

12、 TCP编程,client端和server端创建过程是怎样的?

  client
  1)配置sockaddr_in结构体,注意大小端转换
  2)创建套接字:socket
  3)连接服务器:connect
  4)发送/接收数据:send/recv
  5)关闭套接字:close
  server
  1)配置sockaddr_in结构体,注意大小端转换
  2)创建套接字:socket
  3)绑定地址:bind
  4)监听端口:listen
  5)等待连接:accept
  6)发送/接收数据:send/recv
  7)关闭套接字:close

你可能感兴趣的:(杂谈)