江苏大学嵌入式课设报告

更新时间:2023-10-19 07:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式课程设计报告

班级:电信0801

学号:3080503005 姓名:唐娟

一、 基础内容

1 、Linux内核移植实验

问题回答

1. 交叉编译环境包括哪些工具,它的作用是什么? 答:GNU的交叉编译器,包括以下组件:

(1). Gcc交叉编译器,即在宿主机上开发编译目标上可运行的二进制文件; (2). Binutils辅助工具,它是一组二进制工具程序集,包括objdump、objcopy等,能够对二进制文件进行处理;

(3). Gdb调试器,能够对执行程序进行源码或汇编级调试。 2. 简述Linux的启动过程。

答:1.加载BIOS;2.读取MBR;3.Boot Loader;4.加载内核;5.用户层init根据inittab文件设定运行等级;6.init进程执行rc.sysinit;7.启动内核模块;8.执行不同运行级别的脚本程序;9.执行/etc/rc.d/rc.local。

2、Linux基本应用程序编写实验

问题回答

1. 简述交叉编译的基本概念,简述x86平台和ARM平台编译环境的异同; 答:通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。 2. 简述Makefile文件的作用和基本组成;

答:Makefile文件的作用有点类似于DOS下的批处理文件,通过编写Makefile文件,用户可以将一个很复杂的程序(可能包含上百个甚至更多的源文件或者目录)通过简单的make命令进行编译。。Makefile文件描述了整个工程的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译;需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。 规则:用于说明如何生成一个或多个目标文件, 规则格式如下:

targets: prerequisites command 目标 依赖 命令

3. CVT-PXA270中怎样将编写的应用程序下载到Linux中,怎样在Linux中运行该程序?

答:CVT-PXA270通过NFS将主机的/tftpboot/目录挂接到目标机的/mnt/nfs目录中,因此需要将交叉编译的应用程序拷贝到主机的/tftpboot/目录。在bin文件所在目录下使用./bin文件名运行该程序。

3、 Linux驱动程序编写实验

问题回答

1. 简述Linux设备驱动程序的基本概念和编写方法;

答:在Linux中,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分。编写方法:1) 包含文件;2) 模块初始化;3) 设备文件操作函数实现;4) 模块退出操作。 2. 简述Linux应用程序怎样访问设备驱动程序;

答:Linux应用程序调用Linux系统调用,Linux系统调用“调用”驱动程序中实现的文件操作集。Linux用户程序通过设备文件(又名:设备节点)来使用驱动程序操作字符设备和块设备。

二、拓展内容

6、 Linux串口通信实验

问题回答

1. 简述Linux下的串口编程;

答:1). 包含串口编程相关头文件;2). 打开串口:Linux 下串口文件是位于/dev 下,串口一为/dev/ttyS0 ,串口二为/dev/ttyS1 ,打开串口是通过使用标准的文件打开函数open操作;3). 设置串口:最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置struct termios结构体的各成员值;4).读写串口:设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。发送数据用write函数,读取串口数据使用文件操作read 函数读取;5). 关闭串口:关闭串口就是关闭文件,用close函数。

代码及注释如下:

#include /* 标准输入输出定义 */ #include /* 标准函数库定义 */ #include /* Unix标准函数定义 */ #include #include

#include /* 文件控制定义 */

#include /* POSIX终端控制定义 */ #include /* 错误号定义 */

#define TRUE 1 #define FALSE 0

/***@brief 设置串口通信速率

*@param fd 类型 int 打开串口的文件句柄 *@param speed 类型 int 串口速度 *@return void*/

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300,};

int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };

/* 设置波特率 */

void set_speed(int fd, int speed) {

int i;

int status;

struct termios Opt; tcgetattr(fd, &Opt);

for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {

if (speed == name_arr[i]) {

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]);

status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0)

perror(\ return; }

tcflush(fd,TCIOFLUSH); } } /**

*@brief 设置串口数据位,停止位和效验位

*@param fd 类型 int 打开的串口文件句柄*

*@param databits 类型 int 数据位 取值 为 7 或者8* *@param stopbits 类型 int 停止位 取值为 1 或者2* *@param parity 类型 int 效验类型 取值为N,E,O,,S */

/* 设置串口数据位,停止位和效验位 */

int set_Parity(int fd,int databits,int stopbits,int parity) {

struct termios options;

if ( tcgetattr( fd,&options) != 0) {

perror(\ return(FALSE); }

options.c_cflag &= ~CSIZE;

switch (databits) /* 设置数据位数 */ {

case 7:

options.c_cflag |= CS7; break; case 8:

options.c_cflag |= CS8; break; default:

fprintf(stderr,\ return (FALSE); }

switch (parity) /* 设置校验位 */ {

case 'n': case 'N':

options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break; case 'o': case 'O':

options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验 */

options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'e': case 'E':

options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; /* 转换为偶效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'S':

case 's': /*as no parity*/ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default:

fprintf(stderr,\ return (FALSE); }

/* 设置停止位 */ switch (stopbits) {

case 1:

本文来源:https://www.bwwdw.com/article/edof.html

Top