嵌入式期末复习

一、选择题(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. 判断处理器是大端还是小端

#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");elseprintf("大端\n");return 0;
}

运行结果:
vs编辑器字节序
😇😇😇可以看到:vs的字节序果然就是小端类型的呢!!!
💝 方法二:通过union共用体

#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操作删除上次编译结果。
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:makeC/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. 网络程序设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自&#xff1a;使用 NVIDIA NeMo 训练本地化多语种 LLM &#xff08;2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

Cocos入门2:软件安装

Cocos Creator的安装教程如下&#xff0c;按照步骤进行&#xff0c;可以帮助您顺利安装Cocos Creator&#xff1a; 一、下载Cocos Dashboard 访问Cocos官网&#xff1a;前往Cocos Creator的官方网站&#xff08;https://www.cocos.com/creator/&#xff09;。 下载Cocos Dash…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习&#xff08;14、内容协商基础简介&#xff09; 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商&#xff08;默认开启&#xff09; 客户端向服务器发送请求&#xff0c;携带 HTTP 标…

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速 2024/6/1 20:39 【常见问题】给TB-RK3588开发板刷机Androidd12之后&#xff0c;如果刷机线type-C不拔掉。可能起不来&#xff01; 搞得我都以为板子坏了呢&#xff01; rootrootrootroot-ThinkBook-…

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…

搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)

上一篇&#xff1a;搭建基于Django的博客系统增加广告轮播图&#xff08;三&#xff09; 下一篇&#xff1a;基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能&#xff08;五&#xff09; Sqlite3数据库迁移到MySQL 数据库 迁移原因 Django 的内置数据库 SQL…

动态规划求多段图的最短路径

一、基本思想 动态规划法将待求解问题分解成若干个相互重叠的子问题&#xff0c;每个子问题相互关联&#xff1b;动态规划法与分治法的区别就在于分治法的子问题相互不关联&#xff0c;而动态规划法的子问题是相互关联的&#xff0c;且有重叠的部分。 二、算法分析 动态规划…

性能优化相关:nginx负载均衡中的动静分离

结合上次博客&#xff1a;正向代理和反向代理 什么是动静分离&#xff1a; 静态资源&#xff1a;包含css文件、图片、js文件、配置文件等 动态资源&#xff1a;脚本处理等 更改/usr/local/nginx/conf下的nginx.conf文件&#xff0c;设置动静目录&#xff0c;添加如下 locatio…

Ubuntu——配置安装服务

目录 一、安装JDK 二、安装IntelliJ IDEA 三、安装Docker-ce 1.环境清理以免有遗留组件 2.安装Docker 3.测试 #检查版本 sudo cat /etc/issue 一、安装JDK Ubuntu提供了一个名为apt的软件包管理工具&#xff0c;通过它可以使用命令行的方式安装、更新和删除软件包。 使用…

Day03 左侧菜单数据绑定

一.左侧菜单数据绑定 1.首先&#xff0c;进行项目结构塔建。按照Prism 框架约定&#xff0c;要使用自动查找绑定功能。即View &#xff08;视图&#xff09;中自动查找并绑定到对应的ViewModel&#xff08;视图模型&#xff0c;处理视图业务逻辑&#xff09;。就需要在项目中按…

大数据在金融行业的深度应用与未来展望

一、引言 随着信息技术的迅猛发展,大数据已经成为推动金融行业创新的重要力量。从精准营销、个性化服务到风险管理和产品创新,大数据的应用正在不断重塑金融行业的格局。本文将深入探讨大数据在金融行业的深度应用,分析其特征特点、解决方案以及面临的挑战与机遇,并展望其…

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下&#xff0c;一个上午都在床上趴着看完了《百年孤独》&#xff0c;撑伞去吃了个饭&#xff0c;又回到了宿舍。打开许久未开的老电脑&#xff0c;准备做题了。《百年孤独》讲了什么&#xff0c;想表达什么&#xff0c;想给读者留下什么&#xff0c;我不知道&am…

无法拒绝!GPT-4o 完美适配安卓手机,畅享丝滑体验

无法拒绝&#xff01;GPT-4o 完美适配安卓手机&#xff0c;畅享丝滑体验 前言 人工智能的飞速发展&#xff0c;给我们的生活带来了前所未有的便利。作为AI技术的代表之一&#xff0c;GPT凭借其强大的自然语言处理能力&#xff0c;已经成为许多用户日常生活和工作中的得力助手…

超大功率光伏并网逆变器学习(三相) 一

1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…

基于数据驱动的自适应性小波构造(MATLAB)

以地震领域为例&#xff0c;时频变换能够刻画地震资料的时频特征&#xff0c;进而辅助地质构造解释。在各种时频分析工具中&#xff0c;连续小波变换CWT是描述地震资料时频特征的常用工具。选择合适的基小波是CWT的关键问题。对于不同类型的信号前人有针对性的设计了许多基小波…

TCP/IP(网络编程)

一、网络每一层的作用 &#xff0a;网络接口层和物理层的作用&#xff1a;屏蔽硬件的差异&#xff0c;通过底层的驱动&#xff0c;会提供统一的接口&#xff0c;供网络层使用 &#xff0a;网络层的作用&#xff1a;实现端到端的传输 &#xff0a;传输层:数据应该交给哪一个任…

移植2D物理引擎到LVGL

背景 在LVGL交流群&#xff0c;有网友提出想要移植物理引擎到LVGL&#xff0c;遂有了本文。阅读本文需要对IDF和LVGL有所了解 过程 2D物理引擎有很多&#xff0c;经过一番调研选择了Chipmunk2D 下载源码 此处省略一万字&#xff0c;Github访问可能会有些慢 添加文件 将…

前端3剑客(第1篇)-初识HTML

100编程书屋_孔夫子旧书网 当今主流的技术中&#xff0c;可以分为前端和后端两个门类。 前端&#xff1a;简单的理解就是和用户打交道 后端&#xff1a;主要用于组织数据 而前端就Web开发方向来说&#xff0c; 分为三门语言&#xff0c; HTML、CSS、JavaScript 语言作用HT…

【Mysql语句优化---Explain使用以及相关属性含义】

Explain使用以及相关属性含义 一.explain中的列 接下来我们将展示 explain 中每个列的信息。 1. id列 id列的编号是 select 的序列号&#xff0c;有几个 select 就有几个id&#xff0c;并且id的顺序是按 select 出现的顺序增长的。 id列越大执行优先级越高&#xff0c;id相…

罗德里格斯旋转公式证明-简洁

罗德里格斯旋转公式证明。 设旋转向量为 ( n , θ ) (n, \theta) (n,θ)&#xff0c;设其对应的旋转矩阵为 R R R&#xff0c; 如何证明&#xff1f; R c o s θ I n ∧ s i n θ ( 1 − c o s θ ) n n T Rcos\theta I n^{\wedge}sin\theta(1-cos\theta)nn^{T} RcosθI…