嵌入式实验报告2汇总Word文件下载.docx
- 文档编号:712865
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:45
- 大小:1.06MB
嵌入式实验报告2汇总Word文件下载.docx
《嵌入式实验报告2汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告2汇总Word文件下载.docx(45页珍藏版)》请在冰点文库上搜索。
1.3流程图
根据设计思路,主程序流程图如图2所示,A/D转换流程图如图3所示。
图2主程序流程图
图3A/D转换流程图
1.4编译与调试的步骤和方法
采用gcc编译主程序文件xqytest.c并采用gdb进行调试。
将程序调好后进入minicom,接下来的步骤如图4和图5所示。
图4程序运行步骤
图5程序运行步骤(续)
1.5程序运行结果
按下1、2、3、4键后程序运行结果分别如图6、图7、图8、图9所示。
在数码管上显示了通道号和转换的电压值。
图6程序运行结果一
图7程序运行结果二
图8程序运行结果三
图9程序运行结果四
2问题描述
写一个linux下的用户程序,在ARM开发板和PC机上实现以太网服务器,对每一个访问的客户端发一个欢迎通信信息,该服务器模型为并发服务器,选用异步I/O机制、多路复用I/O机制或信号驱动I/O模型。
2.1设计目标
在ARM开发板和PC机上实现以太网服务器,对每一个访问的客户端发一个欢迎通信信息。
2.2设计思路
应用程序通过编程调用TCP并使用TCP服务,提供需要准备发送的数据,用来区别接收数据应用的目的地址和端口号。
TCP的连接分为几个步骤,这个连接过程称为“三次握手”。
在设计时,确定客户端(ARM开发板)和服务器(PC机)的分工及程序设计,其中服务器则需要选择固定的模型(循环式或并发式),并选用I/O机制(阻塞式或异步),建立socket连接。
而客户端需要确定hostname,并在确立socket连接后输入要传输的字符。
2.3主程序流程图
图10主程序流程图
2.4编译与调试的步骤和方法
采用gcc编译server.c和client.c,并采用gdb调试工具调试。
在客户端上输入mynameisxuqingyao,便能在服务器上接收到该信息。
实现以太网服务器的步骤和程序运行结果如图11和图12所示。
2.5程序运行结果
程序运行结果如图11和图12所示。
图11程序运行结果(服务器)
图12程序运行结果(客户端)
3问题描述
写linux下的用户程序,其中一个为父进程,它创建了另外2个子进程,这2个子进程通过某种IPC机制实现进程间通信。
要求分别在PC机上和在ARM开发板上测试实现。
IPC机制可选a)有名或无名管道、b)共享内存、c)信号或其它方法。
3.1设计目标
3.2设计思路
该题使用管道机制实现两个进程之间的通信。
首先用pipe()函数建立一个无名管道,再用fork()函数建立一父进程和两个子进程,实现两个子进程间的通信。
其中一个子进程实现读read()操作,另一个子进程实现写write()操作。
在服务器程序设计时,首先需要建立sockfd描述符,并将sockfd描述符捆绑到IP地址上;
然后设置客户端最大连接数,通过阻塞式I/O机制建立通讯连接。
在客户端程序设计时,首先确定hostname,然后在确立socket连接后输入要传输的字符,实现基于TCP协议的套接字网络通信。
(1)将数据写入管道。
将数据写入管道使用的是write()函数,与写入普通文件的操作方法一样。
与文件不同的是,管道的长度受到限制,管道满时写入操作会被阻塞。
执行写操作的进程进入睡眠状态,直到管道中的数据被读取。
fcntl()函数可将管道设置为非阻塞模式,管道满时,write()函数的返回值为0。
如果写入数据长度小于管道长度,则要求一次写入完成。
如果写入数据长度大于管道长度,在写完管道长度的数据时,write()函数将被阻塞。
(2)从管道读取数据。
读取数据使用read()函数实现,读取的顺序与写入顺序相同。
当数据被读取后,这些数据将自动被管道清除。
因此,使用管道通信的方式只能是一对一,不能由一个进程同时向多个进程传递同一数据。
如果读取的管道为空,并且管道写入端口是打开的,read()函数将被阻塞。
读取操作的进程进入睡眠状态,直到有数据写入管道为止。
fcntl()函数也可将管道读取模式设置为非阻塞。
(3)关闭管道。
管道虽然有2个端口,但只有一个端口能被打开,这样避免了同时对管道进行读和写的操作。
关闭端口使用的是close()函数,关闭读端口时,在管道上进行写操作的进程将收到信号。
关闭写端口时,进行读操作的read()函数将返回0。
3.3主程序流程图
主程序流程图如图13所示。
图13主程序流程图
3.4程序运行结果
运行结果如图14所示。
在Linux下的结果老师已检查,但忘记拷贝了。
图14程序运行结果
4问题描述
给你2个温度传感器DS1621和DS18B20芯片、三个发光二极管、面包板和导线,利用ARM嵌入式教学实验平台留有的扩展接口,设计接口电路并联线,编写驱动程序和应用程序实现温度的采集并能够根据温度高低来智能控制二极管亮灭的个数,将采样到的温度值送计算机终端和数码管显示。
4.1设计目标
实现温度的采集并能够根据温度高低来智能控制二极管亮灭的个数,将采样到的温度值送计算机终端和数码管显示。
4.2设计思路
选用DS1621芯片,通过IIC总线的控制,设计DS1621驱动,设定温度变化范围,然后利用GPB0、GPB1、GBP9控制三个发光二极管,采用共阳极I/O输出数据控制亮灭。
4.3主程序流程图
主程序流程图如图15所示。
图15温度传感器主程序流程图
4.5运行结果
由于时间关系,该题没有搭实物进行调试。
附录一
第1题源程序
主程序:
#include<
string.h>
/*Stringfunctiondefinitions*/
termios.h>
/*POSIXterminalcontroldefinitions*/
sys/types.h>
sys/stat.h>
fcntl.h>
sys/socket.h>
syslog.h>
signal.h>
errno.h>
unistd.h>
stdio.h>
stdlib.h>
#include"
led_ioctl.h"
intmain()
{
intcount;
intfd_ad;
intfd_kb;
intfd_led;
intresult_kb=0;
intchannel;
intresult_ad=0;
intold_result_ad=0;
shorti=0;
shortj=0;
charled[6]={'
\0'
0x20,'
0x01,0x01,'
};
/*这些数字直接写入数码管*/
charled_map[10]={0xde,0x50,0x9d,0x5d,0x53,0x4f,0xcf,0x58,0xdf,0x5f};
/*0--9*/
charled_maph[10]={0xfe,0x70,0xbd,0x7d,0x73,0x6f,0xef,0x78,0xff,0x7f};
/*0.--9.*/
floatvoltage=0.0;
fd_ad=open("
/dev/adc0809"
O_RDWR);
if(fd_ad<
0)
{
perror("
Can'
topenadc0809device!
\n"
);
return-1;
}
fd_kb=open("
/dev/keybd"
O_RDONLY);
if(fd_kb<
topenkeyboarddevice!
return-1;
fd_led=open("
/dev/led"
O_WRONLY);
if(fd_led<
topenleddevice!
while
(1)
/*readkeyboard*/
result_kb=0;
while(result_kb==0)
read(fd_kb,&
result_kb,1);
/*ADtransforms*/
if(result_kb!
=led_map[1]&
&
result_kb!
=led_map[2]&
=led_map[3]&
=led_map[4])
printf("
Presskeyerror!
\nPleasepress1or2or3or4.\n"
return0;
}
if(result_kb==led_map[1])
channel=0;
if(result_kb==led_map[2])
channel=1;
if(result_kb==led_map[3])
channel=2;
if(result_kb==led_map[4])
channel=3;
printf("
channel=AIN%d\n"
channel);
ioctl(fd_ad,channel,channel);
/*selectthechannel1234-AIN0,AIN1,AIN2,AIN3*/
read(fd_ad,&
result_ad,1);
/*readtheA/Dtransformingresult*/
voltage=5.0*(float)result_ad/256.0;
TheresultofA/Dtransformingis%fV\n"
voltage);
/*theresultwritetoscreen*/
result_ad=%d\n\n"
result_ad);
/*writetoledandprintonscreen*/
/*theformatoftheledisresult_kb--5.0*/
led[5]=result_kb;
/*hasbeentransformedindriver*/
led[4]=0x00;
led[3]=0x00;
led[2]=led_maph[(char)voltage];
led[1]=led_map[((char)(voltage*10))%10];
led[0]=led_map[((char)(voltage*100))%10];
ioctl(fd_led,IOCTRL_LED_1);
//lightthe1led:
led[0]
count=write(fd_led,led+0,1);
ioctl(fd_led,IOCTRL_LED_2);
//lightthe2led:
led[1]
count=write(fd_led,led+1,1);
ioctl(fd_led,IOCTRL_LED_3);
//lightthe3led:
led[2]
count=write(fd_led,led+2,1);
ioctl(fd_led,IOCTRL_LED_4);
//lightthe4led:
led[3]
count=write(fd_led,led+3,1);
ioctl(fd_led,IOCTRL_LED_5);
//lightthe5led:
led[4]
count=write(fd_led,led+4,1);
ioctl(fd_led,IOCTRL_LED_6);
//lightthe6led:
led[5]
count=write(fd_led,led+5,1);
//sleep
(1);
}
ad驱动
adc0809.c
/*driver/char/adc0809.c
*thisisaadc0809chardevicedriver.
*Anyproblemplscontactsupport@
*/
module.h>
linux/fs.h>
linux/iobuf.h>
linux/major.h>
linux/blkdev.h>
linux/capability.h>
linux/smp_lock.h>
linux/delay.h>
asm/uaccess.h>
asm/hardware.h>
asm/arch/cpu_s3c2410.h>
asm/io.h>
linux/vmalloc.h>
linux/signal.h>
linux/sched.h>
linux/timer.h>
linux/interrupt.h>
asm/irq.h>
asm/arch/hardware.h>
asm/arch/irqs.h>
adc0809_ioctl.h"
#defineADC0809_MAJOR231
/*definetheadc0809majornodeis231*/
#defineadc0809_sle(*(volatileunsignedlong*)ADC_GPACON)
#defineadc0809_sle_data(*(volatileunsignedlong*)ADC_GPADATA)
unsignedlongADC_GPACON,ADC_GPADATA;
unsignedlongADC_0,ADC_1,ADC_2,ADC_3,ADC_4,ADC_5,ADC_6,ADC_7;
//unsignedlongADC_DATA;
unsignedlongadc_write_addr;
unsignedlongadc_read_addr;
devfs_handle_tdevfs_adc;
voidadc0809_interrupt(int,void*,structpt_regs*);
intadc0809_open(structinode*,structfile*);
intadc0809_release(structinode*,structfile*);
intadc0809_ioctl(structinode*,structfile*,unsignedint,unsignedlong);
ssize_tadc0809_read(structfile*,char*,size_t,loff_t*);
ssize_tadc0809_write(structfile*,constchar*,size_t,loff_t*);
staticstructfile_operationsadc0809_fops={
ioctl:
adc0809_ioctl,
open:
adc0809_open,
read:
adc0809_read,
write:
adc0809_write,
release:
adc0809_release,
volatileunsignedlongdata;
unsignedlongaddr;
voidadc0809_interrupt(intirq,void*d,structpt_regs*regs)
/*clearinterruptregisterforINT2*/
//printk("
**********************adc0809_interrupt*********************\n"
SRCPND&
=(~0x00000004);
//clearinterrupt(bit2)
INTPND=INTPND;
EINTPEND&
//bit2
interruptprocess!
/*readadconverter'
sresult*/
data=(*(volatileunsignedlong*)adc_read_addr);
/*
*Open/closecodeforrawIO.
intadc0809_open(structinode*inode,structfile*filp)
//adc_read_addr=ADC_DATA;
printk("
openok\n"
ssize_tadc0809_read(structfile*filp,char*buf,
size_tsize,loff_t*offp)
charkey;
key=data;
data=0;
if(key==0){
adc0809_read:
havenodatatoread\n"
put_user(key,buf);
return1;
ssize_tadc0809_write(structfile*filp,constchar*buf,
if(get_user(key,buf))
return-EFAULT;
adc0809_write:
adc_write_addr=0x%x;
key=%c\n"
adc_write_addr,key);
(*(volatileunsignedchar*)adc_write_addr)=key;
//put_user(key,buf);
//__ioremap
intadc0809_release(structinode*inode,structfile*filp)
releaseok\n"
*Dealwithioctlsagainsttheraw-devicecontrolinterface,tobind
*andunbindotherrawdevices.
intadc0809_ioctl(structinode*inode,
structfile*flip,
unsignedintcommand,
unsignedlongarg)
interr=0;
switch(command){
caseIOCTRL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告 汇总