娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

U-Boot添加menu命令的方法及U-Boot命令執行過程

發布者:yuehui最新更新時間:2024-08-30 來源: cnblogs關鍵字:U-Boot  U-Boot命令  執行過程 手機看文章 掃描二維碼
隨時隨地手機看文章

下面以添加menu命令(啟動菜單)為例講解U-Boot添加命令的方法。

(1)    建立common/cmd_menu.c

    習慣上通用命令源代碼放在common目錄下,與開發板專有命令源代碼則放在board/目錄下,并且習慣以“cmd_<命令名>.c”為文件名。

(2)    定義“menu”命令

    在cmd_menu.c中使用如下的代碼定義“menu”命令:

_BOOT_CMD(

    menu,   3,  0,  do_menu,

    'menu - display a menu, to select the items to do somethingn',

    ' - display a menu, to select the items to do something'

);

    其中U_BOOT_CMD命令格式如下:

U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)

    各個參數的意義如下:

name:命令名,非字符串,但在U_BOOT_CMD中用“#”符號轉化為字符串

maxargs:命令的最大參數個數

rep:是否自動重復(按Enter鍵是否會重復執行)

cmd:該命令對應的響應函數

usage:簡短的使用說明(字符串)

help:較詳細的使用說明(字符串)

    在內存中保存命令的help字段會占用一定的內存,通過配置U-Boot可以選擇是否保存help字段。若在include/configs/mini2440.h中定義了CONFIG_SYS_LONGHELP宏,則在U-Boot中使用help命令查看某個命令的幫助信息時將顯示usage和help字段的內容,否則就只顯示usage字段的內容。

    U_BOOT_CMD宏在include/command.h中定義:

#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}

    “##”與“#”都是預編譯操作符,“##”有字符串連接的功能,“#”表示后面緊接著的是一個字符串。

    其中的cmd_tbl_t在include/command.h中定義如下:

struct cmd_tbl_s {

    char        *name;      /* 命令名 , 他不是一個字符串,不需要用雙引號括起來*/

    int     maxargs;    /* 最大參數個數 */

    int     repeatable; /* 是否自動重復 */

    int     (*cmd)(struct cmd_tbl_s *, int, int, char *[]);  /*  響應函數 */

    char        *usage;     /* 簡短的幫助信息 */

#ifdef  CONFIG_SYS_LONGHELP

    char        *help;      /*  較詳細的幫助信息 */

#endif

#ifdef CONFIG_AUTO_COMPLETE

    /* 自動補全參數 */

    int     (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);

#endif

};

typedef struct cmd_tbl_s    cmd_tbl_t;

    一個cmd_tbl_t結構體變量包含了調用一條命令的所需要的信息。

    其中Struct_Section在include/command.h中定義如下:

#define Struct_Section  __attribute__ ((unused,section ('.u_boot_cmd')))

    凡是帶有__attribute__ ((unused,section ('.u_boot_cmd'))屬性聲明的變量都將被存放在'.u_boot_cmd'段中,并且即使該變量沒有在代碼中顯式的使用編譯器也不產生警告信息。

    在U-Boot連接腳本u-boot.lds中定義了'.u_boot_cmd'段:

    . = .;

    __u_boot_cmd_start = .;     /*將 __u_boot_cmd_start指定為當前地址 */

    .u_boot_cmd : { *(.u_boot_cmd) }

    __u_boot_cmd_end = .;       /*  將__u_boot_cmd_end指定為當前地址  */

    這表明帶有“.u_boot_cmd”聲明的函數或變量將存儲在“u_boot_cmd”段。這樣只要將U-Boot所有命令對應的cmd_tbl_t變量加上“.u_boot_cmd”聲明,編譯器就會自動將其放在“u_boot_cmd”段,查找cmd_tbl_t變量時只要在__u_boot_cmd_start與__u_boot_cmd_end之間查找就可以了。

    因此“menu”命令的定義經過宏展開后如下:

cmd_tbl_t __u_boot_cmd_menu __attribute__ ((unused,section ('.u_boot_cmd'))) = {menu, 3, 0, do_menu, 'menu - display a menu, to select the items to do somethingn', ' - display a menu, to select the items to do something'}

    實質上就是用U_BOOT_CMD宏定義的信息構造了一個cmd_tbl_t類型的結構體。編譯器將該結構體放在“u_boot_cmd”段,執行命令時就可以在“u_boot_cmd”段查找到對應的cmd_tbl_t類型結構體。

(3)    實現命令的函數

    在cmd_menu.c中添加“menu”命令的響應函數的實現。具體的實現代碼略:

int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

    /* 實現代碼略 */

}

(4)    將common/cmd_menu.c編譯進u-boot.bin

    在common/Makefile中加入如下代碼:

COBJS-$(CONFIG_BOOT_MENU) += cmd_menu.o

    在include/configs/mini2440.h加入如代碼:

#define CONFIG_BOOT_MENU 1

    重新編譯下載U-Boot就可以使用menu命令了

(5)menu命令執行的過程

    在U-Boot中輸入“menu”命令執行時,U-Boot接收輸入的字符串“menu”,傳遞給run_command函數。run_command函數調用common/command.c中實現的find_cmd函數在__u_boot_cmd_start與__u_boot_cmd_end間查找命令,并返回menu命令的cmd_tbl_t結構。然后run_command函數使用返回的cmd_tbl_t結構中的函數指針調用menu命令的響應函數do_menu,從而完成了命令的執行。


