嵌入式期末复习

一、选择题(20)


二·、判断题(10)


三、填空题(10)

  1. 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。
  2. 常用的远程调试技术主要有 插桩/stub、片上调试
  3. 字符设备驱动程序编写通常都要涉及到三个重要的内核数据结构,分别是file_operations结构体、inode结构体和file结构体。

四、简答题(30)

  1. 比较嵌入式系统与通用计算机的区别。

    解答:

    嵌入式系统是以计算机技术为基础,并且软硬件是可裁剪的专用计算机系统。"嵌入式"、"专用性"和"计算机系统"是嵌入式系统的三个基本要素,其软件和硬件可以根据需要进行添加或减少。

    而通用计算机则是包含了所有软件和硬件系统的计算机系统。

  2. 试说明嵌入式操作系统的特点。

    解答:

    嵌入式操作系统,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。

  3. 中断处理经过了哪几个阶段?

    解答:

    (1)保护断点现场;

    (2)查找、识别中断源;

    (3)执行终断处理子程序;

    (4)恢复现场和退出中断。

  4. 试叙述嵌入式最小系统的组成,并说明各部件的作用。

    解答:

    一个 ARM 最小系统一般包括:

    (1) ARM 微处理器芯片,这是嵌入式最小系统的心脏。

    (2)电源电路、复位电路,晶振电路,为嵌入式最小系统提供电源、提供时钟信号及复位。

    (3)存储器( FLASH 和 SDRAM ),微处理器芯片内部没有存储器,需要外扩存储器。

    (4) UART(RS232及以太网)接口电路。这是嵌入式最小系统不可缺少的一部分,以便与外界通信联系。

    (5) JTAG 调试接口。这也是不可缺少的,操作系统软件的下载与烧写都要通过它来完成。

  5. 在例2-1中,若把连接LED发光二极管的GPIO引脚更改为GPC0[1] ,要控制LED发光二极管点亮或熄灭,则应怎样对该端口的控制寄存器GPC0CON和数据寄存器GPC0DAT进行设置?

    解答:

第6.小题图1 GPIO端口的GPC0[1]引脚连接LED发光二极管

(1)问题分析

若要使一个LED发光二极管点亮,必须有一个正向电压,即寄存器引脚端必须是低电平。反之,若要使LED发光二极管熄灭,则寄存器引脚端必须为高电平。也就是说,寄存器引脚输出低电平时,LED发光二极管点亮,寄存器引脚输出高电平时,LED发光二极管熄灭。

(2) GPC0的端口控制寄存器GPC0CON的设置

需要把GPC0CON[1]引脚设置为输出模式。按表2-3可知,GPC0CON[1] = (0001)2 。

GPC0CON的设置如下所示。

GPC0CON[4]   GPC0CON[3]   GPC0CON[2]   GPC0CON[1]   GPC0CON[0]   
[19:16]      [15:12]      [11:8]       [7:4]        [3:0]
  0000         0000         0000         0001         0000  

第6.小题图2 GPC0CON寄存器的设置

所以,设置GPC0CON[1]为输出模式的值用二进制表示为:

0000 0000 0000 0001 0000

也可以表示为:(1<<4)

即: GPC0CON = (1<<4)

(3) 端口数据寄存器GPC0DAT的设置

GPC0DAT有5位([4:0]),每一位对应一个GPIO端口引脚,当该寄存器的某位设置为1时,则对应引脚输出高电平,该寄存器的某位设置为0时,对应引脚输出低电平。

所以,在GPC0CON[1]已经设置为输出模式的前提下,GPC0DAT设置为0x01时,GPC0[1]引脚输出高电平,GPC0DAT设置为0x00时,GPC0[1]引脚输出低电平。

即:

GPC0DAT = 0x01 时,GPC0[1]引脚输出高电平,LED发光二极管熄灭;

