1.整理1
- 使用宏#define表示1年(以365天为准)有多少秒?(4)
#define year (365UL * 24UL * 60UL * 60UL)
- 使用宏#define表示min(a, b),注:min返回a、b中的最小者。(4)
#define MIN(a,b) ((a) < (b) ? (a) : (b))
- 计算一个数组的长度(4)
int arr[3] = {1,2,3};
int a = sizeof(arr)/ sizeof(int)
-
宏#define和typedef的区别?(4)
-
指针与数组的联系与别(4)
-
联系:数组名就是指向数组首地址的指针,指针可以通过下标访问数组
-
区别:数组名的地址是一个常量,不可重新赋值,指针是一个变量
-
内存分配:数组是一块连续的内存,长度是固定的,指针是变量,动态分配。
-
static的作用是什么?(4)
-
修饰全局变量和函数时,表示作用域只在当前文件
-
修饰局部变量时,该变量的生命周期运行到程序结束
-
静态变量默认初始化为0。
-
-
const的作用是什么?(4)
防止变量被意外修改
-
volatile的作用是什么?(4)
-
printf为什么不能用在中断里面?(6)
不可重入性:printf
可能调用全局缓冲区或者静态变量,中断调用可能导致数据竞争
阻塞风险:printf
可能涉及系统调用或等待I/O,延长中断处理时间,影响实时性
堆栈溢出:中断上下文堆栈较小,printf
的深层调用链可能导致溢出
- 对内存地址为0x0100_0000的变量赋值为0xffaaaaff(6)
*(uint32 *)0x0100_0000 = 0xffaaaaff;
-
简述uart配置的过程(6)
-
设置时钟源
-
初始化gpio口,配置复用推挽和浮空输入
-
配置波特率,校验位,停止位,字节长度
-
-
是否开启中断
-
中断的简述(8)
cpu暂停执行当前中断,转去执行特定服务程序,完成后恢复原认为
-
CPU流水线的工作原理?(8)
-
uart配置波特率为115200,则每秒发送多少有效数据?写出计算过程(需写清楚计算过程并说明来源)。(10)
-
波特兰吧115200表示每秒传输115200bit
-
每个字符包含 1位起始位,8位数据位,1位停止位 = 10位
-
传输速率 115200/10 = 11520 字符/s;
-
每秒有效数据 11520 * 8 =115200字节
-
spi、iic协议的联系与区别(至少答出5条)?(12)
-
怎么判断处理器是大端模式还是小端模式?请使用C语言描述该过程(至少2种方式)(12)
联合体和指针强制转换
/*1. 联合体*/
typedef union
{uint16_t value;char bytes[sizeof(uint16_t)];
}union_t;union_t a;a.value = 0x1234;if(a.bytes[0] == 0x34){printf("小端存储\r\n");}else{printf("大端存储\r\n");}
uint32_t num = 0x12345678;uint32_t *p = #if( (uint8_t)*p == 0x78){printf("小端存储\r\n");}else{printf("大端存储\r\n");}