關鍵字:U-Boot  U-Boot命令  執行過程 引用地址:U-Boot添加menu命令的方法及U-Boot命令執行過程

上一篇:ARM GCC 內嵌匯編手冊
下一篇:在u-boot中添加命令

推薦閱讀最新更新時間:2025-03-28 11:41

u-boot 編譯
make smdk6410_config make 找到smdk6410_config: 目標unconfig: smdk6410_config: unconfig    @echo ---------------------- @echo $(@)    # 目標 是 smdk6410_config @echo ---------------------- @echo $(MKCONFIG) #/home/km/arm/uboot/uboot/mkconfig 是一個腳本 @echo ---------------------- @echo $(@:_config=) ar
[單片機]
u-boot移植(二)---修改前工作:代碼流程分析1
一、代碼執行總體流程圖 1.1 代碼路徑  U-boot.lds (archarmcpu) vectors.S (archarmlib) start.S (archarmcpuarm920t) lowlevel_init.S (boardsamsungjz2440) crt0.S (archarmlib) relocate.S (archarmlib) Board_init.c (commoninit) Board_f.c (common) Jz2440.h (includeconfigs) Generic-asm-offsets.h (includegenerated) 1.2 啟動代碼流
[單片機]
mini2440 u-boot linux 內核啟動,Mini2440 uboot,kernel,根文件系統搭建
按照mini2440的手冊,我所學到的uboot,kernel以及根文件系統的搭建過程分別如下,具體細節暫時不考慮,只考慮整個編譯燒寫的過程。 首先我們的宿主機一定要有nfs服務器,tftp服務器,具體搭建的過程,可以自己參考 1. mini 2440 編譯uboot過程 下載u-boot-2010.03-embedclub-201111.tar.gz, 1:tar zxf u-boot-2010.03-embedclub-201111.tar.gz 2:cd u-boot-2010.03 3:make disclean #執行清理工作 4:make smdk2440a_config #Makefile的對應項 5:make
[單片機]
04-S3C2440u-boot學習之u-boot分析(1)編譯體驗
U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統引導。 U-Boot從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋中能體現這一點。 程序執行流程: (1)一上電,運行bootloader (2)讀出內核,啟動內核--最主要目的 (3)掛接根文件系統,運行里面應用程序 (1)使用 linux-2.6.22.6_jz2440.patch給linux
[單片機]
04-S3C2440u-boot學習之<font color='red'>u-boot</font>分析(1)編譯體驗
一種在U-BOOT中嵌入千兆網絡功能的方法
引言 U-BOOT是德國DENX小組開發的用于多種 嵌入式 微處理器的引導加載程序,它是系統上電后運行的第一段程序代碼,用于初始化目標板硬件,為嵌入式操作系統提供目標板硬件配置信息,并裝載、引導和運行嵌入式操作系統等。 U—BooT 支持網絡功能,在下載操作系統內核和大的文件系統時,比其它不支持網絡的引導加載程序速度更快、更方便。目前U—BOOT僅支持10M/100M的網絡功能,隨著科學技術發展, 千兆網絡 功能必將大量應用在嵌入式系統中。本文介紹了一種讓U—BOOT支持千兆網絡功能的方法,可以使U—BOOT功能更加強大,使用更加方便。 U—BOOT簡介 U—BOOT的全稱是Universal Boo
[單片機]
一種在<font color='red'>U-BOOT</font>中嵌入千兆網絡功能的方法
u-boot啟動過程分析——基于lpc2210的移植代碼
u-boot是一種普遍用于嵌入式系統中的Bootloader。 Bootloader介紹 Bootloader是進行嵌入式開發必然會接觸的一個概念,它是嵌入式學院 嵌入式工程師職業培訓班 二期課程中嵌入式linux系統開發方面的重要內容。本篇文章主要講解Bootloader的基本概念以及內部原理,這部分內容的掌握將對嵌入式linux系統開發的學習非常有幫助! Bootloader的定義:Bootloader是在操作系統運行之前執行的一小段程序,通過這一小段程序,我們可以初始化硬件設備、建立內存空間的映射表,從而建立適當的系統軟硬件環境,為最終調用操作系統內核做好準備。意思就是說如果我們要想讓一個操作系統在我們的板子上運轉起來
[單片機]
<font color='red'>u-boot</font>啟動<font color='red'>過程</font>分析——基于lpc2210的移植代碼
u-boot.bin生成過程分析
ELF格式“u-boot”文件的生成規則如下,下面對應Makefile的執行過程分別分析各個依賴。 $(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*(__u_boot_cmd_.*)/-u1/p'|sort|uniq`; cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) --start-group $(__LIBS) --end-gro
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 平罗县| 瓮安县| 嘉鱼县| 民乐县| 阿尔山市| 睢宁县| 麻阳| 和平区| 镇平县| 枣庄市| 怀柔区| 宁海县| 鄂州市| 望都县| 信丰县| 南部县| 嘉义县| 牟定县| 新安县| 宁河县| 尖扎县| 晋州市| 沅陵县| 浦城县| 江永县| 襄樊市| 工布江达县| 盈江县| 南宫市| 临猗县| 江北区| 定安县| 东乌| 怀来县| 浦江县| 安仁县| 南江县| 伊宁市| 枣强县| 搜索| 乌兰浩特市|