GPC0DAT = 0x00 时,GPC0[1]引脚输出低电平,LED发光二极管点亮。

  1. 请问 Linux 下的文件系统和 Windows 下的文件系统有什么区别?

    【解答】

    Linux的文件系统是一个树结构。最顶部是/(Root根),所有文件夹、文件和驱动盘都是这个Root的分支。

    Windows 下的文件系统是以驱动盘为单位的,它的每个驱动器有自己的根目录,形成的是多个树并列的结构。

  2. 查看Linux目录结构,说出下列目录放置的是什么数据:

    【解答】

    . /etc/:

    该目录用来存放系统的各种配置文件,系统在启动过程中需要读取其参数进行相应的配置。

    /etc/rc.d/init.d/:

    存放启动、或改变运行级时运行的脚本文件及目录。

    /usr/bin:

    该目录用来存放用户应用程序和文件,类似于Windows下的Program Files目录。

    /bin:

    通常存放Linux基本操作命令的执行文件。

    /sbin:

    存放只能由root(系统管理员)来执行的Linux基本操作命令的执行文件。

    /dev:

    存放着各种外部设备的镜像文件。

  3. 在VMware虚拟机中建立Windows操作系统与Linux操作系统的数据共享文件目录。

    【解答】

    (1)安装VMware Tools工具。

    (2)在Windows操作系统中创建一个共享文件夹。

    (3)在Linux系统中,打开/mnt目录,可以看到其中存在一个hgfs目录。打开/mnt/hgfs目录,可以看到Windows系统的共享文件夹。

  4. 什么是GCC?试述它的执行过程。

    【解答】

    Linux系统下的GCC(GNU C Compiler)是GNU项目所推出的功能强大、性能优越的多平台编译器。

    使用GCC由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历4个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

  5. 什么是内核空间,什么是用户空间?设备驱动程序运行在什么空间?

    解答:

    内核空间是指向内存映射的一块区域,负责内核文件的运行。

    用户空间是指向内存映射的另一块区域,负责用户应用程序的运行。

    设备驱动程序运行在内核空间。

  6. 设备驱动程序的作用是什么?

    解答:

    设备驱动可以理解为操作系统的一部分,它的作用就是让操作系统能正确识别和使用设备。

  7. 字符设备驱动程序开发的流程主要是什么?

    字符设备驱动程序开发流程的步骤如下:

    (1)创建设备进入点

    (2)编写字符设备驱动程序

    (3)编写Makefile文件,编译设备驱动程序

    (4)编写用户应用程序,并编译用户程序

    (5)加载设备驱动程序

    (6)运行用户应用程序

  8. CISC指令集相比,RISC指令集具有鲜明的特点,请你简要叙述RISC结构的主要特点。

  9. GNU/Linux操作系统在嵌入式领域使用极其广泛,请画图说明GNU/Linux操作系统的基本体系结构。

  10. 简要叙述进程管理的基本功能

    1.进程管理负责管理 CPU 资源,以便让各个进程能够以尽量公平的方式访问 CPU。

    2.进程管理负责进程的创建和销毀,并处理它们和外部世界之间的连接(输入输出)。除此之外,控制进程如何共享的调度器也是进程管理的一部分。3...概括来说,内核进程管理活动就是在单个或多个CPU 上实现了多个进程的抽象

  11. 简单叙述文件系统的主要功能

    1.对文件存储设备进行管理,分别记录空闲区和被占用区,以便于用户创建、修改以及删除文件时对空间的操作。-

    2.对文件和目录的按名访问、分层组织功能。

    3.创建、制除及修改文件功能。

    4.数据保护功能。

    5...文件共享功能。

  12. 判断处理器是大端还是小端

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int check_sys()
{
	int i = 1;
	return *(char* (&i));//将1的地址取出来赋给char类型的指针,最后解引用就得到了想要的值
	//char* p = (char*)&i;
	//return *p;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

运行结果:

😇😇😇可以看到:vs的字节序果然就是小端类型的呢!!!

💝 方法二:通过union共用体

c 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}
  1. 请按要求写出一个Makefile文件,要求包括:采用交叉编译器,源文件为led8.c,目标文件为led8,使用led8.h头文件,静态编译,clean操作删除上次编译结果。
