作者:朱老师,华清远见嵌入式学院讲师。
目 录
1、实验目的 - 2 -
2、实验设备 - 2 -
3、实验内容 - 2 -
4、实验步骤 - 3 -
4.1 开发环境搭建 - 3 -
4.1.1 安装Vmware虚拟机 - 3 -
4.1.2修改环境变量 - 6 -
4.2 编译led灯控制程序 - 6 -
4.3拷贝文件 - 6 -
4.4 执行程序 - 15 -
5、参考代码 - 16 -
1、实验目的
通过实验学习在Linux文件系统中编程实现对FS210板载LED灯的控制;
2、实验设备
硬件设备:
FS210 嵌入式开发平台,pc机(windows XP 或 win 7操作系统),移动硬盘或U盘;
软件设备:
Win XP或Win 7 Vmware10.0虚拟机下的ubuntu 12.04开发环境,交叉编译工具链(已经集成到ubuntu开发环境中,具体路径在/home/linux/toolchain/toolchain-4.4.6/bin目录下)
3、实验内容
编写FS210 开发平台Linux文件系统下的LED灯的应用程序
4、实验步骤
4.1 开发环境搭建
4.1.1 安装Vmware虚拟机
安装环境:windows XP 或 win7
打开:
光盘“嵌入式CORTEXA8部分(1)”(光盘上有标注):工具软件\Windows\华清远见开发环境\VMware Workstation 安装程序;
该目录下有Vmware 10.0 的安装程序:
VMware-workstation-full-10.0.1-1379776.exe
点击按默认方式安装即可,安装过程会提示输入许可证密钥:5G2NA-DN001-GZ2T0-RV85P-8C6KW,安装完成后,会在操作系统桌面上出现 VMware Workstation的图标;
在PC机上将
光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\华清远见开发环境\华清远见开发环境 V12B\Ubuntu_12.04_64-bit_farsight.7z
的压缩包解压,Ubuntu_12.04_64-bit_farsight.7z是已经制作好的Ubuntu 12.04 64位操作系统的镜像,该镜像已预安装好了嵌入式系统开发常用的工具,解压目录以用户实际操作目录为准,假设将其解压至E盘:在E盘中会出现Ubuntu_12.04_64-bit_farsight 的目录;
点击PC机桌面VMware 虚拟机程序的快捷方式打开虚拟机,会出现虚拟机的操作界面,如下图:
选择“打开虚拟机”,打开在步骤4.1.2解压至E盘的Ubuntu虚拟机镜像:Ubuntu_12.04_64-bit_farsight.vmx,如下图:
双击“Ubuntu_12.04_64-bit_farsight.vmx”,进入如下图的操作界面,点击“开启此虚拟机”:
等待虚拟机启动Ubuntu 12.04操作系统,系统起来后,如下图:
系统默认的用户名是linux,密码是:1
输入密码后,系统的状态如下图:
0020 打开桌面上的“终端”,在终端上输入命令“pwd”,可以查看当前所在目录,为“/home/linux”,在此目录下,输入命令“mkdir led_test”,创建“led_test”目录,存放或编写测试FS210板载LED灯的程序:
$ pwd
终端显示:/home/linux
$ mkdir led_test
$ cd led_test
4.1.2修改环境变量
编写的led测试程序需要编译为arm格式的二进制可执行程序才能在FS210平台上运行,因此需要用到交叉工具链,并将它加入到环境变量中,这样,就可在任意目录下编译程序了,交叉工具链的位置在如下目录:
/home/linux/toolchain/toolchain-4.4.6/bin
执行命令:
$ export PATH=$PATH:/home/linux/toolchain/toolchain-4.4.6/bin
export是将环境变量PATH 导出生效的命令,可以用echo命令检验有没有成功:
$ echo $PATH
终端显示:
usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/jdk1.6.0_29/bin:/home/linux/toolchain/toolchain-4.4.6/bin
如果echo $PATH 命令执行后出现上述信息,说明已成功将交叉编译工具链添加进环境变量。
4.2 编译led灯控制程序
FS210板载有两个led灯,要求以流水灯的形式控制led灯,每隔1秒钟亮灭一次,并且能够以传参的方式控制灯1和灯2的开和关,将程序命名为led.c 放在/home/linux/led_test目录下,在此目录下执行:
$ arm-cortex_a8-linux-gnueabi-gcc led.c -o led
生成的led文件即是可在fs210 linux文件系统下运行的二进制程序。
4.3拷贝文件
需将led文件通过U盘或可移动盘拷至fs210 linux 文件系统中
把u盘插到pc机上,默认情况下windows操作系统会自动识别u盘,需要将u盘映射到虚拟机的ubuntu系统中去,映射之前的ubuntu 状态如下(注意右下角红色边框内的图标,灰色图标代表没有映射到虚拟机的外设图标):
右键点击灰色图标,选择“连接”,即可映射到虚拟机,映射后的虚拟状态如 下图所示(右下角红色边框内的灰色图标变亮,代表映射成功):
U盘映射成功后,在终端执行“mount”命令:
可以看到u盘被系统自动挂载到了/media目录下,名称是WORK(具体名称依据实际u盘而定);
把led文件拷贝到u盘中:
$ cp led /media/WORK/
下面需要将u盘中的led文件copy到fs210 linux 文件系统中,选择从sd卡启动系统,sd卡启动的拨码卡关位置如图所示:
在windows 下用串口终端来查看fs210平台的后台打印信息,需将串口线把fs210开发板和pc机连接起来,为了连接方便,用一根usb 转串口线,和白色直连串口线连接起来,下面是示意图:
这种连接方式需要在pc机的windows系统上装usb转串口的驱动,驱动的位置在
光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\USB转串口驱动\CH340
目录下,点击安装即可;
U转串的驱动安装完成后,将fs210开发板按上图和pc机连接,右键点击“我的电脑”打开“管理”->“设备管理器”->“端口”:
可以看到usb转串口的端口号为com11(不同电脑,端口号可能不同,根据实际情况而定)
打开光盘“嵌入式CORTEXA8部分(1)”:工具软件\Windows\串口调试工具\PUTTY.EXE:
选择串口(Serial)连接方式:
选中第一步方框内的Serial,再点击第二步中的Serial,进入串口设置的对话框:
按照上图的参数配置串口即可,然后点击“open”,打开串口终端,上电运行开发板,进入fs210 Linux 文件系统:
将u盘插到fs210开发板上的任一一个usb接口,在串口终端可以看到u盘的配置信息:
可以看到,红色方框内,u盘对应的设备节点是/dev/sda1(不同u盘,对应的节点名称不同,根据实际情况而定);
执行挂载命令:
$ mount -t vfat /dev/sda1 /mnt
将u盘挂载到/mnt 目录下
进入/mnt 目录,可以看到u盘中的文件
$ cd /mnt
把u盘中的led 文件拷到根文件系统中:
$ cp led /
拷贝完成后,执行:
$ umount /mnt
可以卸载u盘
至此,完成了led可执行二进制程序从虚拟机到fs210 linux 文件系统的拷贝。
4.4 执行程序
在串口终端,执行:
$ cd /
进入led程序所在目录(在前面,已经把led文件从u盘拷到了根目录)改变led文件权限,赋予可执行权限
$ chmod 777 led
执行
$ ps
找到storage_manage 进程对应的进程号为1340
执行
$ kill 1340
杀死进程storage_manage 因为,它对led程序执行有影响,借此可以学习一下杀死已经存在进程的命令
执行
$ ./led 5
可以看到led 灯1和灯2 循环亮灭5次,后面数字代表led循环亮灭的次数,由用户指定
执行
$ ./led open 1
会打开 led灯1
执行
$ ./led close 1
会关闭 led灯1
执行
$ ./led open 2
会打开led 灯2
执行
$ ./led close 2
会关闭led灯2
5、参考代码
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <syscall.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#define DEV_LED "/dev/led"
//宏定义FS210 linux 文件系统中led灯对 应的设备节点
#define LED_ON 1 // ioctrl 控制命令 打开led灯的命令
#define LED_OFF 0 // ioctrl 控制命令 关闭led灯的命令
int dev_led_fd; //定义/dev/led 对应的设备文件描述符
int main (int argc ,char **argv)
{
int led_no; //定义led灯的编号
int count = argv[1][0] -48; //定义流水灯亮灭的次数
if ((dev_led_fd = open (DEV_LED, O_RDWR | O_NONBLOCK)) < 0 )
//以非阻塞和读写方式打开/dev/led 设备节点
{
printf ("Cann't open file /dev/led\n");
exit (-1);
}
printf ("open /dev/led is ok\n");
if(argc == 2) //判断传给主函数的参数个数
{
while (count--)
{
led_no = 1;
ioctl (dev_led_fd, LED_ON, led_no); //打开led灯1
sleep(1); //延时1秒钟
ioctl (dev_led_fd, LED_OFF, led_no); //关闭led灯1
led_no = 2;
sleep(1); //延时1秒钟
ioctl (dev_led_fd, LED_ON, led_no); //打开led灯2
sleep(1);
ioctl (dev_led_fd, LED_OFF, led_no) ;//关闭led灯2
sleep(1);
}
}
else if(argc == 3)
{
if(argv[1][0] == 'o' || argv[1][0] == 'O')
//判断传入的参数是打开还是关闭 如果是字符'O' 代表打开led灯
ioctl (dev_led_fd, LED_ON, argv[2][0] - 48);
//根据传入的参数来决定是打开第一个led灯还是第二个led灯
else if(argv[1][0] == 'c' || argv[1][0] == 'C')
//如果是字符'C' 则代表关闭led灯
ioctl (dev_led_fd, LED_OFF, argv[2][0] - 48);
//根据传入的参数来决定是关闭第一个led灯还是第二个led灯
else
{
printf("your input is incorrect,please try again\n");
return 0;
}
}
else
printf("your input is incorrect,please try again\n");
return 0;
}
更多相关嵌入式免费资料查看华清远见讲师博文>>