新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2015-9-17
- 在线时间
- 0 小时
|

楼主 |
发表于 2015-9-25 11:58:29
|
显示全部楼层
回复【14楼】lxing_1988:
---------------------------------
我的模板并没有使用gnu提供的标准库,因为涉及到c运行时库对cm3的移植确实很麻烦,所以我的模板直接使用我自己定义的一个c运行时库,而对于CTL中的printf实现起来也很简单,如果使用官方库,你需要重定义fputc函数,原子提供的就可以
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
因为printf是要调用fputc函数实现的。不过事实并没有那么简单,你会发现链接过程还会出现一堆未定义函数的问题,实际上,这些问题都是使用官方库造成的,你可以根据缺失的函数相应的定义出一个个空函数体,不过不可确定因素比较多。
另一种方法,也是我推荐的:如果你只用到printf,或用到很少的标准库函数,那么干脆不要使用官方提供的标准库,而是自己定义一个接受不定长参数的printf.具体方法网上文章不少
编译器参数 有几个必加的
-mcpu=cortex-m3
-mthumb
-mlittle-endian
分别是cpu选择,指令集选择,小端选择(低字节在前,高字节在后)
这个是我工程模板中的一个例子
arm-none-eabi-gcc -mcpu=cortex-m3 -march=armv7-m -mthumb -mlittle-endian -O0 -fmessage-length=0 -fsigned-char -fno-builtin -Wall -g3 -gdwarf-2 -DSTM32F10X_HD -DVECT_TAB_RAM -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -DDEBUG -I"../include" -std=gnu11 -Wa,-adhlns="src/HARDWARE/RS485/rs485.o.lst" -MMD -MP -MF"src/HARDWARE/RS485/rs485.d" -MT"src/HARDWARE/RS485/rs485.d" -c -o "src/HARDWARE/RS485/rs485.o" "../src/HARDWARE/RS485/rs485.c"
比较长,不过元素不是很多,
其中-Dxxxx是定义宏,
-MT -MF是文件依赖性相关
-g3 -gdwarf-2 是调试信息相关的
-Wa,-adhlns= 是往汇编器传送编译选项-adhlns=...
就这些东西
你可以使用我的模板,模板中根据设置自动生成makefile文件,使用jlink调试很方便 |
|