步骤如下:
一:编写源码:本文末尾是我自己编写的一个简单的按键应用程序keyFunction.c
二:编译源码:在Linux环境下,用对应的toolchain 编译源码,生成应用程序的可执行文件 keyFunction
例如:# arm-none-linux-gnueabi-gcc -okeyFunction keyFunction.c
三:添加应用程序keyFunction到文件系统:
linux系统在启动时,会自动调用并执行脚本 /etc/init.d/rc.local,因此当我们的应用需要一开机就自动运行的话,就可以直接在文件系统的rc.local 中添加指令如下:
#################### rc.local ###############
#!/bin/sh
echo "local service: telnetd start"
telnetd
/etc/jffs2/service.sh &
/opt/./keyFunction &
#echo "Samba start"
#nmbd -D
#smbd -D
#############################################
上面红色部分就是添加的我自己的应用程序,注意:指令格式,及应用程序所在的目录一定要正确,否则应用不能运行!
如果应用程序不需要开机就运行,那就可以将keyFunction放在文件系统的任意目录中,比如 /opt/ , /usr/bin/ 等,然后在需要运行keyFunction的时候,由其它的应用程序通过系统调用来执行,此时不需要在rc.local 中添加任何指令。假设keyFunction
/opt/目录中,那么可以用下面的方法启动keyFunction
system("/opt/./keyFunction &");
其中‘&’ 表示在后台运行。
结束!
################################### keyFunction.c ######################
#include
#include
#include
#include
#include
#include
#include /*文件控制*/
#include
#include /*时间方面的函数*/
#include /*有关错误方面的宏*/
#include //poll()
#include
#include //memset()
#include
int main(void)
{
int fd,ret;
struct pollfd event; //创建一个struct pollfd结构体变量,存放文件描述符、要等待发生的事件
struct input_event key_value;
while(1)
{
fd=open("/dev/input/event1",O_RDWR);
if(fd<0)
{
perror("open error!\n");
exit(1);
}
//poll结束后struct pollfd结构体变量的内容被全部清零,需要再次设置
memset(&event,0,sizeof(event)); //memst函数对对象的内容设置为同一值
event.fd=fd; //存放打开的文件描述符
event.events=POLLIN; //存放要等待发生的事件
ret=poll((struct pollfd *)&event,1,5000); //监测event,一个对象,等待5000毫秒后超时,-1为无限等待
//判断poll的返回值,负数是出错,0是设定的时间超时,整数表示等待的时间发生
if(ret<0)
{
printf("poll error!\n");
exit(1);
}
if(ret==0)
{
//printf("Time out!\n");
continue;
}
if(event.revents&POLLERR)
{ //revents是由内核记录的实际发生的事件,events是进程等待的事件
printf("Device error!\n");
exit(1);
}
if(event.revents&POLLIN)
{ //key_value=0;
ret=read(fd,&key_value,sizeof(key_value));
if(key_value.value==0)//此处判断按键是否松开
{
switch(key_value.code)//驱动input 上来的真正的按键值
{
case KEY_MENU:
printf("press----KEY_MENU mplayer\n");
system("mount /dev/mmcblk0p1 /mnt/");//system 是系统调用函数,可直接执行文件系统中的任何其他应用程序。
system("/opt/./mplayer -n /mnt/wenbie.mp4 &");//此处调用/opt/ 下的应用程序 ./mplayer 并播放视频文件wenbie.mp4 , '&' 表示在后台运行。
break;
case KEY_UP:
printf("press----KEY_UP preview\n");
system("mount /dev/mmcblk0p1 /mnt/");
system("/opt/./preview");
break;
case KEY_DOWN:
printf("press----KEY_DOWN audiorec\n");
system("mount /dev/mmcblk0p1 /mnt/");
system("/opt/./audiorec -p /mnt -a 2 -t 120");
break;
default:
break;
}
}
}
close(fd);
}
return 0;
}