快乐虾
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开发:环境搭建》。下面是它的基本功能:
- 支持x86 Linux,hi3516,hi3520三个平台。
- 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 完成LINUX内核的配置。
- 不使用Makefile进行Linux应用程序的编译。
- 使用SSH连接目标机器并用gdb进行应用程序的调试。
- 使用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),当然,此项目中不包含内核的源码,需要自己获取。
??