嵌入式程序员 应该知道的0x10个基本问题



1、 用 预处理指令 #define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)
 #define 	SECONDS_PER_YEAR 	(60 * 60 * 24 * 365)UL

2、 写一个标准宏 MIN ,这个宏输入两个参数,并返回较小的一个
#define 	MIN(A,B)	((A) <= (B) ? (A):(B))

3、 预处理器标识 #error 的目的是什么
#error : 停止编译 并显示 错误信息

4、 嵌入式系统中经常要用到无限循环,你怎么样用 C 编写死循环
 while(1){...}

do {...} while(1)

for(;;){...}

5、 用 变量 a 给出下面的定义
序号定义效果
1int a整型
2int * a指向整型数指针
3int ** a指向指针指针,它指向指针指向整型数
4int a[10]有10个整型数数组
5int * a[10]有10个指针数组,它的指针指向整型数
6int (*a)[10]指向有10个整型数数组指针
7int (*a)(int)指向函数指针,该函数有一个整型参数,并返回一个整型数
8int (*a[10])(int)有10个指针数组,该指针指向一个函数,该函数有一个整型参数 并返回一个整型数

6、static 的作用,请写出两个;
序号作用
1函数体static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
2模块内的static 全局变量可以被模块所有函数访问,但不能被模块外 其他函数访问
3模块内的static 函数,只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它 的模块内

7、关键字const的作用;
序号作用
1只读
2使用关键字const也许能产生更紧凑的代码
3使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改

另外使用const定义变量:

序号定义效果
1const int aa 是常 整型数
2int const aa 是常 整型数(同上)
3const int * aa 是 指向常 整型数指针const修饰int,所以是常 整型数
4int * const aa 是 指向整型数常指针const修饰a,所以a常指针
5const int * const aa 是 指向常 整型数常指针

8、volatile的作用;

定义为volatile的变量可能会被意想不到地改变,优化器在用到这个变量时必须重新读取这个变量的值,而不是保存在寄存器里的备份


volatile变量的例子:

序号作用
1并行设备的硬件寄存器(如状态寄存器)
2一个中断服务子程序中会访问到的非自动变量
3多线程应用中,被几个任务共享的变量

9、 嵌入式系统总是要用户对变量或寄存器,进行位操作
#define 	BIT3 	(0x01 << 3)

static int a;
void set_bit3()
{
	a |= BIT3; 			//置 1
}
void clear_bit3()
{
	a &= ~BIT3; 		//清 0
}

10、嵌入式系统经常具有要求程序员去访问某特定的内存位置,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66
int * ptr = NULL;
ptr = (int *) 0x67a9;
*ptr = 0xaa66;

11、中断的概念

当某个事件发生时,CPU 停止运行正在执行的程序,而转去执行处理该事件的程序,处理该事件后,返回原程序继续执行下去的过程;
ISR中断服务程序Interrupt Service Routines

序号作用
1ISR不能返回值
2ISR不能传递参数
3ISR应该是短而有效率的,在ISR中做浮点运算是不明智的
4printf()经常有重入和性能上的问题,所以不能在中断处理函数里调用printf()

12、代码输出结果;
void foo(void)
{
	unsigned int a = 6;
	int b = -20;
	(a + b > 6) ? puts(" > 6 ") : puts(" <= 6 ");
}

表达式 中存在 有符号类型无符号类型 时,所有的 操作数 都自动转换为 无符号类型,因此 -20 变成了一个非常大的正整数,该表达式计算出的结果 大于6,答案是输出 > 6

13、 评价下面的代码片断:
unsigned int zero = 0;
unsigned int comp_zero = 0xFFFF; 		//0 的反码(错误结果)

对于一个int不是16位的处理器来说,上面的代码是不正确的

正确结果编写如下:

unsigned int comp_zero = ~0;				//0 的反码(正确结果)(complement 反码)

14、 动态内存分配;
int * p = NULL;
p = (int *) malloc(sizeof(int) * 128); 	//内存申请
free(p); 								//内存释放

15、typedef语句用于给基本数据类型和导出数据类型定义一个新的名字
#define 	dPS 			struct s *
typedef 	struct s * 		tPS;
dPS p1 , p2; 						//错误定义,实际结果是 struct s * p1, p2;
tPS p3 , p4; 						//正确定义了两个指针

16、分析代码
int a = 5, b = 7, c;
c = a +++ b;

上面的代码被处理成:c = a++ + b;代码执行后 a = 6, b = 7, c = 12

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值