U Boot中巨集定義MK STR引發的「血案」

2021-06-22 21:30:00 字數 1776 閱讀 7604

在編譯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

fiif [ "$br_19200" = "y" ]; then

define_int config_baudrate 19200

fiif [ "$br_38400" = "y" ]; then

define_int config_baudrate 38400

fiif [ "$br_57600" = "y" ]; then

define_int config_baudrate 57600

fiif [ "$br_115200" = "y" ]; then

define_int config_baudrate 115200

fiint "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相容,實在是囧啊。

keil mdk 中巨集定義

一般巨集定義只有在包含其定義檔案的檔案中才起作用,但是可以通過新增.opt檔案,在裡面定義對整個工程起作用的巨集。注意事項 1.檔案型別選擇text document file 2.在misc control中新增相應的編譯控制,以test.opt為例,新增 via test.opt 這裡包含有對檔...

巨集定義中的

劉詩慧rubby的日誌 1 stringizing 字串化操作符 作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定 義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is...

巨集定義中的

以這個巨集定義為例 define err exit m do while 0 其中的 是怎麼回事?1 對於有引數的巨集定義,巨集定義時,在巨集名與帶引數的括號之間不應加空格,否則將空格以後的字元都作為替代字串的一部分。2 帶引數的巨集定義只是進行簡單的字元替換,巨集展開則是在編譯前進行的,在展開時並...