熟悉Linux开发环境

2019-07-13 08:32发布

实验一 熟悉Linux开发环境 一、实验目的 1.熟悉Linux开发环境,学习Linux开发环境的配置和使用,掌握Minicom串口终端的使用。 2.学习使用Vi编辑器设计C程序,学习Makefile文件的编写和armv4l-unkonown-linux-gcc编译器的使用,以及NFS方式的下载调试方法。 3.了解UP-NETARM2410-S嵌入式实验平台的资源布局与使用方法。 4.初步掌握嵌入式Linux开发的基本过程。 二、实验内容 本次实验使用Redhat Linux 9.0操作系统环境,安装ARM-Linux的开发库及编译器。创建一个新目录,并在其中编写hello.c和Makefile文件。学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。 三、预备知识 C语言的基础知识、程序调试的基础知识和方法,Linux的基本操作。 四、实验设备及工具(包括软件调试工具) 硬件:UP-NETARM2410-S嵌入式实验平台、PCPentium 500以上硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0MINICOMARM-LINUX开发环境 五、实验步骤 1、建立工作目录 [root@zxt smile]#  mkdir  hello [root@zxt smile]#  cd  hello 2、编写程序源代码 Linux下的文本编辑器有许多,常用的是vimXwindow界面下的gedit等,我们在开发过程中推荐使用vim,用户需要学习vim的操作方法,请参考相关书籍中的关于vim的操作指南。 Kdevelopeanjuta软件的界面与vc6.0 类似,使用它们对于熟悉windows环境下开发的用户更容易上手。 实际的hello.c源代码较简单,如下: include  main() { printf(“hello world /n”); } 我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码: [root@zxt hello]#  vi  hello.c i或者a进入编辑模式,将上面的代码录入进去,完成后按Esc键进入命令状态,再用命令wq保存并退出。这样我们便在当前目录下建立了一个名为hello.c的文件。 3、编写Makefile 要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。使用它带来的好处就是自动编译,你只需要敲一个make命令整个工程就可以实现自动编译,当然我们本次实验只有一个文件,它还不能体现出使用Makefile的优越性,但当工程比较大文件比较多时,不使用Makefile几乎是不可能的。下面我们介绍本次实验用到的Makefile文件。 CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o  CFLAGS +=  LDFLAGS+= static  all: $(EXEC) $(EXEC): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS)  clean: -rm -f $(EXEC) *.elf *.gdb *.o 下面我们来简单介绍这个Makefile文件的几个主要部分: CC 指明编译器 EXEC  表示编译后生成的执行文件名称 OBJS  目标文件列表 CFLAGS  编译参数 LDFLAGS  连接参数 all:  编译主入口 clean 清除编译结果 注意:“$(CC) $(LDFLAGS) -o $@ $(OBJS)”和“-rm -f $(EXEC) *.elf *.gdb *.o”前空白由一个Tab制表符生成,不能单纯由空格来代替。 与上面编写hello.c的过程类似,用vi来创建一个Makefile文件并将代码录入其中 [root@zxt hello]#  vi  Makefile 4、编译应用程序 在上面的步骤完成后,我们就可以在hello目录下运行make来编译我们的程序了。如果进行了修改,重新编译则运行: [root@zxt hello]#  make clean [root@zxt hello]#  make   注意:编译、修改程序都是在宿主机(本地PC机)上进行,不能在MINICOM下进行。 5、下载调试 在宿主PC计算机上启动NFS服务,并设置好共享的目录,具体配置请参照前面第一章第四节中关于嵌入式Linux环境开发环境的建立。在建立好NFS共享目录以后,我们就可以进入MINICOM中建立开发板与宿主PC机之间的通讯了。 [root@zxt hello]#  minicom [/mnt/yaffs]  mount -t nfs -o nolock 192.168.0.56:/arm2410s  /host  注意: IP地址需要根据宿主PC机的实际情况修改 成功挂接宿主机的arm2410s目录后,在开发板上进入/host目录便相应进入宿主机的/arm2410s目录,我们已经给出了编辑好的hello.c和Makefile文件,它们在/arm2410s/exp/basic/01_hello目录下。用户可以直接在宿主PC上编译生成可执行文件,并通过上面的命令挂载到开发板上,运行程序察看结果。 如果不想使用我们提供的源码的话,可以再建立一个NFS共享文件夹。如/root/share,我们把我们自己编译生成的可执行文件复制到该文件夹下,并通过MINICOM挂载到开发板上。 [root@zxt hello]#  cp hello  /root/share [root@zxt hello]#  minicom [/mnt/yaffs]  mount -t nfs -o nolock 192.168.0.56:/root/share  /host  再进入/host目录运行刚刚编译好的hello程序,查看运行结果。 [/mnt/yaffs]  cd  /host [/host]  ./hello hello world   注意:开发板挂接宿主计算机目录只需要挂接一次便可,只要开发板没有重起,就可以一直保持连接。这样可以反复修改、编译、调试,不需要下载到开发板。 六、思考题 1Makefile是如何工作的?其中的宏定义分别是什么意思? 实验二 驱动程序的加载与Demo程序的执行 一、实验目的 1.进一步熟悉Linux开发环境,数练掌握Minicom串口终端的使用。 2.进一步熟悉UP-NETARM2410-S嵌入式实验平台的资源布局与使用方法。 3.学习在目标板上执行程序和加载驱动程序的方法。 二、 实验设备及工具 1. 硬件:UP-NETARM2410-S嵌入式实验平台,PIV2.4G/512M/120G开发主机。 2. 软件:WindowsXP+VMware5.0+RedHatLinux9.0,Minicom, vi, ARM-Linux开发环境。 三、 实验内容及要求 1. 运行实验箱ARM2410平台上不需要驱动程序就能执行的Demo演示程序,观察嵌入式平台上程序执行的结果。(5) exp/hello, exp/pthread, ad, minigui/mgdemo, sound/madplay, sound/mplayer2, web/httpd 2. 运行实验箱ARM2410平台上需要加载驱动程序的Demo演示程序,学习驱动模块的加载、卸载、查看方法。要求加载新的驱动程序前卸载不再使用的驱动程序。(3) Motor/DC/., motor/STEP/., led/. 3. 编写一个Shell脚本程序,通过执行此Shell程序自动逐个运行上述所有的演示程序,对于需驱动程序支持的程序要能自动加载、卸载其驱动程序。(2)     实验三 多线程应用程序设计 一、 实验目的 1. 了解多线程程序设计的基本原理 2. 学习pthread函数的使用。 二、 实验设备及工具 3. 硬件:UP-NETARM2410-S嵌入式实验平台,PIV2.4G/512M/120G开发主机。 4. 软件:WindowsXP+VMware5.0+RedHatLinux9.0,Minicom, vi, ARM-Linux开发环境。 三、 实验内容 1. 将/arm2410s/exp/basic/02_pthread/目录中的文件拷贝到/home/name/中。详细阅读phread.c程序。Name是指自己姓名拼音或缩写。 2. 编译pthread.c程序并采用NFS服务与共享目录挂载的方式在开发平台上运行该程序,研究其输出结果,体会多线程程序的运行特点。(3) 3. 修改程序,若生产产品编号的个位数字为4,则视为不合格产品,不生产到缓冲区也不消费输出。将原来的输出格式改为: 993>>>>>>>>>>>>>>>made completed!                                  993>>>>>>>>>>>>>been consumed!    其中993是产品编号的样例,其值在1-999之间。(4) 4. 改变缓冲区的大小,观察其对生产与消费的影响。 5. 增加键盘输入线程,在生产消费线程运行的过程中随时能够输出按下的键值,若按下ESC键,能立即退出进程。若无任何按键,则生产线程结束时自动结束整个进程。(3) 四、注意事项 1. 注意拷贝操作,不能出错。 2. 注意要修改拷贝过来的文件属性的修改,chmod  777 filename  3. 注意共享目录的挂载。     实验四 串行端口程序设计 一、实验目的 1. 进一步掌握多线程程序的设计方法。 2. 了解在Linux环境下串行端口程序设计的基本方法。 3. 掌握终端的主要属性及设置方法,熟悉终端I/O函数的调用 二、实验设备及工具 1.硬件:UP-NETARM2410-S嵌入式实验平台,PIV2.4G/512M/120G开发主机。 2.软件:WindowsXP+VMware5.0+RedHatLinux9.0,Minicom, vi, ARM-Linux开发环境。 三、实验内容 1. 阅读源代码,理解串行端口参数设置的含义,编译并在2410s平台上运行该程序。(2) 2. 修改原程序,使2410s平台通过串口逐字发送“***Welcome to 2008 BeiJing Olympic Game***!”字样的内容。(3) 3. 若上述内容保存在一文本文件中,在程序中打开此文件,将文件中的全部内容通过串口逐字发送到开发主机的显示器。发送完成后,程序自动退出。(1) 4. 通过线程数据共享的方式,将键盘上的按键内容发送到串口,ESC键停止发送并退出进程。(4) 5. 编写一个简单文件收发程序,实现串口文件的下载。(3)         实验五 A/D接口的设置与程序设计   一、实验目的 1. 了解AD转换的原理与主要技术参数,了解与ARM内部转变换器相关的寄存器及参数设置方法。 2. 学习在Linux环境下对s3c2410芯片中AD转换器的操作与控制。 3. 学习Linux+ARM系统中数据采集的后期处理方法以及C语言的具体实现。 二、实验设备及工具 1.硬件:UP-NETARM2410-S嵌入式实验平台,PIV2.4G/512M/120G开发主机。 2.软件:WindowsXP+VMware5.0+RedHatLinux9.0,Minicom, vi, ARM-Linux开发环境。 三、实验内容 1.阅读源代码,学习AD接口的设置和初始化方法。 2.利用交叉编译方法在自建目录中编译运行原程序。(2) 3.修改程序,使用滑动平均滤波算法对3个通道的转换结果进行处理,调整队列长度使响应速度和数据稳定度达到一个最佳效果。(4) 附加:如果V_CH1(通道1的值)在V_CH0与V_CH2之间,则在数据之后显示“Normal”字样,否则分别显示“Low”或“High”字样(2)。 4. 在上述数据滤波基础之上,增加线程键盘控制功能,若输入数字0、1、2则选择响应的通道采集数据、刷新显示,若按“Esc”键,则退出进程。(2) 5. 将内容3的屏幕输出结果逐行记录到一个文本文件中,记录行数不要超过1000行。(2)     实验六 直流电机驱动实验   一、实验目的 1.了解ARM微处理器的PWM端口,掌握相应寄存器的配置方法。 2.学习Linux内核驱动模块配置、编译、加载的步骤与方法。 3.在Linux环境下编程实现ARM系统PWM输出的基本方法,以及实现直流电机调速与控制的程序设计方法。 二、实验设备及工具 1.硬件:UP-NETARM2410-S嵌入式实验平台,PIV2.4G/512M/120G开发主机。 2.软件:WindowsXP+VMware5.0+RedHatLinux9.0,Minicom, vi, ARM-Linux开发环境。 三、实验内容 1.阅读源代码,了解定时器寄存器的配置方法。 2.配置、编译直流电机驱动程序模块。在/kernel2410s/kernel-2410s目录中运行make menuconfig,完成配置、编译过程。(3) 3.使用insmode命令加载刚才重新编译的直流电机驱动模块,交叉编译并运行直流电机调速控制程序。(3) 4.修改源程序,当在键盘上按“上”光标键时,电机速度逐渐增加;若按“下”光标键,则电机速度逐渐减小。若按下空格键,则电机停止转动,并切换一次转动方向。(4) 5.使用AD转换外接的电位器作为输入,编程设计一个通过电位器旋钮实现直流电机调速的系统。(3)         递推平均滤波法(又称滑动平均滤波法sliding average filter   A、方法:      把连续取N个采样值看成一个队列      队列的长度固定为N      每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)      把队列中的N个数据进行算术平均运算,就可获得新的滤波结果      N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4   B、优点:      对周期性干扰有良好的抑制作用,平滑度高      适用于高频振荡的系统      C、缺点:      灵敏度低      对偶然出现的脉冲性干扰的抑制作用较差      不易消除由于脉冲干扰所引起的采样值偏差      不适用于脉冲干扰比较严重的场合      比较浪费RAM 程序: /* */ #define N 12    char b[N]; int j=0;   char filter() {   char count;   int  sum=0;   For (j=0;j   b[j++] = get_ad();   if ( j == N )  j = 0;   for ( count=0;count    sum +b[count];   return (char)(sum/N); }
转自:http://blog.csdn.net/supertiger1023/article/details/4170705