以http://www.gargoyle-router.com/wiki/doku.php?id=openwrt_coding为参考文档

1.要获得openWRT的sdk环境。只要在Backfire的make menuconfig中选择:Build the OpenWRT SDK,然后make即可。会得到一个sdk的压缩包:OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2 (位置在bin/brcm47xx目录中)。这个SDK就是我们后面开发自己的模块的开发环境了(因为它模拟了我们开发的模块所要工作的目标平台的编译环境)

2.将OpenWrt-SDK-brcm47xx-for-Linux-x86_64-gcc-4.3.3+cs_uClibc-0.9.30.1.tar.bz2拷贝到其他地方并解压缩,然后将得到的目录名改短为:OpenWrt-SDK-brcm47xx;进入此目录后会发现其组成和之前使用的openWRT的开发包大致是一样的。

进入其中的OpenWrt-SDK-brcm47xx/package目录,并开始我们自己的模块,即helloworld的开发。

这里有一篇文档,可以指导如何使用此SDK环境:http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk

3.创建一个子目录:helloworld(代表我们自己的模块),进入helloworld子目录。在此目录中创建一个用于让OpenWRT识别的Makefile。其内容如下:

#
# Copyright (C) 2007-2010 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_RELEASE:=1

# This specifies the directory where we're going to build the program.  
# The root build directory, $(BUILD_DIR), is by default the build_mipsel
# directory in your OpenWrt SDK directory
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/helloworld
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=Helloworld -- prints a snarky message
endef

define Package/helloworld/description
    helloworld,first self-made.
endef

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/helloworld/install
    $(INSTALL_DIR) $(1)/bin                              ---- 这个决定了最后通过opkg命令,将此ipk安装到设备中的哪个目录?
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef

$(eval $(call BuildPackage,helloworld))

然后,再在此目录下创建一个新的子目录:src,并在其中创建实际的源代码文件(helloworld.c)和针对此源代码文件的Makefile---这个Makefile是用来编译helloworld模块自己的。源代码文件:helloworld.c的内容是:

#include <stdio.h>
#include <unistd.h>
int main(void)
{
     printf("hello world, my first self package \n\n");
     return 0;
}

Makefile的内容是:

