OpenWRT(八)应用层开发

OpenWRT(八)应用层开发一 应用层和 kernel 层很多人都是学习完单片机后才开始学嵌入式 Linux 的 刚开始学时都不能理解为什么写两个程序才能点亮 LED 以前单片机只要写一个程序进去 LED 就可以控制了啊 这就是操作系统带来的分层思想 其实我们也可以直接在驱动中直接控制 但是这就失去了操作系统的意义了 驱动程序是在 kernel 层 应用程序是在应用层 两者关系 应用 驱动 调用驱动去操作底层硬件 二 应用程序实例用例

OpenWRT版本:17
 

一、应用层和kernel层

很多人都是学习完单片机后才开始学嵌入式Linux的,刚开始学时都不能理解为什么写两个程序才能点亮LED,以前单片机只要写一个程序进去LED就可以控制了啊?这就是操作系统带来的分层思想。其实我们也可以直接在驱动中直接控制,但是这就失去了操作系统的意义了。

二、应用程序实例

用例子最能解释清楚知识了,我们该应用程序是调用上一节的字符驱动程序的。下面的内容以后可以作为模板使用。

# # Copyright (C) 2009-2010 Jo-Philipp Wich 
  
    # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # 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\n"); return -1; } //函数测试 write(fd,&num,1); read(fd,&num,1); ioctl(fd,1,1); close(fd); return 0; } 
         
        
       
      
     
    
  

这里写图片描述

三、出现的问题及解决方法

安装应用时出现下面的问题:
这里写图片描述

解决方法: 重新使用make V=99编译openwrt固件,然后下载到开发板上。上面的问题主要是固件是之前的,不是最新的。要先编译驱动和应用程序后再重新编译路由固件,否则会出现这个问题。

*编译时如果出现权限不够时,要加上sudo,这样就可以编译通过了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217294.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:54
下一篇 2026年3月18日 上午9:54


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号