嵌入式相关知识每日一练3

嵌入式软件工程师面试常考题

Q1:关键字auto的作用是什么?

A1:
auto是用来声明自动变量的。
它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。

其实大多普通声明方式声明的变量都是auto变量,他们不需要明确指定auto关键字,默认就是auto。auto变量在离开作用域是会被程序自动释放,不会发生内存溢出情况(除了包含指针的类)。
使用auto变量的优势是不需要考虑去变量是否被释放,相对比较安全。

Q2:extern"C"有什么作用?

A2:
extern
关键字extern用于跨文件引用全局变量,即在本文件中引用一个已经在其他文件中定义的全局变量。

  • 注意引用时不能初始化,如extern var,而不能是extern var = 0。
  • 函数默认是extern类型的,表明是整个程序(工程)可见的,加不加都一样。
    就比如:
    在这里插入图片描述
    在这里插入图片描述

extern"C"

  • 在C++代码中调用C函数,用法:extern “C”{C函数库头文件/函数声明}。
  • 在C代码中调用C++函数,用法:在C++的头文件中加extern"C"{头文件/函数声明}。
  • 注意:extern"C"只能用于C++文件中。

Q3:关键字sizeof的作用是什么?函数strlen()呢?

A3:

关键字sizeof()用来计算变量或者类型所占的内存大小。

函数strlen()用来计算字符串的长度(只能用char*做参数)。
如下:
在这里插入图片描述

#include <stdio.h>
#include <string.h>
int main()
{
    /* sizeof与strlen() */
    char str[20] = "helloworld";
    printf("%d\n",sizeof(str));
	printf("%d",strlen(str));
    return 0;
}
//如下:返回的长度大小不包括'\0'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数组传参传入的是地址,地址本质就是指针,指针占用字节和操作系统位数有关,所以如下代码32位系统和64位系统运行出来的结果是不一样的,32位运行出来是4,64位是8。
(指针(内存大小和数据类型无关,和系统操作位数有关),在32位操作系统里面,一个char * ,int * ,long *,所占的内存大小都是32bit,也就是4个byte。)
在这里插入图片描述

Q4:一个参数既可以是const还可以是volatile吗?一个指针可以是volatile吗?

A4:

  • 一个参数既可以是const还可以是volatile,比如说只读的状态寄存器,它是volatile因为它可能被意想不到地改变,它是const因为程序不应该试图去修改它。
  • 一个指针可以是volatile,比如说当一个中断服务子程序修改一个指向一个缓冲区的指针时。 volatile 修饰指针,一般用在共享指针上面。即这个指针是被其它代码共享的,经常变化的,这时候,加上volatile关键字,可以防止被编译器优化。

Q5:关键字static的作用是什么?

A5:

  • static修饰局部变量时:①改变了其存储位置,存储在静态区;②同时改变了其生命周期,为整个源程序,因此它只被初始化一次,若没显式初始化则自动初始化为0。
  • static修饰全局变量时:改变了其作用域,只可以被文件内所用函数访问。
  • static修饰函数时:改变了其作用域,只可被这一文件内的其它函数调用。

Q6:预处理器标识#error的作用是什么?

A6:编译程序时,只要遇到 #error 就会跳出一个编译错误。

Q7:“在C语言中,凡是以#开头的都是预处理命令,同时预处理命令都是以#开头的”,这句话是正确的吗?

A7:正确的

Q8:如何用C语言实现读写寄存器变量?

A8:

#define  rBANKCON0  (*(volatile unsigned long *)0x48000004)  
rBANKCON0 = 0x12;

Q9:关键字volatile的作用是什么?给出三个不同的例子。

A9:

  • 作用:告诉编译器不要去假设(优化)这个变量的值,因为这个变量可能会被意想不到地改变。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
  • 例子: ①并行设备的硬件寄存器(如:状态寄存器)。②一个中断服务子程序中会访问到的非自动变量。③多线程应用中被几个线程共享的变量(防止死锁)。

Q10:内联函数的优缺点和适用场景是什么?

A10:

  • 优点:内联函数与宏定义一样会在原地展开,省去了函数调用开销,同时又能做类型检查。
  • 缺点:它会使程序的代码量增大,消耗更多内存空间。
  • 适用场景:函数体内没有循环(执行时间短)且代码简短(占用内存空间小)。

我们使用函数的目的是为了避免重复制造轮子,也就是为了避免重复写相同的代码。凡事有利有弊,使用函数固然课以优化我们的代码,但却增加了开销,因为每一次调用函数的过程中都会消耗内存,就会为函数分配一个栈,并且调用函数本身也会花费一些时间,并在计算机底层做一些工作(保护原来的工作环境,进入了新的执行环境)。那么我们的解决方案是使用内联函数。
内联函数实在执行函数过程中遇到函数名时不返回调用函数,而是在函数名所在地写上函数的代码。举个例子:
在这里插入图片描述

显然这个函数想要实现的功能非常简单,但是次数较多,当n的值较大时,for循环每一次返回调用函数都要消耗一定的栈空间,printf("%d\n",n);可能只要1ms,但返回调用函数却要10ms,这样子是很亏的。使用内联函数就可以解决这个问题:
在这里插入图片描述

相当于普通函数在通话过程中用的是电话,而内联函数用的却是对讲机,如果我想实行的功能较为繁琐,但调用次数不多,就使用函数,反之实行的功能较简单,代码短,但实行次数非常多,我们就使用内联函数。这也就是电话和对讲机的优劣之处。在使用过程中要看情况使用。
内联函数参考链接

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是彦歆呀嘻嘻哈哈

你的鼓励将是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值