《T7编制并运行LED测试程序》由会员分享,可在线阅读,更多相关《T7编制并运行LED测试程序(19页珍藏版)》请在金锄头文库上搜索。
1、T7T7:编制并运行:编制并运行LEDLED测试测试程序程序1 Linux应用程序开发流程应用程序开发流程WindowsWindows上编辑代码上编辑代码( (SourceInsightSourceInsight或或UntraeditUntraedit) )LinuxLinux下编辑代下编辑代码码( (vivi/ /geditgedit) )LinuxLinux上编译代码上编译代码( (armarm- -linuxlinux- -gcc testgcc test. .c c - -o testo test) )WindowsWindows上下载代码到目标机上下载代码到目标机( (ftpftp,
2、 , serial consoleserial console by by rzrz) )在在目标机目标机LinuxLinux上运行上运行程序有问题吗程序有问题吗? ?程序开发结束程序开发结束或或在在WindowsWindows上开发上开发在在LinuxLinux上上调试调试2 源代码说明源代码说明驱动源代码所在目录 /opt/FriendlyARM/mini2440/linux-2.6.32.2/drivers/char驱动程序名称 mini2440_leds.c设备类型 misc设备名 /dev/leds测试程序源代码目录 /opt/FriendlyARM/mini2440/example
3、s/leds测试程序名称 led.c测试程序可执行文件名称 led按照编译按照编译hello程序的步骤手工编译出程序的步骤手工编译出led 可执行文件,然后下载可执行文件,然后下载到开发板运行它。到开发板运行它。在在Fedora系统上:系统上:首先利用下面的步骤,编译首先利用下面的步骤,编译led.c文件。文件。#cd /opt/FriendlyARM/mini2440/examples/leds#make然后通过然后通过U盘或串口方式盘或串口方式把可执行文件把可执行文件led下载到开发板下载到开发板板板 “/home/plg”文件夹中。文件夹中。在超级终端上,访问开发板:在超级终端上,访问开
4、发板:首先进入首先进入led所在的目录,然后执行下面的命令所在的目录,然后执行下面的命令#chmod +x led#/etc/rc.d/init.d/leds stop ; 先停止所有先停止所有LED的闪烁的闪烁#./led led_no 0|1; 开关某个开关某个LED其中,其中,led为可执行程序的名称,为可执行程序的名称,led_no是要控制的是要控制的LED编号(编号(03),),0|1是开关操作,是开关操作,0是关,是关,1是开,例如要点亮是开,例如要点亮LED3,则正,则正确的命令为确的命令为“led 2 1”。先运行程序P933 源代码清单源代码清单#include #inclu
5、de #include #include int main(int argc, char *argv) int on; / 开关控制,1:开,0:关 int led_no; /LED编号,03 int fd; /文件句柄 /* 检查led 控制的两个参数,如果没有参数输入则退出。*/ if (argc != 3 | sscanf(argv1, %d, &led_no) != 1 | sscanf(argv2,%d, &on) != 1 | on 1 | led_no 3) fprintf(stderr, Usage: led led_no 0|1n); exit(1); P92纯纯C语言语言程
6、序解析3 源代码清单(续)源代码清单(续) /*打开/dev/leds 设备文件*/ fd = open(“/dev/leds0”, 0); / 以只读模式打开leds0文件 if (fd 0) /若不能打开 fd = open(“/dev/leds”, 0); /就打开leds文件 if (fd 0) perror(“open device leds”); /再打不开就输出错误信息 exit(1); /并退出 /*通过系统调用ioctl 和输入的参数控制led*/ ioctl(fd, on, led_no); /*关闭设备句柄*/ close(fd); return 0; 4 Linux o
7、pen函数说明函数说明open 函数用于打开和创建文件。函数用于打开和创建文件。 其原型为:其原型为:int open(const char *pathname, int oflag)返回值:成功返回文件描述符,否则返回返回值:成功返回文件描述符,否则返回 -1; open 返回的文件描述符一定是最小的未被使返回的文件描述符一定是最小的未被使用的描述符。用的描述符。 输入参数说明:输入参数说明:pathname是待打开是待打开/创建文件的路径名;创建文件的路径名;4 Linux open函数说明函数说明第二个参数第二个参数:oflag 用于指定文件的打开用于指定文件的打开/创建模式。创建模式。
8、O_RDONLY(0000)只读模式)只读模式O_WRONLY(0001)只写模式)只写模式O_RDWR(0002)读写模式)读写模式打开打开/创建文件时,至少得使用上述三个常量中的一个。创建文件时,至少得使用上述三个常量中的一个。5 sscanf函数详解函数详解函数原型函数原型:intsscanf(constchar*,constchar*(输入格式参(输入格式参数)数),目的变量目的变量);intscanf(constchar*(输入格式参数)(输入格式参数),目的变量目的变量);头文件:头文件:#include说明:说明:sscanf与与scanf类似,都是把源数据按照一定的格式类似,都
9、是把源数据按照一定的格式输入到目的变量中,输入到目的变量中,只是后者以键盘只是后者以键盘(stdin)为输入源,为输入源,前者以固定字符串为输入源前者以固定字符串为输入源。返回值:返回值:成功返回成功返回1。5 sscanf函数详解(续)函数详解(续)输入格式参数说明:输入格式参数说明:参数可以是一个或多个类似参数可以是一个或多个类似%*widthh|I|I64|Ltype非非%符号符号的集合。的集合。*用于格式中用于格式中,(如如%*d和和%*s)表示跳过此数据,不表示跳过此数据,不读入读入表示可选项表示可选项a|b|c表示表示a,b,c中选一中选一width表示读取宽度表示读取宽度h|I|
10、I64|L:参数的:参数的size,h表示单字节,表示单字节,I表示表示2字节,字节,L表示表示4字节(字节(double例外),例外),I64表示表示8字节字节type:输入的数据类型,如:输入的数据类型,如%s(字符串),(字符串),%d(整(整形)之类形)之类5 sscanf函数详解(续)函数详解(续)集合操作:%a-z 表示匹配a到z中任意字符%aB 匹配a、B、中一员%a 匹配非a的任意字符5 sscanf函数详解(续):例函数详解(续):例1char buf512;sscanf(123456 , %s, buf); 此处buf是数组名,它的意思是将123456以%s的形式存入buf
11、中! printf(%sn, buf); 结果为:1234565 sscanf函数详解(续):例函数详解(续):例2int a, b, c; sscanf(2006:03:18, %d:%d:%d, &a, &b, &c); printf(“a=%d,b=%d,c=%dn”,a,b,c);结果为:结果为:a=2006,b=3,c=186 fprintf函数说明函数说明fprintf函数与函数与printf 函数的功能相似,都是格函数的功能相似,都是格式化读写函数。式化读写函数。两者的区别在于两者的区别在于fprintf函数的读写对象不是键函数的读写对象不是键盘和显示器,而是磁盘文件。盘和显示器
12、,而是磁盘文件。调用格式为:调用格式为:fprintf(文件指针,格式字符串,文件指针,格式字符串,输出表列输出表列);例如:例如:fprintf(fp,%d%c,j,ch); 7 perror函数说明函数说明原型:原型:voidperror(constchar*s)说明:说明:perror是错误输出函数,在标准输出设备上是错误输出函数,在标准输出设备上输出一个错误信息。输出一个错误信息。参数参数s一般是指产生错误的函数一般是指产生错误的函数例例perror(“fun”)其输出为:其输出为:fun:后面跟着错误信息(加上一个换行符):后面跟着错误信息(加上一个换行符)8 stderr说明说明(
13、了解了解)在在linux中,打开一个进程后默认会打开中,打开一个进程后默认会打开stdin(标准输(标准输入设备)、入设备)、stdout(标准输出设备)和(标准输出设备)和stderr(标准(标准错误设备)。错误设备)。stdin的句柄号为的句柄号为0, stdout的句柄号为的句柄号为1, stderr的句柄号为的句柄号为2。stdin一般会从键盘、鼠标等输入设备中获取信息。一般会从键盘、鼠标等输入设备中获取信息。stdout一般会把信息输出到终端等输出设备中。一般会把信息输出到终端等输出设备中。stderr一般会接收系统产生的错误,并把错误信息输出一般会接收系统产生的错误,并把错误信息输
14、出到输出设备中;到输出设备中;mini2440开发板系统的错误输出设备开发板系统的错误输出设备为串口为串口0终端。例子如下:终端。例子如下:fprintf(stderr,“Usage:ledsled_no0|1n”);fprintf函数把函数把“Usage: leds led_no 0|1n”输出到输出到stderr中,而中,而stderr又把该信息中串口又把该信息中串口0终端中输出。终端中输出。9 ioctl函数说明函数说明ioctl是是设备驱动程序中对设备的设备驱动程序中对设备的I/O通道进行管理通道进行管理的函数。的函数。所谓对所谓对I/O通道进行管理,就是对设备的通道进行管理,就是对设
15、备的一些特性进行控制,例如串口的传输波特率、马达一些特性进行控制,例如串口的传输波特率、马达的转速等等。的转速等等。函数原型:函数原型:intioctl(intfd,indcmd,)其中其中fd就是用户程序打开设备时使用就是用户程序打开设备时使用open函数返函数返回的文件标示符,回的文件标示符,cmd就是用户程序对设备的控制就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和般最多一个,有或没有是和cmd的意义相关的。的意义相关的。ioctl函数是文件结构中的一个属性分量函数是文件结构中的一个属性分量,就是说
16、如,就是说如果你的驱动程序提供了对果你的驱动程序提供了对ioctl的支持,用户就可以的支持,用户就可以在用户程序中使用在用户程序中使用ioctl函数控制设备的函数控制设备的I/O通道。通道。 10 close函数说明函数说明此系统调用功能,恰好与此系统调用功能,恰好与open调用相反的操作,调用相反的操作,即告诉系统关闭一些不再使用的文件。即告诉系统关闭一些不再使用的文件。函数原型:函数原型:intclose(intfd)它的使用格式如下:它的使用格式如下:retval=close(handle);如调用成功,则系统返回如调用成功,则系统返回0给变量给变量retval,否则,否则返回返回-1也可直接写成:也可直接写成:close(handle);不过,使用这种方式关闭文件会造成无法从系统不过,使用这种方式关闭文件会造成无法从系统的返回值的返回值retval判定系统是否成功地关闭了这个判定系统是否成功地关闭了这个文件。文件。 结束语结束语谢谢大家聆听!谢谢大家聆听!19