uboot将命令结构体单独存放在某个代码段的方法
生活随笔
收集整理的這篇文章主要介紹了
uboot将命令结构体单独存放在某个代码段的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。
1、鏈接腳本里有如下代碼片段。
2、uboot中將命令結構體單獨存放在某個代碼段,是通過以下兩個宏來實現的。
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd"))) #define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}(1)凡是通過U_BOOT_CMD定義的cmd_tbl_t變量(類似說int類型變量)會全部被放在.u_boot_cmd段當中;
(2)##name、#name
- ##name表示將name直接原樣替代##name;
- #name表示將name以 “name" 的形式替代#name。
- 例如:定義一個命令boot
- 需要寫成U_BOOT_CMD(boot, 0, 0, fun, "boot xxx");
- 展開以后會變成:cmd_tbl_t ?__u_boot_cmd_boot?__attribute___((unused, section(".u_boot_cmd"))) = {"boot", 0, 0, fun, "boot xxx"}
- 可見Struct_Section展開了,還將##name換成了boot, 將#name換成了"boot"。
(3)總結
- 可以在程序運行時定義一個變量,即通過##xxx來定義一個變量,然后通過上面的形式來使用它。
- 通過宏定義來定義變量,并且把這些同一種結構體的變量放在一個段中,充分的利用連接器的作用,確實很實用。
- 這樣開發各個模塊的研發人員不必去維護一個全局的結構體數組,值得推廣。
(4)實例
#if defined(CONFIG_CMD_ECHO)int do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {int i, putnl = 1;for (i = 1; i < argc; i++) {char *p = argv[i], c;if (i > 1)putc(' ');while ((c = *p++) != '\0') {if (c == '\\' && *p == 'c') {putnl = 0;p++;} else {putc(c);}}}if (putnl)putc('\n');return 0; }U_BOOT_CMD(echo, CFG_MAXARGS, 1, do_echo,"echo - echo args to console\n","[args..]\n"" - echo args to console; \\c suppresses newline\n" );//通過宏來定義變量#endif
總結
以上是生活随笔為你收集整理的uboot将命令结构体单独存放在某个代码段的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏设计的100个原理(1-5)
- 下一篇: Platform Invoke and