*时间:2018/9/14
-----------------------------------------------------分割线---------------------------------------------------------
一、C语言:函数指针、指针函数、指针数组、数组指针等概念及实例
函数指针:
int (*p)(int x, int y);//p是一个指针,函数指针;这个函数指针指向一个int fun(int , int)类型的函数;
指针函数:
int *p(int x, int y);//p是一个函数,指针函数,返回值是一个int型指针;
指针数组:
int *a[10];//a是一个数组,指针数组,数组中的每一个元素都是一个指针,且这些指针都指向int型数据;
数组指针:
int (*a)[10];//a是一个指针,数组指针,a指向一个形如int array[10]的数组;
二、数据结构:用C实现的链表操作(add、del、mod、倒置)
详情见数据结构笔记本
三、操作系统:实时系统和非实时系统的区别和优缺点
二者的区别主要在于任务调度的算法实现:
实时系统:如ucos采用基于优先级的抢占式算法,可以保证实时性;
非实时系统:如Linux采用时间片轮转方式(时间片的大小是科用算法实现动态调整的),看起来就像是人人平等的思想。
实时系统的优点:
在于能够及时处理各种突发的事件,即处理各种中断,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑应该是中断响应时间了。中断响应时间通常被定义为:
中断响应时间=中断延迟时间+保存CPU状态的时间+该内核的ISR进入函数的执行时间[2]。
中断延迟时间=MAX(关中断的最长时间,最长指令时间) + 开始执行ISR的第一条指令的时间[2]。
非实时系统:
一般用于实时性能要求不高的场景,在宏观上多任务是并行的。
四、协议:IIC、SPI、UART、单总线等要从时序、安全性、数据传输等多方面来讲
五、协议设计???
六、Linux中断实现机制和中断对外设时序间隙的影响、中断中不能用延时的原因
中断主要涉及:中断控制器机制、中断硬件处理流程、Linux中断(外部、软)的处理
(1)中断控制器
CPU -------中断控制器------N个中断源
所以中断控制器的作用是聚合N个中断源,并裁决(分散)给CPU,使其做进一步处理。
对于中断控制器内部的机制,主要是:
中断源触发------是否屏蔽-------决定 是否挂起-----然后判断中断类型(IRQ FIQ)-----裁决执行中断源------CPU处理
(2)中断硬件处理流程
当中断发生(以上过程已完成,并通知CPU)-----CPU保护现场工作-----执行ISR------恢复现场工作
CPU保护现场工作:主要是工作状态、模式、REG的保护
CPU恢复反之。
(3)Linux中断
1.顶底半部机制
2.外部中断处理
3.软中断处理
4.中断延时影响及其解法
七、volatile应用实例
1) 中断服务程序中修改的供其它程序检测的变量需要加volatile;
2) 多任务环境下各任务间共享的标志应该加volatile;(多线程中的volatile使用)
3) 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。
参考:https://blog.csdn.net/whatday/article/details/52511071
八、哈佛结构和冯.若依曼结构的区别
九、智力数学题
十、32位和64位编译器对同一个结构体的内存大小影响
十一、Device Tree //重点
十二、硬件中断处理流程
详情见六
十三、epoll内核实现概述
十四、用socket做过什么项目
十五、ucos(RTOS)
十六、写标准宏,返回最小值
#define MIN(a, b) ( (a) > (b)?(b):(a) )
主要是考虑当宏参数为表达式时尽可能不出错
仍然有一个缺陷:
MIN( *p++, a ) = ( ( *p++ ) > (a) ? (*p++) : (a) )
比较*p 和 a的大小,但是同时p++;如果*p > a, 则结果是MIN = a,且p++;
如果*p < a, 则结果是MIN = *(p++),且p++了两次。
十七、两个栈实现一个队列
十八、struct和class实现类的区别
首先,C++中的struct是对C中struct的一种扩展,具有封装(可以有成员函数)、多态、继承等类的特性,所以看起来struct和class是相同的。
实际上,struct的应用场景仍然是简单的数据结构,class适用于对象。
区别?本质区别和其他区别:
本质区别:
(1)默认的访问权限不同
struct默认是publib的,class默认是private(可以在内部自定义)
(2)默认的继承权限不同
继承的权限是基于子类,而不是基类,如:
struct A{ };//基类A
struct B: A{ };//子类是B,所以默认的继承权限是publib继承(等价于 struct B: publib A{ };)
class C: A{ };//子类是C,所以默认的继承权限是private继承(等价于 class B: private A{ };)
其他区别:
(1)当struct/class中定义了构造函数或虚函数,这种“数据结构”的特性被认为是 对象,不能再定义时直接赋值;若struct/class仅定义了一般数据和成员函数,是可以在定义时直接赋值的。
(2)class可以定义模板参数,struct不能。
参考:https://www.cnblogs.com/ccsccs/articles/4025215.html
十九、类继承和类多态
二十、IPC之管道(pipe)
(1)有名管道
(2)无名管道
二十一、多进程/线程
(1)同步、通信方式
进程:IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。Socket用在网络编程中。