用Vs2013+VELT进行Hi3516开发:编译Linux内核

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

1.1    什么是VELT

VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.1,仅支持vs2013,是一个刚刚启动开发不久的插件。可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8322193),安装过程参见《用Vs2013+VELT-0.1.0进行Linux开发:环境搭建》。下面是它的基本功能:

  1. 支持x86 Linux,hi3516,hi3520三个平台。
  2. 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
  3. 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
  4. 完成LINUX内核的配置。
  5. 不使用Makefile进行Linux应用程序的编译。
  6. 使用SSH连接目标机器并用gdb进行应用程序的调试。
  7. 使用Telnet连接目标机器并用gdb进行应用程序的调试。

VELT的发布文件中并不包含Linux的示例工程,也不包含Hi3516相关的工程,本文尝试让其支持Hi3516Linux内核的编译,我们之前已经创建了UBoot工程,直接在此基础上修改。


1.2    文件组织

把Hi3516Uboot工程改名为HI3516Kernel并和linux内核代码放在同级目录下:

此工程文件在windows下的访问路径为Z:\projects\test\hi3516,对应的Linux路径为:

/work/projects/test/hi3516

1.3    参数配置

接着在项目属性中修改项目类型和源码根目录:

编译主机的参数和编译器参数不做修改,与uboot项目相同。

1.4    修改make.py

接下来修改make.py,定义编译时要执行的操作。

第一个操作是Build

    def Build(self, chan) :
        self.error = False
        exec_command(chan,
                     "cd /work/projects/test/hi3516/linux-2.6.35/ && "
                     "cp linux.config .config && "
                     "make arch=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- uImage && "
                     "echo xxxxx\n")
        return not self.error;

当我们在VS中选择“生成项目“的时候,VELT将执行此python脚本,在这里可以定义要执行的bash脚本。exec_command是预先定义的一个python函数,用以执行一段bash脚本。

接下来是Rebuild,在VS中进行重新生成操作时将调用此脚本:

    def Rebuild(self, chan) :
        self.error = False
        exec_command(chan,
                     "cd /work/projects/test/hi3516/linux-2.6.35/ && "
                     "cp linux.config .config && "
                     "make arch=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- clean  && "
                     "make arch=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- uImage && "
                     "echo xxxxx\n")
        return not self.error;

第三个是Clean

    def Clean(self, chan) :
        self.error = False
        exec_command(chan,
                     "cd /work/projects/test/hi3516/linux-2.6.35/ && "
                     "make arch=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- clean  && "
                     "echo xxxxx\n")
        return not self.error;

在上述脚本中,务必加上此BASH指令:

"cp linux.config .config && "

因为VELT的内核配置只能生成linux.config文件,而内核的编译是需要.config文件的,因此在make之前需要将linux.config复制为.config。

最后要修改Convert函数,此函数的作用在于将make生成的信息转换为vs可以识别的信息:

    root_path = ‘z:\\projects\\test\\hi3516\\linux-2.6.35\\‘
    def Convert(self, ln) :
        if re.match(".*:[0-9]+: error:", ln):
            lst = ln.split(‘:‘)
            file = lst[0]
            file = self.root_path + file
            file = file.replace("/", "\\")
            ln = file + "(" + lst[1] + "): error C2004: " + lst[3]
            self.error = True
        elif re.match(".*:[0-9]+: warning:", ln):
            lst = ln.split(‘:‘)
            file = lst[0]
            file = self.root_path + file
            file = file.replace("/", "\\")
            ln = file + "(" + lst[1] + "): warning C2005: " + lst[3]
        return ln

1.5    内核配置

在进行内核编译之前,需要进行内核的配置,这个可以通过在Kernel工程的右键菜单上选择EmbedLinux属性进行配置:

配置完成后保存退出。

如果在配置时发现子菜单没有出现,可以按F5刷新。

配置完成后就可以编译了:

1>------ 已启动生成:  项目: HI3516Kernel, 配置: Debug hi3516 ------
1>  BuildCompile Task, Nothing to do
1>  Build Task, prepare to execute
1>  HostIp: 192.168.24.129
1>  Platform: hi3516
1>  Configuration: Debug
1>  Last login: Thu Jan  8 23:13:31 2015 from 192.168.24.128
1>
1>  [[email protected] ~]$ PATH=/work/toolchain/hi3516/1.0.9.0/arm-hisiv100-linux/bin/:$PATH
1>  [[email protected] ~]$ cd /work/projects/test/hi3516/linux-2.6.35/ && cp linux.config .config && make arch=arm CROSS_COMPILE=arm-hisiv100-linux-uclibcgnueabi- uImage && echo xxxxx
1>    HOSTCC  scripts/basic/fixdep
1>    HOSTCC  scripts/basic/docproc
...........
1>    OBJCOPY arch/arm/boot/zImage
1>    Kernel: arch/arm/boot/zImage is ready
1>    UIMAGE  arch/arm/boot/uImage
1>  Image Name:   Linux-2.6.35.7
1>  Created:      Fri Jan  9 00:52:54 2015
1>  Image Type:   ARM Linux Kernel Image (uncompressed)
1>  Data Size:    3318332 Bytes = 3240.56 kB = 3.16 MB
1>  Load Address: 80800000
1>  Entry Point:  80800000
1>    Image arch/arm/boot/uImage is ready
1>  xxxxx
1>  [[email protected] linux-2.6.35]$
1>
1>  *** EOF ***
1>
1>
1>
1>
========== 生成:  成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

