TA的每日心情 | 慵懒 2024-5-20 16:09 |
---|
签到天数: 665 天 连续签到: 1 天 [LV.9]以坛为家II
|
工欲善其事必先利其器,要想进行Linux应用程序的开发,需要搭载Linux开发环境。
首先在VMware虚拟机中安装官方CD提供的Ubuntu系统,版本为10.04。
然后将官方CD提供的交叉编译工具加入环境变量,这样系统就可以识别这些命令。
接着还需要下载一些必要的工具。
由于程序一般是在PC上进行交叉编译,生成最后可执行文件,因此需要通过TFTP、NFS或者SSH等方式将此执行文件传送到开发板上。这里推荐Windows下的"SSH Secure Shell"进行文件拷贝。
将准备工作做完后,便可开始Linux应用程序的开发,这里基于官方的例程对Rico Board板上的LED和按键进行编程。
在Linux下所有硬件资源都是以文件的形式存在。Rico Board共有4个LED,Linux内核的LED子系统为这4个LED提供了对应的操作接口,位于目录“/sys/class/leds/”下,分别为status_led0、status_led1、status_led2、status_led3。
以status_led0为例,进入其目录,可以看到几个重要文件。
“max_brightness”为LED的最大亮度;
“brightness”控制着LED亮灭,“0”时LED熄灭,“1”时LED点亮;
“trigger”为LED触发器,控制着LED亮灭方式,当前值为方括号内的“heartbeat”,即以类似心跳的方式进行闪烁。
应用程序中关键代码如下,让4个LED依次亮灭1秒。此处“sprintf”函数用于生成命令字符串tmp,然后通过system函数将此命令发送到shell中执行。
for(ledn=0;ledn<=3;ledn++) { sprintf(tmp,"echo 1 > /sys/class/leds/status_led%d/brightness",ledn); printf("status led%d on\n",ledn); system(tmp); sleep(1); sprintf(tmp,"echo 0 > /sys/class/leds/status_led%d/brightness",ledn); printf("status led%d off\n",ledn); system(tmp); sleep(1); } 接着,将LED0的触发方式变为心跳灯,让它自己在那闪。system("echo heartbeat > /sys/class/leds/status_led0/trigger"); 对于按键,这里是基于Linux内核的输入子系统接口进行编程。输入子系统位于目录“/dev/input”下。其中“event0”对应中开发板上的SW3按键。
要想使用输入子系统下的按键,首先需要以只读的方式打开event0设备。
keys_fd = open("/dev/input/event0", O_RDONLY); 然后通过read函数读取此设备,如果此时读取值的type属性为EN_KEY,说明发生了按键事件,并通过判断value值来判断按键是按下还是松开。if (read(keys_fd, &t, sizeof(t)) == sizeof(t)){ if (t.type == EV_KEY) if (t.value == 0 || t.value == 1) { printf ("key %d %s\n", t.code,(t.value) ? "ressed" : "Released"); if(t.code==KEY_ESC) break; }} 总结,熟悉了Rico Board Linux应用程序开发的流程。最后附上整个源代码。/********************************************************************* copyright (C) 2014 all rights reserved* @file: key_led.c* @Created: 2014-7-28 14:00* @Author: conway chen* @Description: test user keys and leds * @Modify Date: 2014-7-28 14:00*********************************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ioctl.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/select.h>#include<sys/time.h>#include<fcntl.h>#include<errno.h>#include<linux/input.h>/** * @brief: main function * @Param: argc: number of parameters * @Param: argv: parameters list */int main(int argc, char *argv[]){ int ledn; char* tmp; int keys_fd; struct input_event t; tmp = (unsigned char*)malloc(64); for(ledn=0;ledn<=3;ledn++) { sprintf(tmp,"echo 1 > /sys/class/leds/status_led%d/brightness",ledn); printf("status led%d on\n",ledn); system(tmp); sleep(1); sprintf(tmp,"echo 0 > /sys/class/leds/status_led%d/brightness",ledn); printf("status led%d off\n",ledn); system(tmp); sleep(1); } system("echo heartbeat > /sys/class/leds/status_led0/trigger"); keys_fd = open("/dev/input/event0", O_RDONLY); if (keys_fd <= 0) { printf ("open /dev/input/event0 device error!\n"); return 0; } printf("Hit any key on board ......\n"); while(1) { if (read(keys_fd, &t, sizeof(t)) == sizeof(t)) { if (t.type == EV_KEY) if (t.value == 0 || t.value == 1) { printf ("key %d %s\n", t.code,(t.value) ? "ressed" : "Released"); if(t.code==KEY_ESC) break; } } } close (keys_fd);} |
|