牛客-嵌入式岗位笔试面试真题讲解

c语言与数据结构

12

1.7  如何使用c语言对寄存器进行操作

由于是寄存器地址、所以先将其强制类型转换为“volatile unsigned long*”

#define  rBANKCON0  (*(volatile unsigned long *)0x48000004)  

直接解引用赋值

rBANKCON0 = 0x12;

1.12 static

1、修饰局部变量   ,使得生命周期变长了,存储位置也变了

2、修饰全局变量,使得只能在当前.c文件中使用,不能再其他.c中调用

3、修饰函数,使得只能在当前.c文件中使用,不能再其他.c中调用

1.13  const

const放在*前是修饰指向的对象,放在*后则是修饰指针本身

13

2.1 各种指针

一重指针,变量中存放的是一个地址

二重指针,指针变量中存放的是一个指针的地址

指针数组时数组,里面存放的是很多指针  int *a[10]

数组指针是指针,指针指向一个数组的首地址   int (*a)[10]

函数指针是指针,指向一个函数:int (*a)(int)

2.2

有符号 + 无符号  有符号会转换成无符号,正数的补码等于本身,负数的补码是反码加1(负数反码是一个大正数)

原码:为二进制的数,10的原码是0000 1010

反码: 正数的反码与原码相同,负数的反码是0变1,1变0

-10 的原码是 1000 1010  反码是 1111 0101

码:正数的补码与原码相同:如 10 原码为 0000  1010   补码 0000 1010 

          负数的补码为反码 +1    如 -10  反码是 1111 0101  补码是 1111 0110

2.5

int 指针  +  int变量  = int指针的值 + 4(int 大小)

2.6  

无符号char   0~255

2.7

char类型变量  -128~127

2.10  

struct A   
{         
     char t : 4;        // 4位         
     char k : 4;        // 4位         
     unsigned short i : 8;  // 8位               
     unsigned long m;     // 4字节  
}; 

前两个一个字节 ,第三个一个字节,最后4个字节,内存对齐 1 + 1+填充+4 = 8

牛客-嵌入式岗位笔试面试真题讲解_第1张图片

2.11

对齐数是1,因为设置了 #pragma pack(1),它会取消结构体的默认对齐方式,即按照成员变量的自然对齐方式来对齐,而采用按照 1 字节对齐的方式。因此,该结构体的各个成员变量会依次紧凑地分布在结构体内存空间中,没有填充字节。

2.12

数组地址 = 元素首地址

不同之处是 a + 1  就是下一个元素地址,&a+1 是移动一个数组的地址空间大小

2.13

指针 - 变量 = 指针地址移动变量类型空间大小 

2.14

字符数组,数组中存放的是字符

字符串数组,数组中存放的是字符串,char str[2][3] 是字符串数组

2.15

p指向a[1],p[6]表示p向后移动六个数字

2.16

char *str[]   定义一个指针数组
char str[2][3]  定义一个字符串数组

14

3.1

全局区

.data

初始化不为0的全局变量和静态变量、const型常量在一块区域

.bss段

未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域

3.2 判断一个系统的大小存储模式

牛客-嵌入式岗位笔试面试真题讲解_第2张图片

3.6

函数中的变量在函数结束后机会注销 

3.7 野指针

指针没有初始化,任何刚创建的指针不能自动创建成为NULL

指针被free或者delete,没有置NULL

指针操作超越了变量的作用范围

3.13

堆内溢出:堆的尺寸设置过小,动态申请的内存没有释放

栈内溢出:栈的尺寸过小、递归层数太深、函数调用层次过深

ARM裸机

17

1.11 复位中断与其他中断有什么不同

复位中断立即中止当前指令去执行中断、其他中断是等执行完当前指令再响应其他中断



应用编程与网络编程

20

1.1 异步IO和同步IO

同步io:程序需要进行I/O操作的时候会等待该操作执行结束再进行后续

异步io:程序需要进行I/O操作的是时候会继续执行下面的代码,等I/O操作结束才会处理该操作的结果

1.2  进程间通信方式

管道(pipe): 半双工   父子进程之间通信

有名管道:半双工   允许非亲缘进程之间的通信

信号量:是一个计数器,通常作为一个同步机制,用于进程和线程之间的同步

消息队列:是一个消息链表,存放内核中并且由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限的问题

共享内存:一段可以被多个进程共同访问的内存,由一个进程创建。共享内存是最快的ipc

套接字:用于不同主机进程通信

信号:用于通知接收进程某个事件已经发生,是一种比较复杂的通信方式

1.6 什么是进程上下文、中断上下文

1、进程上文:是指进程由用户态切换到内核态是需要保存用户态的cpu寄存器的值,进程状态以及堆栈上的内容。

进程下文:是指切换到内核态后执行的程序,即进程运行内核执行的程序

2、中断上文:硬件通过中断触发信号,导致内核调用中断处理函数,进入内核空间。这个过程中硬件的一些参数需要传递,这些参数就是中断上文

     中断下文:执行在内核空间的中断服务程序

1.13线程间通信和同步方式有哪些?

信号、信号量、互斥锁、条件变量、自旋锁、读写锁

驱动开发与操作系统

22

内核申请函数的时候使用的函数是什么,应用申请内存

kmalloc:申请小块内存,连续的

kzalloc:小块内存连续但是内存块会被初始化为0

vmalloc:大块内存

malloc 应用程序申请内存

自旋锁和信号量使用的注意

1、自旋锁的进程不会睡眠,信号量会睡眠

2、中断就是自旋锁

写一个中断服务程序需要注意什么

1、中断服务程序需要断、尽可能将任务放在底半部

2、中断服务程序不能有阻塞,因为中断期间cpu是完全占据cpu、不存内核调度

3、中断服务程序的返回值要用操作系统定义的宏,不能用自己定义的

你可能感兴趣的:(秋招准备,数据结构,c语言)