U-Boot中宏定義MK_STR引發的“血案”

    在編譯uboot的過程中,經常需要針對不同版本,修改波特率等相關參數。爲了讓這個過程更加輕鬆和簡單(不用每次手工修改源碼),於是將這些參數定義到menuconfig中,沒想到就是這個小小的動作,竟然導致了一個奇怪的問題:編譯後的uboot無法啓動!這是怎麼一回事呢?各位看官別急,且聽我慢慢道來吐舌頭

    由於CONFIG_BAUDRATE等一系列參數需要經常修改,於是將其定義到menuconfig中,實際需要修改的是config.in文件:

##### manfeel, env define #####
comment "=== Manfeel defined === ---"
choice 'Config baud rate' "9600 BR_9600 \
                        19200 BR_19200 \
                        38400 BR_38400 \
                        57600 BR_57600 \
                        115200 BR_115200 \
                        " 57600
if [ "$BR_9600" = "y" ]; then
define_int	CONFIG_BAUDRATE	9600
fi
if [ "$BR_19200" = "y" ]; then
define_int	CONFIG_BAUDRATE	19200
fi
if [ "$BR_38400" = "y" ]; then
define_int	CONFIG_BAUDRATE	38400
fi
if [ "$BR_57600" = "y" ]; then
define_int	CONFIG_BAUDRATE	57600
fi
if [ "$BR_115200" = "y" ]; then
define_int	CONFIG_BAUDRATE	115200
fi

int "Boot delay" CONFIG_BOOTDELAY 2
string "Config server IP" CONFIG_SERVERIP 192.168.1.100
string "Config our IP" CONFIG_IPADDR 192.168.1.1

bool "Auto boot from USB disk" CONFIG_AUTO_USB_BOOT
bool "Boot backup kernel for recovery" CONFIG_BOOT_BACKUP_KERNEL
if [ "$CONFIG_BOOT_BACKUP_KERNEL" = "y" ]; then
hex "the size of backup kernel" BACKUP_KERNEL_SIZE 0x100000
fi
###############################

我們知道,make menuconfig後,會自動生成autoconf.h,於是,在原來定義CONFIG_BAUDRATE的rt2880.h文件中,#include了autoconf.h,編譯時一切正常,沒想到燒入flash無法啓動。百思不得其解,後來經過反覆的註釋裏面相關的定義,終於發現了一個驚天祕密!原來,是MK_STR的宏定義問題!

在menuconfig中,專門針對int、hex、string做出了不同的處理,如int在定義時,會用()包圍整數,hex會加上0x前綴,string會用“”包圍。

而正是這個細心周到的定義,竟然和MT_STR衝突了!MK_STR的做法太過於粗暴,直接將#define定義的內容,強行用“”包圍,結果導致了今天的“血案”。


思考了一下,決定在Menuconfig的腳本里面,加上raw這樣一種“類型”,用以和MK_STR兼容,實在是囧啊。

發佈了59 篇原創文章 · 獲贊 12 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章