那些免费好用的STM32的IDE二之Eclipse+GNU+Jlink(高级篇)

2019-07-21 03:22发布

相关连接:那些免费好用的STM32的IDE一之Emblock
http://www.openedv.com/forum.php ... mp;page=1#pid496542

那些免费好用的STM32的IDE二之Eclipse+GNU+Jlink(基础篇)
http://www.openedv.com/forum.php ... mp;page=1#pid505930


本篇开始解决一些大问题
一、问题概况
通过初级篇的学习,我们知道了一个Eclipse工程的配置以及调试,貌似使用也没什么问题,然而。当我们抛弃掉Eclipse自带的工程模版是,也抛弃的他的一些其他的功能,比如c库函数的支持。所以,如果我们按照这初级篇的内容建立一个工程,我们会发现,当我们使用了printf等C库的函数时,工程编译会报错。这是没有加入printf是的编译情况,没有任何错误 图片1.png 而这个图就是加上了printf后编译的情况,当然stdio.h还是要加上去的, 图片2.png 可以看到,只要加上了printf后编译就会出问题。二、问题分析为了解决这个问题,我们先探索一下这个问题产生的原因。众所周知,printf调用的是标准的C库函数,那么我们搭建的GNU环境是否有C库呢?通过查阅GNU ARM ToolChain官网,我们可以知道,gun工具链支持C库,默认的是newlib库。那么,什么是newlib?摘录一段百度百科的介绍,当然这段介绍是对newlib引文手册的一段翻译,英文可以的同学可以看看英文的。 图片3.png 既然我们搭建的环境中存在了C支持库,那么为什么还会编译错误呢?我们接着看。 图片4.png 什么意思?就是说我们的newlib是存在了,但是newlib的20个桩函数还没有实现,即只是存在newlib,但是还没有移植。为什么gnu不帮我们移植好呢?正如上面介绍的那样,这20个桩函数是与运行的平台息息相关的,也就是说,如果我用的是51,可能这些函数是一种实现方式,如果我用的STM32,可能是另外一种形式(举个例子而已,并不准确)。所以我们现在的工作就是要把newlib没有完成的工作完成就可以了,即实现20个桩函数。难道真的要我们自己写吗?不会写啊!不用担心,如果真的要我们自己写,那么这个教程的实用性就太低了。我之前说过,当我们抛弃了eclipse自带的模版是,也抛弃了自带模版中的其他的一些东西,比如移植好的newlib,既然在自带的模版中已经有移植好的newlib,我们直接把它提取出来就是了。思路就是这样的。三、问题解决如果你们曾经用eclipse自带的模版建立过stm32的工程的话,你应该可以在这个工程中找到一个叫做newlib的文件夹。 图片5.png 我们把这个文件夹拷贝到我们初级篇建立的工程中 图片6.png 首先别急着编译,我们先看一看这个文件夹中的内容。 图片7.png _startup.c这个文件是自带的启动文件,我们不需要,删除或者屏蔽都行,然后编译看看 图片8.png 提示一些关于track的错误,因为我们没用使用track,所以把newlib中所有文件爱你的track相关的东西都屏蔽掉,知道不会提示track相关的错误为止 图片9.png 同时我们还要把_exit.c中的复位函数改掉 图片10.png 因为不使用__reset_hardware(),所以屏蔽掉它的声明 图片11.png 重新编译会发现这样的错误 图片12.png ,为什么会有这样的错误,是因为newlib中的文件会引用链接文件中的_Heap_Begin和_Heap_Limit,然而我们没有使用自带的模版所以没有使用自带的链接文件,而是使用了st库中的链接文件,而该链接文件又没有定义这两个变量,所以报错了,额不知道我这么说你们能否理解 图片13.png 大致就是这个示意图所以解决方法就是我们在st的ld文件中定义这两个变量就行了 图片14.png 然后编译,你就会惊奇的发现没有错误了 图片15.png 然后就是调试了,也没问题,就不截图了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。