1、STM32 中断是怎么进入到中断服务程序的?
点击查看 原题更多的解析与讨论
在STM32中,为了区分不同的中断,每个设备有自己的中断号。
系统有0-255一共256个中断。
系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。
每个入口地址对应一段代码,即中断服务程序。
2、malloc和new的区别?
点击查看 原题更多的解析与讨论
1、申请的内存所在位置不同。new操作符从自由存储区上为对象动态分配内存空间,malloc函数从堆上动态分配内存。
2. 返回类型安全性不同。new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
3. 内存分配失败时的返回值不同。new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL。malloc分配内存失败时返回NULL。
4. 是否需要指定内存大小不同。使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。malloc则需要显式地指出所需内存的尺寸。
3、为什么局部变量未赋值时,每次初始化的结果是不确定的?
点击查看 原题更多的解析与讨论
定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。
因为这段内存空间在栈上,而栈内存是反复使用的,上次用完没清零的。
所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的,是不确定的。
4、简述linux的锁机制?
点击查看 原题更多的解析与讨论
(1)互斥锁:mutex,保证在任何时刻,都只有一个线程访问该资源,当获取锁操作失败时,线程进入阻塞,等待锁释放。
(2)读写锁:rwlock,分为读锁和写锁,处于读操作时,可以运行多个线程同时读。但写时同一时刻只能有一个线程获得写锁。
(3)自旋锁:spinlock,在任何时刻只能有一个线程访问资源。但获取锁操作失败时,不会进入睡眠,而是原地自旋,直到锁被释放。这样节省了线程从睡眠到被唤醒的时间消耗,提高效率。
(4)条件锁:就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足了,即可唤醒该线程(常和互斥锁配合使用)
(5)信号量。
5、介绍下常用的gdb命令
点击查看 原题更多的解析与讨论
quit:退出gdb结束调试
list:查看程序源代码
reverse-search:字符串用来从当前行向前查找第一个匹配的字符串
run:程序开始执行
help list/all:查看帮助信息
break:设置断点
break get_sum:以函数名设置断点 break 行号或者函数名
if 条件:以条件表达式设置断点
watch 条件表达式:条件表达式发生改变时程序就会停下来
next:继续执行下一条语句 ,会把函数当作一条语句执行
step:继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码
6、C++ 什么情况下必须用初始化列表
点击查看 原题更多的解析与讨论
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.const 成员或引用类型的成员。因为 const 对象或引用类型只能初始化,不能对他们赋值。
7、linux用户态怎么进入内核态?
点击查看 原题更多的解析与讨论
linux从用户态到内核态的切换通过系统调用接口来实现,而系统调用切换时通过软件中断来完成,该中断是程序人员自己开发出的一种正常的异常,那么在Linux下,这个异常具体就是调用int $0x80的汇编指令,这条汇编指令将产生向量为0x80的编程异常。
8、操作系统条件变量的惊群效应是什么
点击查看 原题更多的解析与讨论
惊群效应原本是:当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。
在操作系统中,多进程/多线程等待同一资源时,当某一资源可用时,多个进程/线程会惊醒,竞争资源。这就是操作系统中的惊群。