本文转载自:http://www.openloongson.org/forum.php?mod=viewthread&tid=85

本帖最后由 gt945 于 2015-7-5 17:06 编辑

一、为什么要使用Buildroot

肯定有人会想,编译一个Helloworld程序还用Buildroot,是不是有点杀鸡用牛刀?也肯定有人会想,Buildroot是什么东西,是干什么用的?
首先,Buildroot(http://buildroot.org/)是一个自动化的嵌入式Linux系统构建工具,它可以自动下载、配置各种代码;一条龙地编译工具链、内核、库文件、程序等;自动生成并打包根文件系统为可烧写的镜像。Buildroot生成的工具链可以单独使用,在使用的时候可以无需另外关心头文件、库文件的目录设置,简化交叉编译的工作量。
简单说,你可以利用Buildroot DIY你自己的Linux系统!不管是嵌入式Linux的爱好者还是开发人员,使用、配置Buildroot都是一项必备的技能!
针对开源龙芯LS1C(以下简称智龙)开发板,我特意创建了一个Buildroot的分支,并托管在https://git.oschina.net/ur9/ls1c_buildroot.git
首先使用Git获取代码:

  1. git clone https://git.oschina.net/ur9/ls1c_buildroot.git -b ls1c
  2. cd ls1c_buildroot

复制代码

检查目录下的内容:
<ignore_js_op>

针对智龙我已经写好配置文件,只需要执行如下指令即可完成配置:

  1. make mipsel_ls1c_defconfig

复制代码

<ignore_js_op>

可以尝试编译一下:
make
<ignore_js_op> 
如果没有错误,最终将显示如下画面,此时已经生成好vmlinux和rootfs了,可以直接烧写到智龙里面了,但是我们今天的目标还没有完成。

<ignore_js_op>

生成的文件在ls1c_buildroot/output.images下:

<ignore_js_op>

二、在Buildroot中增加Helloworld模块
创建一个简单的helloworld程序,例如:
/home/tao/workspace/helloworld/main.c
文件内容如下:
<ignore_js_op> 
接下来我们需要将这个小程序集成到buildroot中。
在ls1c_buildroot/package/下创建helloworld目录,并在目录中创建Config.in 和 helloworld.mk文件:

<ignore_js_op>

Config.in文件的主要作用是使得在Buildroot的配置菜单中显示出我们新加的东西。在这里,我们定义了两个变量,一个Bool的BR2_PACKAGE_HELLOWORLD,表示是否编译Helloworld;一个字串的BR2_PACKAGE_HELLOWORLD_DIR,表示main.c所在的文件夹。两个文件的内容如下:
menu "Hello World"
        config BR2_PACKAGE_HELLOWORLD
            bool "helloworld"
            default n
            help
                Hello world.
        config BR2_PACKAGE_HELLOWORLD_DIR
            string "Directory name for Hello World code"
            depends on BR2_PACKAGE_HELLOWORLD
            default "helloworld"
endmenu
Helloworld.mk定义了模块的代码获取方式、编译方式和安装方式。
HELLOWORLD_VERSION表示版本;
HELLOWORLD_SITE表示源码位置;
HELLOWORLD_SITE_METHOD表示源码获取方式,由于是本地代码,所以是local;
HELLOWORLD_INSTALL_TARGET表示是否安装到嵌入式目标系统中;
HELLOWORLD_BUILD_CMDS表示编译方式;
HELLOWORLD_VERSION:= 1.0
HELLOWORLD_SITE:= $(BR2_MYCODE_DIR)/$(BR2_PACKAGE_HELLOWORLD_DIR)/
HELLOWORLD_SITE_METHOD:=local
HELLOWORLD_INSTALL_TARGET:=YES
define HELLOWORLD_BUILD_CMDS
        $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef
define HELLOWORLD_INSTALL_TARGET_CMDS
        $(MAKE) INSTALL="$(INSTALL)" DESTDIR="$(TARGET_DIR)"  -C $(@D) install
endef
$(eval $(generic-package))
HELLOWORLD_INSTALL_TARGET_CMDS表示安装方式;

<ignore_js_op> 
<ignore_js_op>

修改文件ls1c_buildroot/package/Config.in,将helloworld目录下的Config.in包含进来。
另外定义了一个字串BR2_MYCODE_DIR,表示我自己的代码所在的位置。也就是说main.c所在目录的路径,例如/home/tao/workspace/helloworld/main.c,那么BR2_MYCODE_DIR就得设置为/home/tao/workspace。
menu "My Code"
        config BR2_MYCODE_DIR
            string  "My Code Directory"
            default "/home/tao/workspace"
            help
                Must be absolutely path
        source "package/helloworld/Config.in"
endmenu

<ignore_js_op>

为了能够顺利编译helloworld程序,我们还需要在helloworld源码的目录下创建一个Makefile文件:
all: helloworld
helloworld: main.o
        $(CC) -o helloworld main.o
clean:
        rm -rf *.o
        rm -rf helloworld
install:
        $(INSTALL) -D -m 0755 helloworld $(TARGET_DIR)/bin

<ignore_js_op>

完成以上步骤之后,我们就可以开始配置Buildroot编译选项,将Helloworld集成到Linux系统中了。
make menuconfig

<ignore_js_op> 
<ignore_js_op>

进入后,修改My Code Directory为helloworld源码文件夹所在的目录,例如我的是
/home/tao/workspace

<ignore_js_op>

选中helloworld,配置helloworld源码的文件夹名字,默认值就是helloworld

<ignore_js_op>

最后保存退出。

<ignore_js_op>

测试能否顺利编译,执行:
make helloworld
如果没有错误的话,会如图显示:

<ignore_js_op>

最后再执行make,生成最终镜像文件

<ignore_js_op>

三、设置串口连接开发板
首先第一步是通过USB转TTL将智龙与PC连起来

<ignore_js_op>

然后执行
sudo minicom -s

<ignore_js_op>

选择Serial port setup,配置如下:

<ignore_js_op>

完成之后选择Exit即可完成。
四、PMON下烧写Linux内核和根文件系统
启动tftp服务器,进入ls1c_buildroot/output/images目录,将生成的镜像文件复制到tftp服务器的目录下面:

<ignore_js_op>

接下来我们要烧写vmlinux和rootfs。
连接网线,配置网卡地址:
ifconfig eth0 192.168.0.1
配置好之后开发板上电,按空格进入PMON控制台
ifup syn0
ifaddr syn0 192.168.0.2
devcp tftp://192.168.0.1/vmlinux /dev/mtd0
set append "root=/dev/mtdblock1 console=ttyS2,115200 noinitrd init=/linuxrc rw rootfstype=cramfs"

<ignore_js_op>

烧写完毕重启
reboot
五、测试运行Helloworld

<ignore_js_op>

登录输入用户名root,查看一下系统信息:
uname -a
执行一下helloworld,看能否运行

<ignore_js_op>

OK,输出“Hello World”。
最后非常感谢大家能改耐心看完!希望对您有所帮助。

集成到Buildroot中的Helloword程序【转】的更多相关文章

  1. 使用ASP.NET操作IIS7中使用应用程序

    使用ASP.NET操作IIS7中使用应用程序   在最新发布的启明星Portal里,增加了安装程序,下面说一下.NET对IIS7操作.IIS7的操作和IIS5/6有很大的不同,在IIS7里增加了 Mi ...

  2. VS2008中开发智能设备程序的一些总结收藏

    结合前几日开发的<全国大坝基础数据库采集端>中的PDA程序开发过程,对VS2008开发智能设备上的程序做个小总结. 1         程序结构 程序中包括四个部分: 1. 系统配置 这个 ...

  3. Vivado的helloword程序:软件工程部分

    建立工程 Export结束后,会自动启动SDK.界面如下.可以看到工程浏览器Project Explorer中已经有一个硬件平台hw_platform_0,里面有一系列配置和初始化文件.不要修改这些文 ...

  4. Vivado的helloword程序:硬件工程部分

    硬件平台:ZedBoard软件平台:vivado2013.3 本示例通过综合.实现,生成比特流,发送到SDK实现.启动vivado并且创建一个项目根据提示操作一步步创建新项目的时候记得选择RTL Pr ...

  5. JProfiler集成在eclipse中(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sinat_38259539/articl ...

  6. 【笔记】android sdk集成的eclipse中导入项目

    android sdk集成的eclipse中导入项目 想要把旧的ADT项目,一模一样的导入进来,需要: 1.把项目放到,非当前ADT的workspace目录下: 2.从Project中Import,选 ...

  7. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  8. 在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError

    在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError,可以检查一下几项: 环境变量配置: 注意 ...

  9. 如何在windows中编写R程序包(转载)

    网上有不少R包的编译过程介绍,挑选了一篇比较详细的,做了稍许修改后转载至此,与大家分享 如何在windows中编写R程序包 created by helixcn modified by binaryf ...

随机推荐

  1. Java 关于循环的练习--和为n的正数序列

    要求:输入一个正数n,输出所有和为n的连续正数序列. 分析可以从1开始连续加,若到i的和等于n则输出1到i之间的连续正数,若到i的和大于n,则改为从2开始连续加,再判断到i的和是否等于n,等于则输出2 ...

  2. FZU-1881-Problem 1881 三角形问题,打表二分查找~~

    B - 三角形问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descripti ...

  3. Lucene、Compass学习以及与SSH的整合

    一.准备 个人在学习中采用Struts2 + Hibernate3.2 + Spring2.5 + Compass2.2.0, 一下图片为本次学习中用到的jar包: 图中圈出的jar包为本次学习的主要 ...

  4. 下载整个网页的方法,包括样式、图片、和js

    扒别人网站,不一定是要干邪恶的事(当然也有干的).有时候我们看到别人网站的功能很酷,想要自己试着实现一下.我们就需要扒一下这个页面,一方面可以线下修改学习,另一方面不会浪费时间在设计页面上,可以更关心 ...

  5. ajax请求数据之后在已经有的数据前面打对勾的方法

    今天遇到这么一个需求: 选择一部分人,在点击确定的时候添加到对应的div中,也就是添加到对应的表单下面,当再次查询的时候需要在已经选过的人的复选框前面打伤对勾.

  6. msp430项目编程32

    msp430中项目---电阻测量系统32                  Ad 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  7. hdu 1496 hash

    hash?判重,是否一样?相等?等式!没有想到,这次题做玩后,学到了HASH这一功能!当数据量在数组允许大小范围内时候即可!判断等式俩边是否相等,从而获得解的个数!从复杂度,n*m*k****,降到 ...

  8. POJ 3159 【朴素的差分约束】

    好吧终于知道什么是“高大上”的差分约束了.嗷嗷 题意: 小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上. 求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果. 思路: 差 ...

  9. 【OPPO主题制作系列 - 01】-- 写个小工具自动打包Theme文件

    参考OPPO主题设计师站: http://dev.theme.oppomobile.com/user/user_start 想要打包成Theme文件,必须把需要打包的文件夹拖到oppo-themepa ...

  10. intelliJ IDEA工具快捷键

    F9            resume programe 恢复程序 Alt+F10        show execution point 显示执行断点 F8            Step Ove ...