|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:# c* @5 Z0 I1 Q. ^: E3 f
+ r! C6 L5 n. a3 J$ \( H/ o! `' a2 F+ z
serial.h:2: warning: conflicting types for built-in function 'putc'5 G! A) S3 v" ?( E* o7 x8 |8 w
, n/ D2 Q$ \0 c
0 G. C0 e5 z1 B/ y' ^7 p- w, u/ g
什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
+ s! `6 |2 X7 m1 N# T3 c( I/ k, u& i7 M8 \
就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。# J# D& D0 C: m: o; N$ N1 K
( l5 `# j+ [) G6 L9 \ 在UART实验里,我们用到一个函数,叫putc的函数,如下:( m: u0 r- Z. L3 u3 m( r0 l
# h! I- P' d7 `' |* v! E- i
/** Z! u9 M' j+ D0 t
* 发送一个字符
# {) H U: R# r+ ~& u) h0 B */
6 `" e3 ^& R$ f$ b& l' {; |, v0 x# {void putc(unsigned char c)
4 l: M4 G+ E7 t$ J{9 G6 G) t5 [% X! Z8 m
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */* d) |+ @. v3 |
while (!(UTRSTAT0 & TXD0READY));& q0 q$ B4 |! M: k }( Z
. a! v$ K' W9 b7 W! D4 g /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
3 w0 e. k5 T# T" H) A4 s3 ~ UTXH0 = c;) Z9 H R! V i1 ]- Q$ g
}
! L5 w! }$ K3 N/ ^% ~
0 S2 L7 ]: l1 x/ [3 |' z# n& H6 W" |% b
+ X5 D/ y# J* ~ R6 O" A% Qputc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。
/ W6 n5 B" U/ M: F& y. v+ p1 V
* [2 j$ M9 {/ b+ J. H" S 该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin 就可以正常编译了。
, x7 V7 t; \' r% i6 _$ Z1 O! c7 T9 f% L0 d6 q* K+ O
本UART实验的Makefile修改成如下,即可正常编译:
9 e0 u9 P1 q3 E2 E4 c$ `) b Y8 a
- g3 c# _9 V% c* P1 _
9 k# f6 x5 }# Z0 j/ A) b1 _) J9 ]* K/ f( S
objs := head.o init.o serial.o main.o2 e l$ v4 x, p2 c& z. E% E
' k2 G1 t5 I5 q6 `) cuart.bin: $(objs)
6 X: a; g& K- m9 m* x ARM-linux-ld -Tuart.lds -o uart_elf $^
& \; D6 J; q8 _, Q$ N arm-linux-objcopy -O binary -S uart_elf $@
. v2 C7 g+ c7 m2 Q* E$ c arm-linux-objdump -D -m arm uart_elf > uart.dis
m$ W S$ P6 T! t4 S1 j0 T1 O9 I6 G# }! u
%.o:%.c1 g# q* B! o ?2 v: b
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $< //红色为另外添加的信息, \: N3 M8 `) `+ b2 j& `6 B
) Z9 A" a7 k0 P
%.o:%.S
% h' C7 G6 F* |% |/ ]! k arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $<
/ G! Z* L4 ?( X+ h! D0 J9 w) O* }6 [+ v4 T
clean:4 K9 `3 T0 W7 S0 @' N4 V
rm -f uart.bin uart_elf uart.dis *.o
3 ], Q' W9 k. c6 ]2 b
6 z( H) T( u1 H
; `" ]/ n7 ]) u" G
* h) q4 E& s, b4 p) H0 } F-nostdlib' ~8 Y5 v0 U7 { p, i3 L, w3 K p
( j5 Q7 O. ^5 @8 v( _# { 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
; D( S3 Z0 f% \
- c2 x8 ?3 X4 N常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。2 P" F9 j2 ]& w. J' K4 J
, `4 q9 }# q/ U7 Q5 g5 k
8 E. k! ?$ L$ q0 @% t
: ], t1 H1 Z5 f5 |, H4 e9 u2 F
|
|