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

快乐虾

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

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


1.1    什么是VELT


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


  1. 支持x86 Linuxhi3516hi3520三个平台。

  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>  [embed@localhost ~]$ PATH=/work/toolchain/hi3516/1.0.9.0/arm-hisiv100-linux/bin/:$PATH
1>  [embed@localhost ~]$ 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>  [embed@localhost 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>  [embed@localhost linux-2.6.35]$ 
1>  
1>  *** EOF ***
1>  
1>  
1>  
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

搞定!


 


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









??

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。