嵌入式实验报告
一、搭建linux系统下的交叉编译环境
1、 Linux源码/linux工具包/crosstools_all.tar.bz2
2、 #cd /opt/HK
3、 #tar xvfj crosstools_all.tar.bz2 -C /
4、 执行解压命令之后,就把交叉编译器分别安装到”/usr/local/arm/”目录下的“2.95.3”和“3.3.2” “3.4.1 ”目录中
5、 还会安装制作文件系统的软件到/usr/local/sbin/
6、 3.3.2版本的交叉编译器用来编译Qtopia/Embedded
7、 2.95.3版本的交叉编译器用来编译VIVI以及移植boa等
8、 3.4.1_softfolat版本的交叉编译器用来编译内核、busybox、u-boot和各种应用程序等
9、 接下来配置系统环境变量,然后执行命令: #sudo gedit /etc/profile
10、 把交叉编译工具链的路径添加到环境变量PATH中去,这样就可以在其他目录下使 用这些工具。然后在“profile”文件里面添加如下信息 :
if [ "`id -u`" -eq 0 ]; then
export PATH="$PATH:/opt/hk/usr/local/arm/2.95.3/bin"
export PATH="$PATH:/opt/hk/usr/local/arm/3.3.2/bin"
export PATH="$PATH:/opt/hk/usr/local/arm/3.4.1/bin"
export PATH="$PATH:/opt/hk/usr/local/sbin"
fi (PATH等号两端不要空格 )
11、 使用命令:source /etc/profile使环境变量生效
12、 -/bin/sh: ./hello: not found
13、 arm-linux-readelf -a hello
14、 找到需要的库ld-linux.so.2
15、 到编译器下找到相关的库拷到开发板/lib下
二、CAN总线驱动程序实现
1.文件操作接口的实现
CAN设备驱动程序最终提供给应用程序的是一个流控制接口,主要包括open, close(或realse3、read, write, ioctl等操作.添加设备驱动程序,实际上就是给上述操作编写相应的程序代码。对于字符设备和块设备,Linux内核对这些操作作了统一的抽象,而每一个设备都会用一个特殊的设备文件来表示,通过虚拟文件系统,应用程序得到一组与具体设备无关的系统调用。而虚拟文件系纺的主体就是结构体file operations,每一种文件系统都有自己的file operations数据结构,结构体中的每一个成员都是一个函数指针,实际上实现了对于不同操作的函数跳转功能,例如open是指向具体文件系统用来实现打开设备文件操作的入口函数。可以说file_operations实现了标准文件操作到硬件设备操作的映射.
根据CAN控制器的特点,CAN设备驱动程序实现了结构体中一部分重要的操作,在Linux 2.4.18内核中,具体声明的实现如下:
static struct fiel_operations s3c2410_fops{
owner: THIS MODULE,
write: s3c2410 mcp2510 write,
read: s3c2410_mcp2510 read,
ioctl: s3c2410. mcp2510 ioctl,
open: s3c2410 mcp2510 open,
release: s3c2410 mcp2510 release,
};
在s3c2410ee fops中声明的每一个成员功能描述如下(未声明的成员值为0):
(1} s3c2410 mcp2510 open负责对将要进行的1/0操作做好必要的准备工作,主要包括限制CAN打开次数、清空3个发送缓冲区和2个接收缓冲区等。
(2) s3c2410_mcp2510_release负责CAN设备关闭时的操作,包括还原打开次数,关闭中断等。
(3) s}c2410 mcp2510 ioctl负责CAN设备读写操作之外的工作特性设置,主要完成设置工作模式、数据帧ID、设备滤波器、总线波特率等工作。
(4} s3c2410 mcp2510 write负责处理CAN总线数据的发送方法.
(5)s3c2410 mcp2510 read负责处理CAN总线数据的接收方法。
2.驱动程序入口的实现
驱动程序在加载到内核中时,会首先运行驱动程序的初始化函数,然后等待系统调用在file_operations数据结构中定义的相关函数,实现对设备的操作.CAN设备的初始化函数主要负责创建CAN设备的节点设备文件、注册CAN设备的中断处理函数、初始化MCP2510等工作。初始化函数工作流程如图所示
主要程序代码如下:
static int一 iuit s3c2410 mcp2510 init(void)
{·······················
init MCP2510(Bandltate 250khps);
ret} register cl}rdev{0, DEVICE NAME, &s3c2410_fops);
Major=ret;
·······················
ret}equest irq(MCP2510 IRQ, s3c2410 isr_mcp2510, SA
DEVICE NAME, s3c2410 isr mcp2510);
#ifdef CONFIG DEVFS FS
devfs spi_di}---devfs_mk},dir(NULL, "can",NULL);
devfses spirav}-devfs register(devfs_spi dir,"0",DEVFSee FL DEFAULT,Major,
SPIRAW MINOR, S IFCHR!S}IRUSR!Ses IWUSR,&s3c2410 fops, NULL);
#endif
························}
在Linux系统里,启动程序通过调用register chrdev向系统注册字符型设备驱动程序.register chrdev定义为:
#include <Linuxlfs.h>
#include <Linux/errno.ls}
int register chrdev(unsigned int major, const char *name, struct file operations
'fops);
其中,major是为设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态地分配一个主设备号.~是设备名。fops就是前面所说的对各个调用的入口点的说明。此函数返回0表示成功。如果是动态分配主设备号成功,此函数将返回所分配的主设备号.如果register_chrdev操作成功,设备名就会出现在/pros/devices文件里。
在使用ARM Linux时,通过配置内核,使其支持设备文件系统devfs ( device file system ),从而可以实现对动态分配的主设备号的管理。宏定义CONFIG DEVFS FS用来判断系统在配置时是否使用了设备文件系统,然后通过devfs_registerQ函数创建设备文件系统的CAN设备节点。
同时,CAN设备驱动程序通过调用requesE irq数来申请中断,向系统注CAN设备的中断处理函数为s3c241U isr mcp2510.request irq函数原型如下:
#include <Linwc/sched.h>
int request irq(unsigned int irq,
void (*hamdlerxint irq,void dev_id,struct pt regs *regs},
unsigned long flags,
const char *device,
void *dev id};
参数irq表示所要申请的硬件中断号。handler为向系统登记的中断处理子程序,中断产生时由系统来调用。flags是申请时的选项,它决定中断处理程序的一些特性,设置为SAJNTERRUPT,表示中断处理程序是快速处理程序,该中断处理程序运行时,其他终端都被屏蔽.device为设备名,将会出现在iprocl interrupts文件里。dev id为申请时告诉系统的设备标识。
三、心得体会
在嵌入式的学习过程中,让我了解了什么是嵌入式系统。它就是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能、可靠性、成本、体积、功耗有严格要求的计算机系统。他一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统、用户应用程序四个部分组成,用于实现对其他设备的控制、监视或管理功能。嵌入式系统已经应用于科学研究、工业控制、军事技术、交通通信、医疗卫生、消费娱乐等领域,人们日常使用的手机、PDA、汽车、智能家电、GPS等均是嵌入式系统的典型代表。
首先,在老师的讲解下学会了安装Linux系统,在笔记本上安装双系统Windows、Ubuntu,熟悉了文件系统、分区和挂载等概念,加深了对Linux中基本概念的理解,熟悉Linux文件系统目录结构。
其次就是安装好了之后,老师就更深一步的教我们应用了。在这是老师首先交给我们的是一些简单的命令应用,Linux具有很丰富的命令,绝大多数命令具有大量的参数。在老师的讲解下,我逐渐掌握了Linux操作的一些基本命令,如:用户系统相关命令、文件目录相关命令、压缩打包相关命令以及网络相关命令等。在实验中,学会了怎么搭建嵌入式Linux开发环境,主要包括串口传输、USB口传输、NFS传输的相关软件安装和TFTP的配置,以及交叉编译环境的搭建。在对于这部分的学习中,让我知道了命令对于嵌入式的重要性。它是linux的重要内容,linux中所有的功能都是通过命令执行。
此外,通过实例学习,如:文件的I/O编程、进程的控制和进程间的通信、多线程编程、嵌入式Linux网络编程、嵌入式Linux设备驱动开发和Qt图形编程等,我对嵌入式有了更深入的认识。
我学习的体会是这样的: 开始时,由于是刚刚入门,对老师说的好多东西是好奇的,好多名词也是新鲜的,不太懂什么意思,感觉学习起来很难。但是慢慢的,通过基本命令的学习和实验操作,对嵌入式有了进一步的了解并产生了兴趣。这门课的学习为以后自学嵌入式打下了一定的基础。
第二篇:嵌入式实验报告一
杭州电子科技大学
实验报告
课程名称: 嵌入式系统软件设计 姓名: 戴嵊舟、陈振强
实验项目: 熟悉ARM开发环境 班级: 08092712
指导教师: 任彧 学号: 08927212、08927104
日 期: 20##-05-05