Eclipse搭建stm32+jlink开发环境全攻略
高级篇
一、问题概况
通过初级篇的学习,我们知道了一个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个桩函数。
难道真的要我们自己写吗?不会写啊!不用担心,如果真的要我们自己写,那么这个教程的实用性就太低了。
通过上面的教程我们可以知道,我们的文件都是通过st官方中的TrueSTUDIO编译器的文件提取过来的,但是遗憾的是标准库中对TrueSTUDIO没有一个完整的范例,所以有一些文件其实是缺失的。而且标准库也很久没有更新了,但是st官方还有一个hal库,这个库是标准库的升级版,我们可以从hal库中得到我们想要的东西。
下载官方stm32f1的hal库,全文件夹下搜索一下syscalls,我们就可以搜到我们想要的syscalls.c文件,比如在STM32Cube_FW_F1_V1.4.0\Projects\STM32F103RB-Nucleo\Examples\UART\UART_Printf\TrueSTUDIO文件夹下就有一个syscalls.c,打开这个文件