c 复制代码
CC		= arm-linux-gcc 
INSTALL		= install
TARGET		= led8
all : $(TARGET)
$(TARGET): led8.c cortexa8.h 
   $(CC) -static $< -o $@
clean :
   rm -rf *.o $(TARGET) *~ 
  1. 在嵌入式文件系统Jffs2 中,结构体 Jffs2_raw_dirent 主要包括文件名、节点 ino号、父节点ino 号、版本号、校验码等信息,它用来形成整个文件系统的层次目录结构。请对具有下划线的代码写出其注释含义。
    struct jffs2_raw_dirent
    jint16_t magic;
    jint16 t nodetype; jint32_t totlen;
    2/24页
    jint32_t hdr_cre: jint32_t pino;
    jint32 t version:
    jint32_t ino;
    jint32_t metime:
    _u8 nsize;
    _u8 type;
    -u8 unused[2]:
    jint32_t node_cre;
    jint32_t name_cre;
    _u8 name [0]:
    ]:
    答:


  1. 交叉开发模式是嵌入式系统设计中最常见的开发模式。请简要叙述交叉开发模式一般采用的步骤。
  1. 编译是程序处理过程中十分重要的一个环节。请以方框图的形式简述嵌入式系统的交叉编译过程。
  1. 设备驱动程序是应用程序和硬件之间的中间件。请简要叙述设备驱动程序主要完成的功能有?

(1)对设备初始化和释放。

(2)把数据从内核传送到硬件和从硬件读取数据。

(3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。

(4)检测错误和处理中断。

5.操作系统的并发控制中,异步通知是十分重要的方法。请简要叙述异步通知

答:异步通知是指一旦设备准备就绪,则该设备会主动通知应用程序,这样应用程序就不需要不断地查询设备状态,-通常把异步通知称为信号驱动的异步 V/O(SIGIO),这有点类似于硬件上的中断。

  • 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两个操作中,要保持其它位不变。
  • 请解释嵌入式c语言中的关键字const有什么含义

五、编程题(30)

1.嵌入式系统经常要求访问绝对地址,要求设置一绝对地址为 0x5911 的整型变量的值为 0x7324。

编译器是一个纯粹的 ANSI 编译器。写代码去完成这一任务。

  • 请按要求写出一个 Makefile 文件,要求包括:采用交叉编译器,源文件为 buzzer

.c,目标文件为

led8,使用led8.h头文件,静态编译,clean 操作删除上次编译结果。

  1. 假设目标机 IP地址为 192.168.1.120,请首先在主机上编写程序实现对 10 个整数由大到小进行排序(请写出完整源码),然后简述将该程序编译、下载至目标机、修改文件权限以及执行该程序的过程。

  2. 请阅读下段代码,并按要求设计新的代码段。

请改写上述代码段,以实现如下功能:

(1)减少福环次数。

(2) 减少每次计算数组偏移量的指令。

(3) 减少流水线阻塞。

(4)每次循环滅少一条判断指令。




  1. GPIO口应用






  1. 驱动程序设计

6、设计一个程序,在用户空间的用户应用程序中输入一个10以内的整数n,通过内核空间的设备驱动程序计算从1加到n的和。

解答:

(1)内核空间的驱动程序代码,将程序保存为sum_drv.c

/***************************** * 驱动程序 sum_drv.c

****************************/

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/module.h> //模块驱动程序的头文件

#define sum_drv_MAJOR 114 //设备号 创建设备入口点时要与此值一致

#define DEVICE_NAME "sum_drv_module"

void showversion(void) {

printk("kernel: ***********************************\n");

printk("kernel: \t %s \t\n", DEVICE_NAME);

printk("kernel: ************************************\n\n"); }

// --------设备对应的打开函数---------------- static int sum_open(struct inode

*inode, struct file *file){

printk("kernel: hello open.\n");

return 0; }

