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