|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在编译《嵌入式Linux应用开发完全手册》的UART实验时候,出现一个以下警告:
3 d, R3 S9 m1 O# S
6 n2 `8 w3 g/ v( l) T( dserial.h:2: warning: conflicting types for built-in function 'putc'
3 n# \) ~9 p. T# Q& v& Q
8 X- S0 L* X& p: e8 w' p$ A3 [0 M7 Z6 s4 c* O9 ^$ B3 j
- {4 E" c: a# ~ 什么意思呢?首先什么叫built-in function,查阅《C Primer Plus》发现这个叫做内建函数,printf,strchr,memset等等这些函数就是内建函数,这类函数不需要包含头文件中的声明,
; j* g5 y( g, P5 W: [1 `5 i
& W+ e0 w5 h$ p x3 Y! u0 s就可以编译链接该函数,当你想自己实现一个函数叫printf函数的时候,就会出现冲突的警告。" x5 U+ F: z& S2 p; U: }
$ u* u N9 U l, x/ y& q' T 在UART实验里,我们用到一个函数,叫putc的函数,如下: _0 f. C ~* w+ L* L8 {" p4 K
0 G5 g, D- v# O2 }+ ^; s/*
, n- ^$ u/ q2 @5 n' v; z) q2 t * 发送一个字符; e. z, {5 ? b5 O- m
*/
5 s5 M7 V" ?) B. Dvoid putc(unsigned char c)
/ A6 j) o' e/ i( V Z6 J0 P{
5 s b8 y/ w" D+ \5 M3 }8 l /* 等待,直到发送缓冲区中的数据已经全部发送出去 */: R: ~4 m9 M Q( h8 v6 g
while (!(UTRSTAT0 & TXD0READY));4 A* M& z5 k, @$ U, l* a- @" e! ?# i
- a4 k( m# X$ A4 O$ V4 f
/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
+ Q9 W5 U- ~9 K7 x8 P. x UTXH0 = c;4 j* |4 H0 A( e9 O
}' _1 K c- c l5 W, ^2 B( `
0 S. S$ l8 w4 z1 Y
# {* _: g6 o9 `; v8 [
6 A- `+ P( k, c1 H% Jputc其实也是属于built-in function,当我们自己想实现这个putc函数的时候就会发生冲突。
7 G9 {2 T$ |) i' P& O
; S' n: |2 c$ ]. { 该怎么解决呢?其实很简单,就是在你编译的时候加上 -fno-builtin 就可以正常编译了。% Z0 b }# [- F
2 ~, W) u6 r, m g3 K1 L本UART实验的Makefile修改成如下,即可正常编译: R8 A2 \. Q$ W" J
/ S1 N4 L1 `8 m) s9 q [; r5 c- z$ a4 }4 _8 j
# B' }* h- a2 Q5 Tobjs := head.o init.o serial.o main.o) ^% F5 `6 q( a' G8 z4 z
: m6 ~5 q5 m8 ^% muart.bin: $(objs), W; p: M: @+ A7 i v8 H
ARM-linux-ld -Tuart.lds -o uart_elf $^
$ ~6 i: m Y3 [6 k# ~: ` arm-linux-objcopy -O binary -S uart_elf $@* g# h2 h# `7 G* K* q3 N
arm-linux-objdump -D -m arm uart_elf > uart.dis
3 ]. C- u B4 k' G8 C. ?
% M8 A7 u0 Q5 X3 J: e! x%.o:%.c
- g" y. x7 ]: _! u arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $< //红色为另外添加的信息
; L1 R- O! R, u/ {! w0 H/ }1 b% I3 f7 |& d( j
%.o:%.S) Q, p! V. I8 r1 X6 o2 c+ N; F
arm-linux-gcc -Wall -O2 -nostdlib -fno-builtin -c -o $@ $< m. T; P, a- ]+ S& F5 u' y! T' r
" f) O5 L: p! z: j& V
clean:
# D. o- ~! q$ S% y8 i8 _" Z rm -f uart.bin uart_elf uart.dis *.o
) H7 h2 S- X4 w6 L3 d+ F0 j: e2 W5 X* R' H- }' Z' U+ V8 J( t
, v; U3 R# z( N; Y# K9 Q: i( Q* m1 C- @( w, o6 V- `2 s0 v% m
-nostdlib9 y; n( U& M( Z1 P2 n- _6 w
9 ?9 B \, a) O$ D( H
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项
2 ?3 ?+ D6 T3 s) U/ T" T' k( r
5 ^! a H0 ]4 {常用语编译内核、bootloader 等程序,它们不需要启动文件标准库文件。
( p% E3 I: v4 @
! t0 n, n1 X3 o2 J$ T% `# B! i( S; `: L- A, q7 b- [" r
" ~! }. Z! n- \/ Z0 _# \# H |
|