Copy of 嵌入式 作业3

简答题

1.简述你对内存的理解。

(1)从硬件形态上,内存是一个条形的物理设备;
(2)从功能上讲,内存是一个数据仓库,程序在执行前都要被装载到内存中,才能被中央处理器执行。
(3)内存是由按顺序编号的一系列存储单元组成的,在内存中,每个存储单元都有唯一的地址,通过地址可以方便地在内存单元中存储信息。内存中的数据要靠供
电来维持,当计算机关机或意外断电时,其中的所有数据就永久地消失了。

2.谈谈你对嵌入式程序开发中高级语言选择的理解。

(1)嵌入式开发是在操作系统内部做开发的,而操作系统所有的内核都是C语言所编写的,所以在嵌入式开发的过程中也选择C语言,具有一定的优势的。
(2)对于其它高级语言来说运行效率一般比较低,C语言程序运行效率可达汇编的80%,而其它开发程序可能只要C语言的80%,源代码和目标代码也可能会比较长,这样来说就会使内存占用的比较大。嵌入式开发的编程是需要在开发板上跑的,如果内存占用的过多那么就会影响相应的性能,所以对比来说C语言的优势就会突出起来。

3.参数宏和函数的异同点

参数宏的作用:
  1. 参数宏是预处理伪指令的一种,可以减少编程量,改进源程序的可读性,参数宏更减少了函数调用的开销。
  1. 可以避免程序中多次用include指令包含头文件,出现重定义的错误。
编译器是在程序的预编译阶段对宏进行处理的,主要是用预编译指令来替换源文件中的宏。
1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。
2.宏进行定义时不会考虑参数的类型。
3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。
4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
5.参数宏在定义时要多加小心,多加括号。
6.函数只在目标文件中存在一处,比较节省程序空间。
7.函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。
8.函数的参数存在传值和传地址(指针)的问题,参数宏不存在。
notion image

4.如何理解嵌入式C编程中的volatile修饰符?

  • volatile:易失性修饰符 ,说明所定义的变量或指针可以被多种原因修改。例如,有的变量在中断服务程序中会被修改,有的会被I/ O修改,这种修改带有随机性,为防止丢失任何一次修改,需要修饰为易失性变量。注意:禁止把它作为寄存器变量处理,也禁止对它进行任何形式的优化。

5.staic的三种使用方法

(1)可以修饰局部变量
改变局部变量的生命周期,使之延长,和程序的生命周期一样。
(2)修饰全局变量
改变全局变量的作用域,此时这个变量只能在当前所在的源文件使用。
(3)修饰函数
改变函数的使用范围,这个函数只能在自己所在的原文件内部使用,不能在源文件其他内部使用。

参考

6.在C语言中,如何利用条件编译避免文件重复包含?

使用预处理指令中的宏定义指令——#define,它可以避免程序中多次用include指令包含头文件,出现重定义的错误。
使用以下结构
#ifndef _HEADERNAME_H #define _HEADERNAME_H ...//(头文件内容) #endif
  • 当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。

选择题

notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
notion image
参考
不改变其他位的值的状况下,对某几个位进行设值。
  • 这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。
  • 比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作
GPIOA->CRL&=0XFFFFFF0F; //将第4-7位清 0
然后再与需要设置的值进行|或运算
GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值

13.填空题

关于include 和 extern,在多文件的项目中,一个文件用到了另一个文件中定义的函数,此时既可以用extern来引用该函数,又可以#include 另一个文件使得编译通过。这两种方式本质上没太大区别,在include的文件(头文件)里有时也用extern来声明.但用include文件有很多优点:当用到多个外部变量或函数的时候, extern:在每个用到的文件中需要用多个extern 声明; include:只需要在在文件开始用include声明一次,其它使用这些变量的只需要包含该头文件即可.include 后面跟的是头文件(填空 1,中文), include头文件的变量在各自的cpp里面,是独立的。不会有互相的影响的。extern声明时,在所在处函数名字不能重复。这两种方式最好用include (填空 2,英文),这样程序更清晰,更容易维护。
大体上,你可以把extern 和 include 的区别当做是“零售”与“批发”的区别。 include是批发,而extern 则是零售。

参考

下图
notion image

14.I/O接口的两种编址方式?有何优缺点?

(1)单独编址:译码电路简单、内存空间大;需专用I/O指令和引脚信号;
(2)存储器统一编址:指令、引脚信号统一;译码电路复杂、内存减少。