1.6    include目录

在此项目中根据需要加上内核的源文件,此时VS2013并不能很好的分析源文件,因此必须加上包含目录:

这里的包含目录配置并不会传递给make程序,仅仅是让VS2013能够正确进行语法分析而已,因此可以自由设置。

为了加快VS的代码分析速度,可以将内核的include目录复制一份到windows本地,并将include路径指向此目录。

1.1    强制包含文件

在内核配置完成后,会在linux-2.6.35\include\generated目录下生成autoconf.h,在此文件中定义了配置信息,为了让VS更好地分析代码,我们强制它包含此文件:

1.8    错误测试

下面测试一下VELT是否可以正确定位错误的位置:

随便找一个函数,让他产生一个语法错误:

显然,这里的63行是有错误的,在VS下生成项目:

1>    CHK     include/generated/compile.h
1>    CC      kernel/exit.o
1>  kernel/exit.c: In function ‘__unhash_process‘:
1>  z:\projects\test\hi3516\linux-2.6.35\kernel\exit.c(63): error C2004:  ‘a‘ undeclared (first use in this function)
1>  z:\projects\test\hi3516\linux-2.6.35\kernel\exit.c(63): error C2004:  (Each undeclared identifier is reported only once
1>  z:\projects\test\hi3516\linux-2.6.35\kernel\exit.c(63): error C2004:  for each function it appears in.)
1>  make[1]: *** [kernel/exit.o] Error 1
1>  make: *** [kernel] Error 2
1>  [[email protected] linux-2.6.35]$
1>
1>  *** EOF ***
1>
1>
1>
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

搞定!

此项目工程可在csdn下载(http://download.csdn.net/detail/lights_joy/8346943),当然,此项目中不包含内核的源码,需要自己获取。

??

时间: 2024-08-07 17:58:02

用Vs2013+VELT进行Hi3516开发:编译Linux内核的相关文章

用Vs2013+VELT进行Hi3516开发:编译UBOOT

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    什么是VELT VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码.目前的版本是0.1.1

Vs2012在Linux开发中的应用(8): 编译Linux内核

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在有了UBOOT的编译基础之后,编译Linux内核就简单多了,所不同的只有两个地方,一个是错误信息的转换,另一个是内核需要进行参数配置. 1.1    错误信息转换 UBOOT的错误信息中,文件名是不带路径的,而内核的错误信息中,文件名是带相对路径的,因此我们对转换脚本略做修改: #user code begin classCUBootMake: error=False defBuild(sel

Ubuntu下载编译Linux内核。

1.安装git工具 2.到官网下载linux内核https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git,这个地址不是很好用 在用下面这个 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git http://vger.kernel.org/vger-lists.html#linux-kernel这个是讨论Linux驱动的邮件组 3.

如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载了什么模块. 所以准备重新编译Linux内核3.19.3,结果运行: make?menuconfig 得到错误提示: ? ? ? ? local_lim.h:38:26: fatal error: linux/limits.h ? 应该是在linux目录下找不到limits.h文件.有诸多兄弟碰到过

学习重新编译Linux内核

一.实验目的学习重新编译Linux内核,理解.掌握Linux内核和发行版本的区别. 二.实验内容在Linux操作系统环境下重新编译内核.实验主要内容:A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36.B. 配置内核.C. 编译内核和模块.D. 配置启动文件.本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36):然后,配置GNU的启动引导工具grub,成功运行编译成功的内核. 三.主要仪器设备(必填)Linux环境:utuntu10

自定义配置编译linux内核

1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如当我们需要用bcache时,但默认bcache是没有编译进内核的,我们可以通过修改编译配置文件,将bcache编译进内核,以下的编译操作均是在Centos7.3平台上进行的演示. 2 编译前准备工作2.1 编译用户身份选择官方是强调编译linux内核是强烈不建议以root身份来进行编译的,因为这样有

VELT-0.1.6开发:在VS2013下用QEMU调试x86 Linux内核

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 VELT的全称是Visual EmbedLinuxTools,它是一个visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visualstudio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译和调试,并根据编译时的错误信息正确定位到源码

实例:编译Linux内核3.18.25概要

前提: 将CentOS 7上3.10.0-229.el7.x86_64重新编译一个3.18.25内核 自编译安装,按照自己的硬件平台架构编译,能最适合硬件主机的性能 且按照需要编译模块,可以选择自己需要的包编译 [[email protected] tmp]# uname  -a 一.编译前准备工作 1.宿主机系统 本次编译宿主机:VMware Workstation Pro12 上的CentOS 7.0操作系统 2.开发环境(开发工具,开发库),头文件 [[email protected] y

编译Linux内核

这篇文章的目的是帮助理解如何编译一版Linux内核.熟悉Kconfig KBuild工具.无论是自己修改自己正在使用linux内核还是做嵌入式的交叉编译,都会有一些帮助. 内核编译体系 如果大家接触过一些Linux下的开源软件,就会知道它们使用 autotools 来进行配置及编译.通过执行./config --> make --> make install 命令来编译源代码.Linux内核的编译也需要先配置再编译.配置使用 Kconfig , 编译使用 KBuild , 这两个工具支撑起了L