女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > > 充電吧
[導讀]當我們在控制臺的時候,輸入boot可以啟動Linux內(nèi)核,那么我們以boot為例子來解析一下uboot命令的執(zhí)行過程,為下一步分析uboot怎樣啟動Linux來做準備。 一、我們搜索boot命令

當我們在控制臺的時候,輸入boot可以啟動Linux內(nèi)核,那么我們以boot為例子來解析一下uboot命令的執(zhí)行過程,為下一步分析uboot怎樣啟動Linux來做準備。 一、我們搜索boot命令

grep -wnR "boot" common
得到:common/cmd_bootm.c:1162: boot, 1, 1, do_bootd,

打開common/cmd_bootm.c 文件
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int rcode = 0;
#ifndef CFG_HUSH_PARSER
    if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;
#else
    if (parse_string_outer(getenv("bootcmd"),
        FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;
#endif
    return rcode;
}

U_BOOT_CMD(
    boot,   1,  1,  do_bootd,
    "boot    - boot default, i.e., run 'bootcmd'n",
    NULL
);
其中U_BOOT_CMD命令格式如下:

U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")

 各個參數(shù)的意義如下:

   name:命令名,非字符串,但在U_BOOT_CMD中用“#”符號轉化為字符串
   maxargs:命令的最大參數(shù)個數(shù)
   repeatable:是否自動重復(按Enter鍵是否會重復執(zhí)行)
   command:該命令對應的響應函數(shù)指針
   usage:簡短的使用說明(字符串)
   help:較詳細的使用說明(字符串)
二、U_BOOT_CMD宏分析 ① 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;       /* 最大參數(shù)個數(shù) */
       int          repeatable;    /* 是否自動重復 */
       int          (*cmd)(struct cmd_tbl_s *, int, int, char *[]);  /*  響應函數(shù) */
       char       *usage;         /* 簡短的幫助信息 */
#ifdef    CONFIG_SYS_LONGHELP
       char              *help;           /*  較詳細的幫助信息 */
#endif
#ifdef CONFIG_AUTO_COMPLETE
       /* 自動補全參數(shù) */
       int          (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};

typedef struct cmd_tbl_s  cmd_tbl_t;
extern cmd_tbl_t  __u_boot_cmd_start;
extern cmd_tbl_t  __u_boot_cmd_end;

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

③ 其中Struct_Section在include/command.h中定義如下:
 #define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))

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

在u-Boot連接腳本boardsmdk2410u-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”聲明的函數(shù)或變量將存儲在“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之間查找就可以了。 三、boot命令宏展開 因此“boot”命令的定義經(jīng)過宏展開后如下:

    cmd_tbl_t __u_boot_cmd_boot __attribute__ ((unused,section (".u_boot_cmd"))) = {boot, 1, 1, do_bootd, "boot    - boot default, i.e., run 'bootcmd'n", " NULL"}
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int rcode = 0;
#ifndef CFG_HUSH_PARSER
    if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;
#else
    if (parse_string_outer(getenv("bootcmd"),
        FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;
#endif
    return rcode;
}
四、run_command分析 u-boot啟動第二階段最后跳到main_loop函數(shù)中循環(huán),
        s = getenv ("bootcmd");
    if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
        ......
        run_command (s, 0);
        ......
        }
從main_loop中我們知道,如果bootdelay時間內(nèi)未按下按鍵則啟動Linux內(nèi)核,按下按鍵則進入uboot命令行等待用戶輸入命令。 用戶輸入命令則調(diào)取run_command函數(shù),在該函數(shù)中有下面幾個比較重要的點: 1. 從注釋我們很容易知道這段代碼是在對命令進行分離,并且u-boot支持’;’分離命令。
        /*
         * Find separator, or string end
         * Allow simple escape of ';' by writing ";"
         */
        for (inquotes = 0, sep = str; *sep; sep++) {
            if ((*sep==''') &&
                (*(sep-1) != '\'))
                inquotes=!inquotes;

            if (!inquotes &&
                (*sep == ';') &&    /* separator        */
                ( sep != str) &&    /* past string start    */
                (*(sep-1) != '\')) /* and NOT escaped  */
                break;
        }
2. 分離參數(shù)
        /* Extract arguments */
        if ((argc = parse_line (finaltoken, argv)) == 0) {
            rc = -1;    /* no command at all */
            continue;
        }
3. 用第一個參數(shù)argv[0]在命令列表中尋找對應的命令,并返回一個cmd_tbl_t類型的實例。我們可以猜到這個結構體應該保函了有關命令的一系列內(nèi)容。
        /* Look up command in command table */
        if ((cmdtp = find_cmd(argv[0])) == NULL) {
            printf ("Unknown command '%s' - try 'help'n", argv[0]);
            rc = -1;    /* give up after bad command */
            continue;
        }
在common/command.c 中查看find_cmd函數(shù)
/*__u_boot_cmd_start與__u_boot_cmd_end間查找命令,并返回cmdtp->name命令的cmd_tbl_t結構。*/
cmd_tbl_t *cmdtp;
    cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start;    /*Init value */
    const char *p;
    int len;
    int n_found = 0;

    /*
     * Some commands allow length modifiers (like "cp.b");
     * compare command name only until first dot.
     */
    len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd);

    for (cmdtp = &__u_boot_cmd_start;
         cmdtp != &__u_boot_cmd_end;
         cmdtp++) {
        if (strncmp (cmd, cmdtp->name, len) == 0) {
            if (len == strlen (cmdtp->name))
                return cmdtp;   /* full match */

            cmdtp_temp = cmdtp; /* abbreviated command ? */
            n_found++;
        }
    }
五、總結命令執(zhí)行過程 ① 在u-boot控制臺中輸入“boot”命令執(zhí)行時,u-boot控制臺接收輸入的字符串“boot”,傳遞給run_command函數(shù)。 ② run_command函數(shù)調(diào)用common/command.c中實現(xiàn)的find_cmd函數(shù)在__u_boot_cmd_start與__u_boot_cmd_end間查找命令,并返回boot命令的cmd_tbl_t結構。 ③ 然后run_command函數(shù)使用返回的cmd_tbl_t結構中的函數(shù)指針調(diào)用boot命令的響應函數(shù)do_bootd,從而完成了命令的執(zhí)行。 六、自制u-boot命令

① 首先我們在u-boot的common目錄下增加一個cmd_czg.c文件 。 復制cmd_bootm.c中的頭文件到cmd_czg.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
②、③定義命令和操作函數(shù)
#include 
#include 
#include 
#include 
#include 
#include 
#include 
int do_czg (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
        int i;
        for(i=0;i
④ 修改common下面的makefile文件,

參考Makefile中其他文件的定義,加入一句

COBJS += cmd_czg.o
⑤ 清除配置編譯u-boot并燒錄
make distclean
make 100ask24x0_config
make

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