一、应用层和kernel层
很多人都是学习完单片机后才开始学嵌入式Linux的,刚开始学时都不能理解为什么写两个程序才能点亮LED,以前单片机只要写一个程序进去LED就可以控制了啊?这就是操作系统带来的分层思想。其实我们也可以直接在驱动中直接控制,但是这就失去了操作系统的意义了。
驱动程序是在kernel层,应用程序是在应用层。两者关系:
应用——》驱动 (调用驱动去操作底层硬件)
二、应用程序实例
用例子最能解释清楚知识了,我们该应用程序是调用上一节的字符驱动程序的。下面的内容以后可以作为模板使用。
1、在package文件夹下新建一个chardrv_app文件夹
2、在chardrv_app文件夹下新建一个Makefile文件,内容如下:
.org>
include $(TOPDIR)/rules.mk
PKG_NAME:=chardrv_app
PKG_RELEASE:=9
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/chardrv_app
SECTION:=utils
CATEGORY:=Utilities
TITLE:=CharDrv_app
DEPENDS:=+libncurses
endef
define Package/chardrv_app/description
This package contains an character driver.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Configure
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)
CC="$(TARGET_CC)"
CFLAGS="$(TARGET_CFLAGS) -Wall"
LDFLAGS="$(TARGET_LDFLAGS)"
endef
define Package/chardrv_app/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/chardrv_app $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,chardrv_app))
上面的Makefile和驱动的Makefile基本相似,可以从package中找一下其他模块的Makefile来进行修改,我上面的是使用nvram的Makefile进行修改的。
3、在chardrv_app文件夹下新建一个src文件夹,在src下新建一个Makefile文件,内容为:
all: chardrv_app
OBJS = chardrv_app.o
CC = gcc
CCFLAGS = -Wall -c -o
%.o: %.c
$(CC) $(CCFLAGS) $@ $< $(LDFLAGS)
chardrv_app: $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS)
clean:
rm -f rbcfg *.o
4、在src下新建chardrv_app.c文件。内容如下:
#include
#include
#include
#include
#include
#include
#include
int main(int argc , char** argv)
{
int fd;
int num = 1;
fd = open("/dev/chardrv" , O_RDWR|O_NONBLOCK);
if(fd < 0)
{
printf("can't open /dev/chardrv
");
return -1;
}
write(fd,&num,1);
read(fd,&num,1);
ioctl(fd,1,1);
close(fd);
return 0;
}
5、make menuconfig将模块选中
6、依次执行下面语句进行编译
make package/chardrv_app/compile V=99
make package/chardrv_app/install V=99
make package/index V=99
编译出来的文件在openwrt/bin/ramips/packages/base/下,文件名
chardrv_app_9_ramips_24kec.ipk
7、将编译好的固件放到开发板上,然后按照下面的图片进行测试。
三、出现的问题及解决方法
安装应用时出现下面的问题:
解决方法: 重新使用make V=99编译openwrt固件,然后下载到开发板上。上面的问题主要是固件是之前的,不是最新的。要先编译驱动和应用程序后再重新编译路由固件,否则会出现这个问题。
*编译时如果出现权限不够时,要加上sudo,这样就可以编译通过了。