日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uboot将命令结构体单独存放在某个代码段的方法

發布時間:2023/12/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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将命令结构体单独存放在某个代码段的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。