2020大疆校招嵌入式B卷编程题

题考的比较基础,同时也很注重细节,最坑的是不能用本地编译器编译测试,在线的也不能,只能手写
1、写宏定义
(1)x对a向下取整数倍的宏定义ALIGN_DOWN(x, a) 例子(65,3)->63
(2)x对a向上取整数倍的宏定义ALIGN_UP(x, a) 例子(65,3)->66
其实这个就是个取余的问题,向下就是减掉余数,向上加上a-余数,注意宏定义细节,括号都加上加好,防止出现输入64+1或者其他的情况,造成计算错误

#define ALIGN_DOWN(x, a) ((x) - (x) % (a))
#define ALIGN_UP(x, a) ((x) + a - (x) % (a))

(3)x对a向下取整数倍的宏定义ALIGN_2N_DOWN(x, a) ,a是2的n次幂例子(65,4)->64
(4)x对a向上取整数倍的宏定义ALIGN_2N_UP(x, a) 例子,a是2的n次幂例子(65,4)->68
注意要用2的n次幂这个特性进行加速
笔者做的时候知道这个是利用位运算,然而在笔试时紧张第二个写错了,现在想想真的二啊我。。。。
首先2的n次幂有个特性,减一之后低于n的位全部变为1,举例4d,0100b,减一变为0011,取反1100,利用这个特性便可以做出第三四来(好气啊,笔试紧张,向上的我写错了!!!)

#define ALIGN_2N_DOWN(x, a) ((x)&~(a - 1))
#define ALIGN_2N_UP(x, a) ((x + a - 1)&~(a - 1))

其实最后一个向上2n次幂向上取整是在linux内核中定义的,哎多看源码,多积累把~~~
linux原始定义如下,和我们写的一样,注意(),我上面没有写。
#define ALIGN(x,a) (((x)+(a)-1)&~(a-1))
2、第二考察特别细节,
硬件数据寄存器地址0x8000_0000
状态寄存器0x8000_0004
状态寄存器31位为1时数据有效读出来,并清除,有效返0,无效返回负数
注意volatile、const、assert、等等吧
具体见下面代码,笔试时重定位写错了,哎,注意细节!!!!
2020大疆校招嵌入式B卷编程题_第1张图片

你可能感兴趣的:(2020大疆校招嵌入式B卷编程题)