1.关键字 static 的作用
答:
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
2.写一个宏定义,完成功能:输入一个天数,得到这些天总共有多少秒。
答:#define GET_DAYS_SECOND(X) ((x)*24*60*60)UL
3.假设在MDK-ARM编译器中,编写一段代码,要求设置一绝对内存地址0x4455为整型值0x88AA
答:题意:1.一个绝对地址是:0x4455;2.地址上的值为整形值0x88AA;
方法一:
int *p; //定义一个整形指针
p = (int *)0x4455; //将绝对地址强制转换为整形指针类型
*p = 0x88AA; //将整形数存放在P指向的绝对地址中
方法二:
*(int *)0x4455 = 0x88AA;//直接强制转换再赋值
4.请找出下面C51的UART1中断函数中,你认为的几个错误:(用笔圈出,并加以解释)
int UART1_Interrupt (unsigned char *temp_array) interrupt 20
{
static unsigned char temp_data=0,i = 0;
if(RI1 == 1)
{
temp_data = SBUF1; //接收数据
if(temp_data == temp_array[i])
{
WireCollTerminalSensorData(); //终端传感器数据接收处理分析函数
return temp_data;
}
else
{
return temp_array[i];
}
}
if(TI1 == 1) //发送数据
{
SBUF1 = temp_array[i];
}
}
答:
1)中断函数不能有返回值,不能有参数
2)最好不要在里面做复杂运算
3)最好不要在里面定义变量
4)没有清除标志位
5.写出下面的结果
unsigned char foo(void)
{
unsigned int a = 6;
signed int b = -20;
if(a > b) {return 1; }
else {return 0; }
}
答:return 0;
解析:无符号数和有符号数之间的运算时,会自动将有符号数转换为无符号数。