1、用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。
解答:这一道题主要容易错的地方就是:函数指针、指针数组。
int (*a[10])(int);
举一反三
2、给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。
解答:这道题清除a的bit3,使用“&=~”的方法。
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
3、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。
解答:这一问题测试你是否知道为了访问一绝对地址,把一个整型数(绝对地址)强制转换为一指针是合法的。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
举一反三
4、下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
5、尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
解答:动态分配将不可避免会产生问题:
- 内存泄露:内存泄露通常是程序自身编码缺陷造成,常见的 malloc内存后没有free等类似的操作, 系统在运行过程当中反复的malloc,吃掉系统内存,造成内核OOM,将某个进程需要申请内存的杀死而退出。
- 内存碎片:内存碎片是一个系统问题,反复的malloc和 free,而free后的内存又不能马上被系统回收利用。这个是因为负责动态分配内存的分配算法使得这些空闲的内存无法使用,这一问题的发生,原因在于这些空闲内存以小且不连续方式出现在不同的位置。
笔者点评
????????FreeRTOS实时操作系统,里面文件 headx.c有内存回收机制,所以在嵌入式设备MCU内嵌FreeRTOS实时操作系统。当malloc、free完之后,内存回收机制就会自动回收内存,把碎片内存重新恢复如新,用户可以放心使用malloc、free。
????????但是,普通的单片机,没有像FreeRTOS里面的 headx.c 内存回收机制的话,就会产生上述所说的内存泄漏和内存碎片问题,所以此种情况,不建议使用malloc、free的诸如单链表或双链表,笔者建议使用环形队列。
|