嵌入式笔试题目

1 WLAN和wifi有什么区别?

WLAN是wireless local network的缩写,代表无线局域网,不特指某项技术。实现WLAN的特定技术实际上有多种,802.11是其中应用最为广泛的一种WLAN技术。WiFi实际上指的是WiFi联盟,它负责802.11的商业推广,设备的标准认证,但是最后却演变为802.11的代名词,进而又演变为WLAN的代名词

 

2 下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的错误?

__interrupt double compute_area(double radius)

{

double area = PI*radius*radius;

printf();

return area;

}

1、ISR不能有返回值,必须用void;
2、ISR不能传递参数,必须用void;
3、ISR应该是短而高效的,所以不推荐在ISR中做浮点运算,应该只由中断发出消息或置位标志然后由应用层去处理其他工作;
4、ISR中不应该有重入和性能上的问题,因此使用pintf()函数也是不好的。

 

3 一个参数即可以是const还可以是volatile吗?

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

volatile修饰符告诉complier变量值可以以任何不被程序明确指明的方式改变,最常见的例子就是外部端口的值,它的变化可以不用程序内的任何赋值语句就有可能改变的,这种变量就可以用volatile来修饰,complier不会优化掉它。
const修饰的变量在程序里面是不能改变的,但是可以被程序外的东西修改,就象上面说的外部端口的值,如果仅仅使用const,有可能complier会优化掉这些变量,加上volatile就万无一失了。

4 一个指针可以是volatile吗?

当然可以。
volatile 修饰指针,一般用在共享指针上面。
即这个指针是被其它代码共享的,经常变化的,
这时候,加上 volatile 关键字,可以防止被编译器优化。

5 c语言中static说明是什么意思?

static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
static对栈变量的修饰,可以认为栈变量的生命周期延长到程序执行结束时。一般来说,栈变量的生命周期由OS管理,在退栈的过程中,栈变量的生命也就结束了。但加入static修饰之后,变量已经不再存储在栈中,而是和全局变量一起存储。同时,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。
static对函数的修饰与对全局变量的修饰相似,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。

6 大小端如何区分?

大端模式(Big_endian)   -- 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

7 用预处理指令#define声明一个常数,用以表明一年中有多少秒(忽略闰年问题)

8 写一个“标准”宏判断一个数是否是2的幂(power of 2),说明程序中宏和inline函数的区别是什么?

9 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

这个问题用几个解决方案。我首选的方案是:
while(1) { }
一些程序员更喜欢如下方案:
for(;;) { }
这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。
第三个方案是用 goto
Loop:

goto Loop;

10 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3和bit5,第二个清除a的bit3和bit5.在以上两个操作中,要保持其他位置不变。

    #define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
    a |= BIT3;
}
void clear_bit3(void)
{
    a &= ~BIT3;
}

11 在计算机系统中,大小端是指什么?请使用c编写程序判断机器的大小端情况?

据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下

0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下

int checkSystem2(void)
{
    int i = 0x12345678;
    char *c = &i;
    return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));
}

————————————————
版权声明:本文为CSDN博主「kit_9875507」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kit_9875507/article/details/44264663

 

12 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66.编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值