1. 面向对象的四个基本特性是 封装 、 继承性 、 多态 和 抽象 。
2. 在STM32F4单片机中,任何中断从产生到响应都需要经过中断源和中断控制器两大阶段;
3. 在STM32中,当中断A产生且CPU已经跳转去执行中断A的处理程序的过程中,又产生了中断B,此时中断B是否能打断中断A的中断处理程序取决于中断B的 抢占 优先级是否比中断A高。
解析:STM32中断优先级分为 抢占优先级(决定后面产生的中断是否可以打断一个正在执行的中断) 和 响应优先级(决定几个中断同时产生时,谁会先被响应执行)
4. ARM7 微处理器的有哪两种工作状态分别是 ARM 态(32位)和 Thumb 态(16位)
三. 问答题
1. 引用与指针有什么区别?
a) 引用必须被初始化,指针不必。
b) 引用初始化以后不能被改变,指针可以改变所指的对象。
c) 不存在指向空值的引用,但是存在指向空值的指针。
2. 全局变量可不可以定义在可被多个.C文件包含的头文件中?该如何定义?为什么?
可以,但要加extern 声明.如果不加extern,编译时会报重定义
3.Linux中用户模式和内核模式是什么含义
内核模式拥有更高权限
linux中内核本身处于内核模式,应用程序处于用户模式。内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。
4.动态库和静态库的区别和优缺点?
动态链接的优缺点:生成的可执行文件较小,但是对环境的依赖大,比如说我们用动态库生成一个可执行文件,我们把这个可执行文件放到另一个环境中,在这个环境里面是没有可执行文件里面用到的库文件的,那么这个可执行文件就允许不了了。
静态链接的优缺点就刚好反过来,生成的可执行文件较大,但是对环境依赖小,因为使用静态库链接生成可执行文件时,会把静态库中的对应的内容直接链接到可执行文件中去,即使是把这个可执行文件放到没有相应的库的环境中去,也可以执行。
5. 说出下列名词的含义volatile,const,static,extern
volatile易变变量修饰词,用于防止编译器优化被修饰的语句
const常量修饰词,const修饰的变量的值不能被改变
static静态修饰词,被staic修饰的语句访问范围和生存周期会发生改变,比如: static修饰的变量(全局/局部)都只会在进程运行时被执行一次;未初始化的staic变量值为0;被static修饰的函数只能在当前文件中被调用
extern外部声明修饰词,用来告诉编译器被extern修饰的语句已在其它文件中被定义
6. 利用宏实现MIN(x,y),输出比较小的那个,如果x和y相等,那么输出x
#define MIN(x,y) ((x)<=(y)?(x):(y))
7. 请简述STM32的定时器中影子寄存器的作用?
在STM32基本定时器的PSC预分频寄存器和ARR自动装载寄存器都有影子寄存器。影子寄存器的存在起到一个缓冲的作用。设置影子寄存器后,用户设定的值不会立即生效,而是会等待一个更新事件(比如定时器溢出)后一同生效。这样就避免了因为指令的顺序执行,PSC的值与ARR的值不能同时修改而导致PWM波形的占空比会有短暂的出错情况。
8. 请简述实时操作系统和分时操作系统的区别?
1)系统的设计目标不同。分时系统是设计成一个多用户的通用系统,交互能力强;而实时系统大都是专用系统,更注重功能性和稳定性。
2)交互性的强弱不同。分时系统是多用户的通用系统,交互性强;而实时系统是专用系统,仅允许操作并访问的有限的专用程序,不能随便修改,且交互能力差。
3)响应时间的敏感程度不同。分时系统是以用户能接收的等待时间为系统的设计依据,而实时系统是以被测物体所能接受的延迟为系统设计依据。实时系统对响应时间的敏感程度更强。
9. 降低STM32F4系列MCU的功耗有哪些方法?
方法一:
设置低功耗模式,有三种模式选择:
1)睡眠模式
这种模式会关闭cpu时钟,但是所有外设包括M3内核的外设(NVIC、SysTick等等)都不会受到影响,保持运行。
2)停止模式
所有时钟都会关闭。
3)待机模式
1.2 V 域断电。PLL、HSI 振荡器和 HSE 振荡器都将关闭。
方法二:
降低系统时钟频率。
方法三:
关闭一些不使用的外设的时钟。
10、请简要描述#include “” 和 #include <>的区别
include “” 默认在工程目录下查找头文件,如果没有找到会去系统目录下查找头文件
Include <> 默认在系统目录下查找头文件,如果没有找到会报错
11、请比较标准IO和系统IO的区别
1)标准IO是标准C库提供的一套对文件操作的接口,带缓冲区,只要开发环境中有标准C库,即可使用标准IO,可移植性强。标准IO只能操作普通文件
2)系统IO是由操作系统内核提供的一套操作文件的接口,不带缓冲区,各个操作系统平台提供的系统IO接口可能不一样,可移植性差。系统IO能够操作普通文件和设备文件、管道文件、socket文件。
12、头文件中的ifndef/define/endif 的作用?
#ifndef、#define、#endif为C语言的3条预处理语句,主要用作条件编译 条件编译发生在预处理阶段,在C中,主要通过#if、#elif、#else、#ifdef、#ifndef、#endif来给一段代码附加上编译条件,然后预处理器收集满足条件的可以进行编译的代码,这样经过预处理,不满足条件的代码就不会被编译。
这三个预处理语句用在一起可以解决头文件被重复引用的问题:一个.c源程序中可能引用了多个头文件,而被源程序引用的头文件又有可能存在引用关系,比如a.h引用了b.h,然后在源程序中同时引用a.h和b.h,就会产生这个问题,这时编译器会产生符号重定义之类的错误。
13、extern全局变量、static全局变量和static局部变量的生存期分别是多少?
static 声明的全局变量只能在当前源文件中使用;
extern 不是定义, 是引入(声明)在其它源文件中定义的非 static 全局变量
Static 局部变量只会被初始化一次,随进程的持续性
14. 有以下代码
struct {
signed int bit0:1; signed int bit1:1; signed int bit2:1; signed int bit3:1;
signed int bit4:1; signed int bit5:1; signed int bit6:1; signed int bit7:1;
}bits;
请问sizeof(bits)是否是正确的表达式?
请问语句bits mybits; 的定义是否正确?如果不正确,要如何修改上述的结构定义才能使该语句正确?修改后的结构定义是否会影响sizeof(bits)的正确性?如果正确则该表达式的值为多少?如果将上述的结构中int类型改为char类型,此时sizeof(bits)的大小为多少?
1)是正确的表达式,因为sizeof后面的内容可以是类型,也可以是变量。
2)该语句的定义不正确,因为此时的bits为一个变量;应该这样修改结构的定义 typedef struct {
signed int bit0:1; signed int bit1:1; signed int bit2:1; signed int bit3:1; signed int bit4:1; signed int bit5:1; signed int bit6:1; signed int bit7:1; }bits;
修改后sizeof(bits)表达式依然正确,其值为4;类型改为char后其值为1,注意该值是在VC环境中的32位程序中得到的值,在不同的编译器其值有可能不同,因此在编程时不能自己假定类似结构的大小。
15. 有以下代码
struct a {
int x;
char y;
struct a z;
struct a *p;
}
请问这种定义结构正确否? 如果有问题,问题在哪里?
答案:结构中不能对定义结构本身的非指针变量,如果编译器支持则会导致无限嵌套,因此一般编译器都会认为struct a是未定义的类型,即使提前声明也不会有任何用处。
16、用宏定义写出swap(x,y),用来交换两个非指针变量的值。
#define swap(x, y) {(x)=(x)+(y);(y)=(x)-(y);(x)=(x)-(y);}
17、请写出 float x 与“零值”比较的 if 语句。
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
注意:不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
18、C++中,类有哪些默认成员函数?
1) 默认构造函数;
2) 默认拷贝构造函数;
3) 默认析构函数;
4) 默认重载赋值运算符函数;
5) 默认重载取址运算符函数;
6) 默认重载取址运算符const函数;
7) 默认移动构造函数(c++11);
8) 默认重载移动赋值操作符函数(c++11);