嵌⼊式⾯试题整理(⼀)
⾃⼰整理了⼀些来⾃各个公司嵌⼊式⾏业的⾯试的题⽬。答案在后⾯(是⾃⼰写的答案,不敢保证100%正确,哈哈,能⼒有限)。题⽬都是近两年的公司⾯试题
1. 关键字volatile有什么含义?并列举⼀个例⼦。
2. 嵌⼊式系统总是要⽤户变量或寄存器进⾏位操作。给定⼀个整变量a,写两段代码,第⼀个设置a的bit 3,第⼆个清零a的bit3。在以
上两个操作中,要保持其它位不变。
3. 嵌⼊式系统经常具有要求程序员去访问某特定的内存位置的特点。在某⼯程中,要求设置⼀绝对地址位0x67a9整型变量的值为
0xaa66。编译器是⼀个纯粹的ANSI编译器。写代码去完成这⼀任务。
4. 中断是嵌⼊式系统中重要的组成部分,这导致了很多编译开发商提供⼀种扩展—让标准C⽀持中断。 具代表事实是,产⽣⼀个新的关
键字__interrupt。下⾯的代码就使⽤了__interrupt关键字去定义了⼀个中断服务⼦程序(ISR),请评论⼀下这段代码的。
__interrupt double compute _area(double radius)
{
double area = PI*radius *radius;
printf(” Area = %f”, area);
return area;
}
1. 请问运⾏test函数会有什么结果?为什么?
(1)void getmemory( char *p )
{
P=(char*)malloc( 100 );
}
void test( void )
{
Char *str = null;
getmemory(str);
strcpy( str, “hello world” );
Printf( str );
}
(2)char *getmemory( void )
{
char p[] = “hello world”;
return p;
}
void test( void)
{
char *str = null;
str = getmemory();
printf( str );
}
6、⽤⼀句语句实现x是否是2的若⼲次幂的判断?
解答:
1.
Volatile关键字修饰变量,表⽰该变量是⼀个会意想不到改变的量(在某个特定的时刻就会改变),所以该变量是不能被编译器优化的(有时编译器为了操作⽅便,会把变量保存在⼀个寄存器中,使⽤的时候会直接从寄存器去取该变量的值),要去读取数据的时候要从保存变量的内存单元去取。避免读到的数据是有误的。
例⼦:在使⽤多线程编程时,同时访问同⼀个变量就可能造成数据不符的情况
⼩知识:C语⾔的原⼦性:在执⾏程序的过程中,如果⼀条语句不能被拆分,则该语句具有原⼦性。但在C语⾔中⼤部分语句是不具备原⼦性的。⽐如接下来的⼀条语句:i++; 刚刚接触的可能会想,不就是i⾃加1吗,这中间还会有其他的操作。答案是,会的,在汇编的时候该语句,包含了三个动作:1.读取i变量到寄存器,2.对寄存器的值加1,3.把结果保存到i变量所对应的内存中。所以当多段代码同时要使⽤i变量的时候就会造成数据的错误读写。
2.
在做这道前要知道以下的知识点
1&0=0; 1&1=1; 0&0=0;
1|0=1; 1|1=1; 0|0=0;
1^0=1 1^1=0; 0^0=1;
了解这些这道题就⽐较简单了;
将a的第三位置1,其他位不变 将a的第三位清0,其他位不变
a=a|(0x1<<2); a=a&(~(0x1<<2))
总结:(假设m=4)
⼀个整数n,把它的第m个⼆进制位变成0,其他的⼆进制位不允许改变
n = n&11111111 11111111 11111111 11110111
n = n&(~(1<<(m-1)))
⼀个整数n,把它的第m个⼆进制位变成1,其他的⼆进制位不允许改变
n = n|00000000 00000000 00000000 00001000
n = n|(1<<(m-1))
⼀个整数n,把它的第m个⼆进制位反转(原本1--》0原本0--》1),其他的⼆进制位不允许改变
n = n^00000000 00000000 00000000 00001000
n = n^(1<<(m-1)
3.
置⼀绝对地址位0x67a9整型变量的值为0xaa66。编译器是⼀个纯粹的ANSI编译器。
⽅法⼀:
int *p;
p = (int *)0x67a9;
*p =(int) 0xaa55;
通过该⽅式可以⽐较明确的完成⽬标。
⽅法⼆:
⼀些⼤神也会这样写:
*(int * const)(0x67a9) = 0xaa55;
其实意思⼀样的。
注:在你⽤unix来测试该端代码的时候会发⽣当段错误,可能在开发板上才能⽤(来没有开始接触开发板)。
4.
还没有接触到底层开发。。。........
5.
(1)void getmemory( char *p )
{
P=(char*)malloc( 100 );
}
void test( void )
{
char *str = null;
getmemory(str);
strcpy( str, “hello world” );
Printf( str );
}
⾸先要明⽩的⼀点是,char *p 这是str的形参,⽽不是保存的str指针的地址,所以p和str是两个”⼈ ”,p的⼀切⾏为和str没有任何关系。
所以在主函数执⾏完getmemory(str);后str还是⼀个指向NULL的⼀个指针。没有被分配空间。所以执⾏strcpy( str, “hello world” );会发⽣错误
(2)char *getmemory( void )
{
char p[] = “hello world”;
return p;
}
void test( void)
{
char *str = null;
str = getmemory();
printf( str );
}
这个问题就⽐较明显了,p是⼀个数组,是存放在是⼀个局部变量,存储在栈空间中,当getmemory()
函数调⽤完后p的内存空间会被释放掉,str得到的将会是⼀个野指针。⾃然不能打印想要的字符串了。
6.
⽤⼀句语句实现x是否是2的若⼲次幂的判断?
⾸先要了解的是如果⼀个数是2的若⼲次幂,那么按照位来看,就是只有满⾜有且只有⼀位是1,其他全0;所以只要通过以下语句就可以实现了。
(x&(x-1))?(fal):(ture)