// ---------设备对应的写操作函数------------- static int sum_write(struct file

*file, const char __user * buf,

size_t count, loff_t *ppos){

printk("kernel: hello write. n=%d \n", count);

int i=1;

int s=0;

for(i=1;i<=count; i++)

s = s + i;

printk("kernel: s = %d \n", s);

return 0; }

// ----设备向系统注册用的OPS结构,里面是对应的读操作入口----- static struct file_operations

sum_flops = {

.open = sum_open,

.write = sum_write, };

// ------系统初始化----------- static int __init sum_init(void){

int ret;

ret = register_chrdev(sum_drv_MAJOR,DEVICE_NAME, &sum_flops);

showversion();

if (ret < 0) {

printk("kernel: can't register major number.\n");

return ret;

}

printk("kernel: OOKK! initialized.\n");

return 0; }

// ------系统卸载---------- static void __exit sum_exit(void){

unregister_chrdev(sum_drv_MAJOR, DEVICE_NAME);

printk("kernel:" DEVICE_NAME " removed.\n"); }

// ---内核模块入口,相当于main()函数,完成模块初始化------ module_init(sum_init);

//---卸载时调用的函数入口,完成模块卸载------ module_exit(sum_exit); //

------驱动程序版本信息--------- MODULE_LICENSE("GPL");

(2)Makefile文件 obj-m := sum_drv.o PWD := ( s h e l l p w d ) a l l : m a k e − C / l i b / m o d u l e s / (shell pwd) all: make -C /lib/modules/ (shellpwd)all:make−C/lib/modules/(shell uname -r)/build M=$(PWD) modules clean: rm -rf

*.o ~ core ..cmd *.mod.c ./tmp_version

(3)用户应用程序,将程序保存为sum_drv_test.c

#include <fcntl.h>

#include <stdio.h>

int main(void) {

int fd;

int n;

fd = open("/dev/sum_drv", O_RDWR);

if(fd < 0){

printf("can't open!\n");

}

printf("fd=%d \n", fd);

scanf("%x", &n);

write(fd, NULL, n); // ioctl(fd, cmd);

close(fd);

return 0; }

(4)用dmesg查看运行结果。

  1. 网络程序设计
相关推荐
国产化嵌入式平台解决方案1 小时前
【服务器主板】定制化:基于Intel至强平台的全新解决方案
嵌入式硬件·intel·服务器主板·至强处理器·定制化
不能只会打代码1 小时前
32单片机从入门到精通之硬件架构——内核与外设(一)
单片机·嵌入式硬件·硬件架构
陌夏微秋4 小时前
STM32单片机芯片与内部47 STM32 CAN内部架构 介绍
数据库·stm32·单片机·嵌入式硬件·架构·信息与通信
7yewh15 小时前
Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
linux·arm开发·驱动开发·嵌入式硬件·嵌入式
上海易硅智能科技局有限公司15 小时前
AG32 MCU 的电机控制方案
单片机·嵌入式硬件
程序员JerrySUN16 小时前
Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制
linux·嵌入式硬件·物联网·缓存·系统架构
嵌入式小强工作室18 小时前
stm32能跑人工智能么
人工智能·stm32·嵌入式硬件
MikelSun18 小时前
电压控制环与电流控制环
单片机·嵌入式硬件·物联网
陌夏微秋19 小时前
STM32单片机芯片与内部45 UART 不定长度接收 标志位结束 定时器超时 串口空闲中断
stm32·单片机·嵌入式硬件·信息与通信·智能硬件
挥剑决浮云 -20 小时前
STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
c语言·经验分享·stm32·单片机·嵌入式硬件·学习