嵌入式面试刷题

1.表示一年有多少秒
#define SECONDS_PER_YEAR (606024*365)UL

2.写一个标准宏 MIN
#define MIN(A,B) ((A)<=(B)?(A):(B))

3.指针数组
int *a[10]。[]优先级高所以是a[10]数组,类型为int *

4.数组指针
int (*a)[10]。() []同优先级从左到右,有十个整形数组的指针。

5.函数指针
int (*a)(int)

6.指针数组,类型为函数指针
int (*a[10])(int)。

7.static关键字

  1. 函数内,静态变量,只声明一次,在次调用函数,其值维持不变。
  2. 模块内,函数外,静态变量,只可被模块内所有函数访问。
  3. 模块内,静态函数,只在模块内所有函数调用。

8.const关键字。只读

  • const int a;int const a;作用一样,表示常整形数。
  • const int *a;看成int const *a表示a是一个指针,指向常整形数。(指向的整形数不可修改,指针可以)const修饰的是整型数 *a,而不是指针,即a是一个指向常整型数的指针。
  • int *const a;表示a是指向整型数的常指针。(指针不可修改,整形数可以)。const修饰的是指针a,而不是整型数*a,*a为变量而不是一个常量。
  • int const *a const;表示a是一个 常指针,指向常整数。

9.volatile关键字。
提醒编译器它后面所定义的变量随时都有可能改变
优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

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

问题:

  1. 一个参数既可以是const还可以是volatile吗?解释为什么。

  2. 一个指针可以是volatile 吗?解释为什么。

  3. 下面的函数有什么错误:

     int square(volatile int *ptr)
     {
             return *ptr * *ptr;
     }
    

下面是答案:

  1. 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

  2. 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

  3. 这段代码有点变态。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:

     int square(volatile int *ptr)
     {
         int a,b;
         a = *ptr;
         b = *ptr;
         return a * b;
     }
    

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}

2020-10-26


1.访问固定内存地址
嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

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

2.中断
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)
{
    double area = PI * radius * radius;
    printf("\nArea = %f", area);
    return area;
}
  1. 中断没输入和输出
  2. 有些处理器/编译器就是不允许在ISR中做浮点运算。做浮点运算性能问题
  3. printf()经常有重入和性能上的问题。

3.动态内存分配
尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?

char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
    puts("Got a null pointer");
else
    puts("Got a valid pointer");
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值