1、嵌入式系统及应用实验指导报告书安徽工业大学嵌入式系统与应用实验报告册学院: 电气与信息工程学院 专业: 测控技术与仪器 姓名: 学号: 实验一 Linux认知实验一、实验目的:1、通过实验,掌握Linux操作系统下常用的命令,能灵活运用这些命令完成特定的工作;2、学习Linux下文本编辑器vi的使用方法。二、实验内容:1、新建文件hello.c,文件位于/home/test/ 目录下;2、使用vi编辑三、实验步骤:1、打开电脑上的虚拟机,加载Linux系统。2、输入密码进入系统后,按ctrl + Alt + t打开终端;3、使用mkdir建立/home/test文件夹;4、使用chmod命令修
2、改文件夹权限;5、使用vi打开hello.c文件,从而新建文件;6、在hello.c文件中输入程序,使得程序能够显示打印字符:“Hello,Linux!” 四、实验结果:(包括代码源码和运行结果)1、源代码(1)hello.c程序代码:#include stdio.hint main() printf(hello linux!n);(2)修改文件夹权限:用chmod修改文件夹权限lvlv-pc:$ cd test1lvlv-pc:/test1$ ls -l总用量 28-rwxr-xr-x 1 lv lv 8136 5月 7 11:36 a.out-rwxr-xr-x 1 lv lv 7869
3、5月 11 09:10 main-rw-r-r- 1 lv lv 250 5月 7 11:35 main.c-rwxr-xr-x 1 lv lv 8136 3月 30 20:28 mianlvlv-pc:/test1$ chmod 733 a.outlvlv-pc:/test1$ ls -l总用量 28-rwx-wx-wx 1 lv lv 8136 5月 7 11:36 a.out-rwxr-xr-x 1 lv lv 7869 5月 11 09:10 main-rw-r-r- 1 lv lv 250 5月 7 11:35 main.c-rwxr-xr-x 1 lv lv 8136 3月 30
4、20:28 mian2、实验结果五、思考:在建立文件夹的过程中,如果不进入管理员权限,会出现什么问题?同样,不进入管理员权限,vi编辑完代码,能不能保存退出?chmod后面的数字参数是什么含义?答:会出现:键入mkdir test后显示: 无法创建目录test: 权限不够的问题。不进入管理员权限,vi编辑完代码,不能保存退出。想对文件夹所修改成的权限。实验二 交叉编译实验一、实验目的:1、通过实验,掌握交叉编译的原理,理解文件系统挂载的原理;2、掌握交叉编译工具的使用,学会使用两种不同的方式访问目标板系统,学会使用gdb对程序进行调试。二、实验内容:编辑hello.c程序,使用交叉编译工具进行
5、编译,生成可执行文件,分别使用minicom和telnet 登录到目标板上,对程序进行运行调试。三、实验步骤:1、打开电脑上的虚拟机,加载Linux系统。2、Linux系统登录完毕,设置PC机网络地址为192.168.0.10,其中子网掩码为255.255.255.0,连接好实验箱上的电源、网线和USB转串口工具以及串口延长线。3、按ctrl + Alt + t打开终端,输入sudo minicom打开minicom,查看串口设置是否正确,进行串口设置;4、打开试验箱电源,查看启动代码,启动完成后,实验箱屏幕显示界面,按“Ctrl+c”,然后按“Enter”,进入板子系统。5、在文件系统(/h
6、ome/nfs)下的test文件夹下,建立hello.c的程序,程序中输入相应程序,实现打印信息“hello,linux”并换行输出110;6、再打开一个终端,在该终端中转到文件系统test文件夹,使用交叉编译工具对hello.c进行编译。7、在minicom中,目录转到“/test”文件夹下使用./(你的程序名) 运行程序;8、使用“gdb 你的程序名”运行程序,设置断点进行程序调试。9、关闭minicom,终端中输入telnet,然后输入open 192.168.0.11,等待出现“login:”输入“root”,进入目标板系统;10、目录转到“/test”文件夹下使用./(你的程序名)
7、运行程序;11、使用“gdb 你的程序名”运行程序,设置断点进行程序调试。四、实验结果:(包括代码源码和运行结果)1、源程序#include main( ) int i ; printf(“hello linux! n”); for(i=1;i open 192.168.0.11Trying 192.168.0.11.Connected to 192.168.0.11. Escape character is .Linux 2.4.18-rmk7-pxa1 (192.168.0.11) (0)192.168.0.11 login: rootBusyBox v0.60.3 (2002.05.13
8、-08:36+0000) Built-in shell (ash)Enter help for a list of built-in commands.# ./helloarm./helloarm: No such file or directory# cd test# ./helloarmHello linux!this is 1this is 2this is 3this is 4this is 5this is 6this is 7this is 8this is 9this is 10(2)在minicom下运行:wyxjwyxj-cpu:$ sudo minicomsudo pass
9、word for wyxj: Welcome to minicom 2.6.2OPTIONS: I18n Compiled on Feb 8 2013, 06:27:51.Port /dev/ttyUSB0, 21:22:32Press CTRL-A Z for help on special keys Waiting for enter to start /bin/sh (pid 46, terminal /dev/console) Please press Enter to activate this console. Starting pid 46, console /dev/conso
10、le: /bin/shBusyBox v0.60.3 (2002.05.13-08:36+0000) Built-in shell (ash)Enter help for a list of built-in commands.# ls333.bmp microwindows-0.90 sbinbin mmcsd sheryl.mp3bomb mnt testdev notebook tmpetc pig.mp3 usr hello.c proc var iceage.mpeg qcop-msg-qpe vcongui lib qcop-msg-quicklauncher linuxrc qt
11、embedded-root # cd test # ./helloarm Hello linux!this is 1this is 2this is 3this is 4this is 5this is 6this is 7this is 8this is 9this is 10 (3)超级终端下运行:3、gdb调试五、思考:1、在使用交叉编译工具进行编译过程中,要生成可用gdb调试的程序,需要再编译过程中加什么参数?答:gcc -g hello.c -o hello 要加上“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该执行文件。2、使用telnet进行目标板访问过
12、程中,什么时候运行open命令不会出现连接不到目标板的情况?答:目标版能显示文档内容,表示所有连接成功。连接不到原因:1)线路问题;(检查线路) ;2)telnet的网络设备负载过高,无法正常响应服务;(重启一下设备);3)telnet的网络设备禁止了telnet的23端口.(于设备中打开该端口);实验三 S3C2410基础实验一、实验目的:了解在ADS环境下对S3C2410芯片的AD接口的操作、键盘/LED接口的操作、直流和步进电机的工作原理和实际编程操作。二、实验内容:1、实现使用ADS和简易JTAG仿真器连接ARM芯片S3C2410;2、使用提供例程和超级终端对上述的各个模块的接口进行实
13、际操作。三、实验步骤:1、ADS实验环境的建立,参照THUEA-1A型嵌入式(ARM9)高级实验/开发系统实验指导书的157162页;2、设置好以后,到D盘ARM文件夹下,找到ADS的工程文件,拖入到打开的ADS1.2中;3、重启开发板,超级终端中显示等待状态,点击ADS1.2上的调试按钮,程序开始下装到开发板;ADS进入调试界面;4、点击调试界面上的运行按钮,程序执行到主程序处,再次点击运行程序;5、程序运行后,超级终端上显示运行提示,按提示操作键盘/LED、电机和AD转换.四、实验结果:(超级终端上的运行提示和实际运行结果)1、运行程序:(1)A/D程序:读取采样值函数:intReadAd
14、c(intch)inti;staticintprevCh=-1;rADCCON=(114)|(preScaler6)|(ch3); /设立通道if(prevCh!=ch)rADCCON=(114)|(preScaler6)|(ch3); /设立通道for(i=0;iLOOP;i+); /准备下一通道prevCh=ch;rADCCON|=0x1; /开始ADCwhile(rADCCON&0x1); /检查Enable_start位是否变低while(!(rADCCON&0x8000); /检查EC(EndofConversion)flag是否为高return(int)rADCDAT0&0x3ff
15、);在超级终端显示数字量:a4=ReadAdc(4);a6=ReadAdc(6);Uart_Printf(AIN4:%0.2f AIN6:%0.2fn,a4*3.3/1024,a6*3.3/1024);(2)D/A程序:MAX504的控制程序如下:voidDA_Test()inti;intSAVrGPACON,SAVrGPFCON,SAVrGPGCON;floatv;SAVrGPACON=rGPACON; /寄存器状态保护SAVrGPFCON=rGPFCON; /寄存器状态保护SAVrGPGCON=rGPGCON; /寄存器状态保护MAX504_CLEAR(); /将DAC寄存器设为0Uart
16、_Printf(DACTestnPleaseobservethecorrespondingofoutputandinput:n);for(i=0;i1024;i+=8)Max504_SetDA(i); /MAX504读取数字量转化v=(float)i)*Max504_FULL/1024.0f; /数字量显示Uart_Printf(CurrentDigitalVoltageOfInput=%1.2fVr,v);Delay(2000); /数字量保持时间rGPACON=SAVrGPACON; /寄存器状态恢复rGPFCON=SAVrGPFCON; /寄存器状态恢复rGPGCON=SAVrGPGCO
17、N; /寄存器状态恢复MAX504读取数字量转化函数:voidMax504_SetDA(intvalue)value8); /发送高8位SendSPIData(value); /发送低8位MAX504_DISABLE(); /关闭MAX504(3)键盘/LED接口程序:超级终端显示键值数组:unsignedcharScandata44=F,E,D,C,B,A,9,8,7,6,5,4,3,2,1,0,;数码管码段显示值数组:unsignedcharst44=0x8e,0x86,0xa1,0xc6,0x83,0x88,0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,
18、0xf9,0xc0,;扫描键值中断函数:dorGPEDAT=rGPEDAT&0xfff7; /置GPE3为低,扫描键盘第四行rGPEDAT=rGPEDAT|0x70; /GPE4、5、6为高i=3;Read_value(i);rGPEDAT=rGPEDAT&0xffef;/置GPE4为低,扫描键盘第三行rGPEDAT=rGPEDAT|0x68; /GPE3、5、6为高i=2;Read_value(i);rGPEDAT=rGPEDAT&0xffdf; /置GPE5为低,扫描第二行键盘rGPEDAT=rGPEDAT|0x58; /GPE3、4、6为高i=1;Read_value(i);rGPEDA
19、T=rGPEDAT&0xffbf; /置GPE6为低,扫描第一行键盘rGPEDAT=rGPEDAT|0x38; /GPE3、4、5为高i=0;Read_value(i);while(value!=0);某列键值读取:case(0xe):value=Scandatadata0;rGPADAT=0x81e0; /GPA5,6,7,8输出1,15输出高rSMG0=stdata0; /数码管显示rGPADAT=0x01e0; /GPA5,6,7,8输出1,15输出低break;Uart_Printf(rkeyvalueis%c,value); /超级终端显示(5)直流、步进电机程序:直流电机正转:rG
20、PADAT=0xfff80;/GPA7置1,GPA4、5、6置0Delay(50);/延时函数,控制低脉冲时间rGPADAT=0xfff90;/GPA4、7置1,GPA5、6置0Delay(30);/延时函数,控制高脉冲时间直流电机反转:rGPADAT=0xfff20;/GPA5置1,GPA4、6、7置0Delay(50);/延时函数,控制低脉冲时间rGPADAT=0xfff60;/GPA5、6置1,GPA4、7置0Delay(30);/延时函数,控制高脉冲时间步进电机输出脉冲:rGPADAT=0xfff07;/0111,注意:低电平有效Delay(140);/延时函数,控制步进电机转速rGP
21、ADAT=0xfff0b;/1011Delay(140);rGPADAT=0xfff0d;/1101Delay(140);rGPADAT=0xfff0e;/1110Delay(140);2、超级终端运行结果:五、思考:在ADS下载程序的过程中,目标板为什么不能进入到linux系统,目标板进入linux系统后,下装的程序能不能正常运行?答:因为内存冲突;能。实验四 多路复用实验一、实验目的:1、通过实验,掌握Linux操作系统下多路复用的概念;2、学习Linux下多路复用函数的使用方法。二、实验内容:构建多路复用程序及其框架,整个流程如图所示:三、实验步骤:1、打开电脑上的虚拟机,加载Linux
22、系统。2、输入密码进入系统后,按ctrl + Alt + t打开终端;3、进入到程序所在目录,对程序进行编译;4、使用mknod in1 p建立管道1;5、使用mknod in2 p建立管道2;6、重新打开一个终端输入 cat in1;7、重新打开一个终端输入 cat in2;8、在原来终端中输入./multiplex_select;9、在in1、in2终端中随机输入字符,观察现象;10、在主程序所在终端中输入q,观察现象;11、修改编译器在目标板上运行上述程序。四、实验结果:(包括代码源码和运行结果)1、源代码:(1)multiplex_select.c代码:/* multiplex_sel
23、ect.c */#include #include #include #include #include /#include #define MAX_BUFFER_SIZE 1024 #define IN_FILES 3 #define TIME_DELAY 60 #define MAX(a, b) (a b)?(a):(b)int main(void) int fdsIN_FILES; char bufMAX_BUFFER_SIZE; int i, res, real_read, maxfd; /struct timeval tv; fd_set inset,tmp_inset; fds0
24、= 0; if(fds1 = open (in1, O_RDONLY|O_NONBLOCK) 0) printf(Open in1 errorn); return 1; if(fds2 = open (in2, O_RDONLY|O_NONBLOCK) 0) printf(Open in2 errorn); return 1; maxfd = MAX(MAX(fds0, fds1), fds2); FD_ZERO(&inset); for (i = 0; i IN_FILES; i+) FD_SET(fdsi, &inset); FD_SET(0, &inset); /tv.tv_sec =
25、TIME_DELAY; /tv.tv_usec = 0; while(FD_ISSET(fds0,&inset) | FD_ISSET(fds1,&inset) | FD_ISSET(fds2, &inset) tmp_inset = inset; res = select(maxfd + 1, &tmp_inset, NULL, NULL, 0); switch(res) case -1: printf(Select errorn); return 1; break; case 0: /* Timeout */ printf(Time outn); return 1; break; default: for (i = 0; i IN_FILES; i+) if (FD_ISSET(fdsi, &tmp_inset) / memset(buf, 0, MAX_BUFFER_SIZE); real_read = read(fdsi, buf, MAX_BUFFER_SIZE); if (real_read 0) /if (errno != EAGAIN) /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1