# build helloworld executable when user executes "make"
helloworld: helloworld.o
    $(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
    $(CC) $(CFLAGS) -c helloworld.c
    
# remove object files and executable when user executes "make clean"
clean:
    rm *.o helloworld

特别注意:

1.这里创建的两个Makefile,在ubuntu上,都不要使用Gedit来写,而要使用VIM来写,并特别保证命令之前使用TAB键盘进行空格操作。方能让Makfile识别出来 --- 我在这上面耗费了1天时间啊

2.不能使用make menuconfig来进行配置,否则会导致.config文件中只有一个关于helloworld模块的编译选项,其他与编译环境有关的配置项都消失了。这样会导致无法编译出结果;因此,在编写完上述Makefile和源代码后,只要在主目录上敲入make就可以了  -- 但是这里遗留一个问题:如果存在多个package,然而只要指定编译其中某一个,该怎么办呢?

**********************************************************

4.上述就是文件编写的过程了。如下是编译和使用

在OpenWrt-SDK-brcm47xx目录中,敲入make即可。然后就可以在bin/brcm47xx/packages目录下看到我们的编译成果了:helloworld_1_brcm47xx.ipk

5.接下来是将此文件拷贝到设备中。

首先,在设备中开启ssh服务;

然后,敲入命令:scp helloworld_1_brcm47xx.ipk root@192.168.1.1:      此命令敲入后会提示输入密码,则就把设备上的ssh的登陆密码输入即可。然后此ipk文件就拷贝到设备上的root目录中了   ---- 但是,这样还不是最终结果,我们还需要将此文件装载到设备上

最后,我们通过ssh连接到设备中,并敲入命令:opkg install helloworld_1_brcm47xx.ipk   --- 这样,就真正把此ipk装载到设备中了 :装载到bin目录中

我们验证一下:在设备的任意目录中,敲入helloworld,就可以看到输出了:Hello world, my first self package

6.补充说明

如果我们更新了helloworld的源码包,并再次编译出新的ipk。则要更新之,需要做如下工作:

首先:将设备中的root目录下的当前的ipk删除之;并且将之前安装到设备的相同文件删除之(这个方法是opkg remove helloworld)

然后:将新的ipk通过scp命令拷贝到设备中, 并再通过opkg命令安装之

openWRT自学---如何开发新的用户态模块-helloworld的更多相关文章

  1. 循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

    在前面随笔介绍了ABP+Vue前后端的整合处理,包括介绍了ABP的后端设计,以及前端对ABP接口API的ES6的封装,通过JS的继承类处理,极大减少了重复臃肿的代码,可以简化对后端API接口的封装,而 ...

  2. BlueStore-先进的用户态文件系统《二》-BlueFS

    https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...

  3. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  4. openWRT自学计划安排

    目标:充分理解openwrt的框架构成,能够在openwrt框架下实现:开发新程序,修改现有程序,修改内核,修改boot.为此,制定如下计划: 一.如何在openwrt上做开发 1.编译出一个BRCM ...

  5. 如何自学 Java 开发

    如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HT ...

  6. Linux操作系统学习_用户态与内核态之切换过程

    因为操作系统的很多操作会消耗系统的物理资源,例如创建一个新进程时,要做很多底层的细致工作,如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录.页表等,这些操作显然不能随便让任何程序都可以做,于是就产 ...

  7. NFV、DPDK以及部分用户态协议研究

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 对我而言,这是一个新的领域,很有意思. 一.解释名词: NFV(Network Functio ...

  8. 零基础如何自学java开发?

    开篇直奔主题,java 学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习. 有人指导:第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人.先介绍下我 ...

  9. 2 OpenWrt路由器系统开发与网页设计

    https://www.zhongkerd.com/news/content-729.html 摘 要: 目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户 ...

随机推荐

  1. Easyui treegrid 无法显示树形结构解决办法

    easyui treegrid 中检查了数据结构没有问题的,但就是不展示树形结构, 检查发现原来是 var columnsAll = [ { title: '任务ID', field: 'TaskID ...

  2. 解决ThinkPHP3.2.3框架,PDO驱动类“抛出异常”不起作用的bug

    项目中引进了ThinkPHP3.2.3的模型层,发现当SQL语句出错时,系统抛出的异常不是我想要的效果,打开文件 ThinkPHP\Library\Think\Db\Driver.class.php, ...

  3. 打算安装个Ubuntu双系统,遇到了些基本概念问题(主分区、活动分区、扩展分区、逻辑分区)

    和运维的同事聊天,了解到: 1.XP系统时代(老的硬盘分区形式和分区表),最多允许建4个“主分区”,为了解决这个限制,就有了“扩展分区”的概念: 2.在“扩展分区”上,我们就可以建很多的“逻辑分区”, ...

  4. 2016年31款轻量高效的开源 JavaScript 插件和库

    目前有很多网站设计师和开发者喜欢使用由JavaScript开发的插件和库,但同时面临一个苦恼的问题:它们中的大多数实在是太累赘而且常常降低网站的性能.其实,其中也有不少轻量级的插件和库,它们不仅轻巧有 ...

  5. 【JSP EL】el表达式判断是否为null

    后台程序放入Model中,从前台el表达式取出来非常方便,但是如果需要处理 当数据为null的时候,怎么办,不为null的时候,怎么办:这个怎么处理呢? <span class="us ...

  6. macOS中Vim基本配置,颜色主题/语法/indent设置

    macOS中Vim基本配置 Vim的初始化配置 .vimrc 存放位置 macOS 环境下 vim 的初始化配置文件为 .vimrc , 通常有两个(系统版本和用户版本),一个位于 /usr/shar ...

  7. js基础的思维导图

    纯粹转载下,我可画不出这么好看的思维导图,这得感谢@ChokCoco javascript变量 javascript运算符 javascript数组 javascript流程语句 javascript ...

  8. 安装office2016 64位时提示64位与32位的office程序不兼容,在系统是64位的情况下,由于应用的需要,必须装64位的office,怎么办

    解决办法如下: 如果是,那就看看32位的能不能安装了,要是能,就重新安装一次,把所有组件全部安装,然后,在进行卸载,一般可以卸载成功 如果卸载不成功,这个时候再使用微软的专用卸载工具,——要认清,一定 ...

  9. C#之Raw Socket网络封包监视源码

    大家可以建立一个Windows Form应用程序,在下面的各个文件中添加对应的源码: //RawSocket.csnamespace ReceiveAll{ using System; using S ...

  10. observer pattern 之我见

    所谓模式,更多的是一种想法,完全没必要拘泥于代码细节.观察者模式更多体现了两个独立的类利用接口完成一件本应该很复杂的事情 --------------------------------------- ...