嵌入式Linux应用程序报告Word文件下载.docx
- 文档编号:4972908
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:18
- 大小:572.27KB
嵌入式Linux应用程序报告Word文件下载.docx
《嵌入式Linux应用程序报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux应用程序报告Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
ⅳ下载别人已经移植好的LINUX操作系统
如UCLINUX、ARM-LINUX、PPC-LINUX等
ⅴ建立根文件系统
从下载使用BUSYBOX软件进行功能裁减,产生一个最基
本的根文件系统,再根据自己的应用需要添加其他的程序。
默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中
的启动脚本,它的存放位置位于/etc目录下,包括:
/etc/init.d/rc.S、
/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,
具体情况会随系统不同而不同。
根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs、genromfs
等工具产生烧写映象文件。
ⅵ建立应用程序的flash磁盘分区
一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的
驱动,有的系统使用一个线性flash(NOR型)512K-32M,有的系统使用非线性
flash(NAND型)8-512M,有的两个同时使用,需要根据应用规划flash的分
区方案。
ⅶ开发应用程序
可以下载到根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应
用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似
于UCOS-II的方式。
ⅷ烧写内核、根文件系统、应用程序
四、以多路复用串口操作为例熟悉嵌入式实验平台的开发
多路复用式串口操作
1、实验目的
通过编写多路复用式串口读写,进一步理解多路复用函数的用法,同时更加熟练掌握Linux设备文件的读写方法;
熟悉LINUX下的串口控制,学会LINUX下串行程序设计方法。
2、实验内容
编程用串口来实现PC机与PXA270D开发板的通信。
宿主机和目标板都可以发送和接收数据。
除了串口设备名称不同(宿主机上使用串口1:
/dev/ttyS0,而在目标板上使用串口2:
/dev/ttyS1),两台机器上的程序基本相同。
3、实验设备
1.一套PXA270D开发板。
2.安装linux的宿主PC机,并且配置好ARMLinux的开发环境。
4、实验原理及说明
串口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。
常用的串口是RS-232-C接口(又称EIARS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
1.基本原理:
串行端口的本质功能是作为CPU和串行设备间的编码转换器。
当数从CPU经过串行端口发送出去时,字节数据转换为串行的位。
在接收数据时,串行的位被转换为字节数据.串口是系统资源的一部分,应用程序要使用串口进行通信,必须在使用之前向操作系统提出申请要求(打开串口),通信完成后必须释放资源(关闭串口)。
2.串口通信的基本任务:
(1)实现数据格式化:
因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。
在异步通信方式下,接口自动生成起止式的帧数据格式。
在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。
(2)进行串---并转换:
串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。
所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。
因此串并转换是串接口电路和的重要任务。
(3)控制数据传输速率:
串行通信接口电路应具有对数据传输速率-----波特率进行先择和控制的能力。
(4)进行错误检测:
在发送接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。
在接收时,接口电路检查字符的奇偶校验或其他检验码,确定是否发生传送错误。
(5)进行TTL与EIA电平转换:
CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。
串行通信可以分为两种类型:
同步通信,异步通信。
微机中大量使用异步通信,下面就详细介绍异步串行I/O。
3.异步串行I/O原理:
异步串行方式是将传输数据的每个字符一位接一位(例如先低后高位)地传送.数据的各不同位可以分时使用同一传输通道。
因此串行I/O可以减少信号连线,最少用两线即可。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,又方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
每个字符的数据位长可以约定为5位.6位.7位或8位。
一般采用是ASCII编码。
后面是奇偶校验,根据约定,用奇偶校验位将所传字符中为”1”的位数凑成奇数个或偶数个。
也可能约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的”1”信号,这个停止位可以约定持续为”1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
微机异步串行通信中,常用的波特率为300,600,1200,2400,4800,9600,19200,38400,57600,115200等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
(1)奇偶错:
在约定奇偶检查的情况下,接收到字符奇偶状态和约定不符。
(2)帧格式错:
一个字符从起始位到停止位的总位数不对。
(3)溢出错:
若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
4.串口终端函数:
在LINUX系统中访问串口,认为串口是一个文件,我们可以使用文件系统控制函数实现基本的串口操作:
如用open()函数来打开串口,用read(),write()来读写它,操作完成后,再用close()关闭它。
(1)打开串口,常LINUX下的串口设备为:
串口0/dev/ttyS0
串口1/dev/ttyS1
串口2/dev/ttyS2
本实验使用的是串口1。
以下的程序可以打开一个串口:
intfd;
fd=open(“/dev/ttyS1”,O_RDWR);
if(fd==-1)
{printf(“提示错误!
”);
}
(2)设置串口
最基本的设置串口包括波特率设置,检验位和停止位设置。
串口的设置主要是设置structtermios结构体的各成员值。
Structtermios
{
unsignedshortc_iflag;
/*输入模式标志*/
unsignedshortc_oflag;
/*输出模式标志*/
/*控制模式标志*/
/*本地模式标志*/
unsignedshortc_line;
/*线性规程*/
unsignedshortc_cc[NCC];
/*控制字符*/
设置这个结构体很复杂,可以参考man手册,这里就只考虑常见的一些设置:
1)波特率设置
structtermiosoptions;
tcgetattr(fd,&
options);
cfsetispeed(&
options,B19200);
/*设置为19200Bps*/
cfsetospeed(&
tcsetattr(fd,TCANOW,&
2)检验位设置
(a)无校验8位:
options.c_cflag&
=~PARENB
=~CSTOPB;
=~CSIZE;
options.c_cflag︱=CS8;
(b)奇效验(Odd)7位:
options.c_cflag︱=PARENB;
=~PARODD;
options.c_cflag︱=CS7;
(c)偶校验(Even)7位:
=~PARENB;
options.c_cflag︱=OARODD;
=~CSTOPB;
(d)Space校验7位
=~PARENB;
=&
~CSIZE;
3)停止位设置
1位:
options.c_cflag&
2位:
options.c_cflag︱=CSTOPB;
4)模式设置
需要注意的是,如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(RawMode)方式来通讯。
options.c_lflag&
=~(ICANON︱ECHO︱ECHOE︱ISIG);
/*Input*/
options.c_oflag&
=~OPOST;
/*Output*/
(3)读写串口
打开串口之后,读写串口就很容易了,把串口当作文件读写就可以了。
1)发送数据
charbutter[1024];
intLength=1024;
intnByte;
nByte=write(fd,buffer,Length);
2)读取串口数据
使用文件操作read函数读取,如果设置为原始模式(RawMode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。
读取数据时比较需要技巧的。
charbuff[1024];
intLen=1024;
intrdadByte=read(fd,buff,Len);
也可以使用操作文件的函数来实现异步读取,如fcntl,或者selectt等来操作。
fd_setrfds;
structtimevaltv;
intretval;
/*下面几行设置要监视进行读写操作的文件集*/
FD-ZERO(&
rfds);
//文件集清零
FD_SET(ports[portNo].handle,&
//向集合中添加一个文件句柄
tv.tv_sec=Timeout/1000;
//设置等待的时间
tv.tv_usec=(Timeeout%1000)*1000;
retval=select(16,&
rfds,NULL,NULL,&
tv;
)//文件所监视的文件集准备好.
if(rdtvel)//文件集中有文件在等待时间内
准备好了.
actuaIRead=read(ports[portNo].handle,buf,maxCnt);
//读取数据
(4)关闭串口,关闭串口就是关闭文件。
close(fd);
5、实验步骤
1.硬件连接
(1)用一根串口线将宿主PC机的com1口与PX270D型板的串口0(UART0)相连;
用一根交叉对接网线将宿主PC机的网口与PX270D开发板的网口(NET)相连。
(2)用一根USB转串口线将宿主PC机的USB口与PX270D开发板的串口1(UART1)相连(注意:
要安装USB转串口的驱动,否则不识别!
)。
2.编写程序(命名为uart_test.c)
程序功能:
向串口(ttyS1)发送数据(数据为字符串“HELLO”);
同时接受串口(ttyS1)的数据,并显示。
参考程序清单:
#include<
stdio.h>
string.h>
stdlib.h>
fcntl.h>
//open()close()
unistd.h>
//read()write()
termios.h>
//setbaudrate
sys/select.h>
sys/time.h>
sys/types.h>
#defineDEVICE_TTYS"
/dev/ttyS1"
#defineMY_BAUD_RATEB115200
#defineDATAS_CONTENT"
HELLO"
#defineRECEIVE_BUF_WAIT_1S1
#defineRECEIVE_BUF_WAIT_2S2
#defineRECEIVE_BUF_WAIT_3S3
#defineRECEIVE_BUF_WAIT_4S4
#defineRECEIVE_BUF_WAIT_5S5
#defineVERSION"
FYNC-WDXY-UART-V1.00-20140527"
//------------------------------------------显示程序的版本号-------------------------------------
voidshowversion(void)
printf("
*********************************************\n"
);
\t%s\t\n"
VERSION);
*********************************************\n\n"
}
//-------------------------------------初始化串口---------------------------------------------------
voidinit_ttyS(intfd)
bzero(&
options,sizeof(options));
//清零结构体变量options
options,B115200);
//设置接受波特率
options.c_cflag|=CLOCAL|CREAD;
//激活本地连接和接受使能CLOCAL和CREAD选项
=~CSIZE;
//设置8位数据、无校验、1位停止位
options.c_cflag|=CS8;
=~CSTOPB;
=~PARENB;
tcflush(fd,TCIFLUSH);
//清除串口缓冲区
tcsetattr(fd,TCSANOW,&
//使串口设置立即生效
}//endinit_ttyS
//----------------------------------------------从串口读数据-----------------------------------------------
intread_datas_ttyS(intfd,char*rcv_buf,intrcv_wait)
intret,pos;
tv.tv_sec=rcv_wait;
tv.tv_usec=0;
pos=0;
//接受缓冲区的位点
while
(1)
FD_ZERO(&
//清除文件描述符集rfds
FD_SET(fd,&
//把fd加入到文件描述符集rfds
retval=select(fd+1,&
rfds,NULL,NULL,&
tv);
//监听串口是否数据可读
if(retval==-1)
perror("
select()"
break;
elseif(retval)
{
ret=read(fd,rcv_buf+pos,1024);
pos+=ret;
if(rcv_buf[pos-2]=='
\r'
&
&
rcv_buf[pos-1]=='
\n'
)//判断是否还有数据
FD_ZERO(&
FD_SET(fd,&
retval=select(fd+1,&
if(!
retval)break;
//nodatas,break
else
Nodata\n"
return1;
}//endread_datas_ttyS
//----------------------------------------------串口收发数据----------------------------------------------
intfunc_232_transfer(intfd)
ssize_tret;
charrcv_buf[1024];
inti;
char*send_buf=DATAS_CONTENT;
bzero(rcv_buf,sizeof(rcv_buf));
while
(1)
//发送数据
ret=write(fd,send_buf,strlen(send_buf));
if(ret==-1)
printf("
writedevice%serror\n"
DEVICE_TTYS);
return-1;
//读取数据
if(read_datas_ttyS(fd,rcv_buf,RECEIVE_BUF_WAIT_1S))
%s\n"
rcv_buf);
else
readerror\n"
return0;
}//endfunc_232_transfer
//-----------------------------------------------main------------------------------------------------------
intmain(void)
showversion();
\nRS232TRANSFERSDATAS\n\n"
//openserielport
fd=open(DEVICE_TTYS,O_RDWR);
if(fd==-1)
opendevice%serror\n"
DEVICE_TTYS);
init_ttyS(fd);
//初始化
func_232_transfer(fd);
//数据传送
if(close(fd)!
=0)printf("
closedevice%serror"
//关串口
}//endmain
6、在终端窗口(Terminal)输入下列命令:
cd/nfsboot
mkdiruart_test
cduart_test
gedituart_test.c
ls–l
/usr/local/arm-linux/bin/arm-linux-gccuart_test.c-ouart_test
ifconfigeth0192.168.0.100up
sudo/etc/init.d/nfs-kernel-serverrestart
minicom/*给PXA270D开发板上电,并进入其操作界面*/
root/*以root身份登陆PXA270D开发板*/
mount192.168.0.100:
/nfsboot/mnt/*将宿主PC机的/nfsboot目录挂载到PXA270D开发板的mnt目录下*/
cd/mnt
./uart_test/*运行测试程序的目标程序*/
7.
8.
8.打开主机上的串口调试助手,选择正确的串口,设置波特率为115200,校验位为NONE,数据位为8,停止位为1。
此时可以看到接收区内有数据显示,如图1所示。
这些数据是PXA270D开发板发送给宿主PC机的.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux 应用程序 报告