




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2. 解壓代碼 這個就隨便了,一般解壓在主目錄。 將下載的 mr3420_3220v1.tar.gz 移動到主目錄。 注意:這里壓縮包擴(kuò)展名有誤,實際上是 bzip2 壓縮的。 打開終端,此時終端應(yīng)該默認(rèn)在主目錄下,若不在主目錄下,就運行 cd 命令進(jìn)入主目錄。 運行命令 tar -jxvf mr3420_3220v1.tar.gz 以解壓代碼。tar_jxvf_mr3420_3220v1.png (31.25 KB, 下載次數(shù): 0) 3. 編譯代碼 運行命令 cd mr3420_3220v1/build 進(jìn)入代碼編譯目錄。 運行命令 make BOARD_TYPE=ap99 fs_prep
2、 以創(chuàng)建編譯過程所需的目錄。 運行命令 make BOARD_TYPE=ap99 uboot 以開始編譯 U-Boot。 4. 刷機(jī)測試 如果沒有意外,那么編譯結(jié)束后的輸出應(yīng)該是這樣的: 生成的 u-boot.bin 位于 mr3420_3220v1/images/ap99/ 目錄下。 此文件未被填充到 128K,需要手動填充。 填充后的文件就可以進(jìn)行刷機(jī)測試了。 此文件是未壓縮版,因此本身體積很大。此代碼也不能生成壓縮版的 U-Boot。 5. 說明 操作說明請參閱代碼根目錄下的 readme.txt。入門級的操作就這么簡單。進(jìn)階級: 進(jìn)階級依然使用 TL-MR3420 v1 的代碼。 進(jìn)階
3、級將分離 U-Boot 代碼及現(xiàn)成的工具鏈,搭建基本的交叉編譯環(huán)境。 1. 分離 U-Boot 代碼 U-Boot 代碼位于 mr3420_3220v1/ap99/boot/u-boot 。 將整個 u-boot 目錄復(fù)制到一個地方,如用戶主目錄。 此 u-boot 目錄里的代碼就是全部所需的代碼了。之后的所有操作都在這里面完成。2. 復(fù)制工具鏈 此工具鏈即為編譯器,但是是針對 mips 架構(gòu)的交叉編譯器。 工具鏈位于 mr3420_3220v1/build/gcc-2.16.1/build_mips。 將整個 build_mips 復(fù)制到一個地方,如主目錄。 3. 搭建編譯環(huán)境 現(xiàn)在,mr3
4、420_3220v1 目錄已經(jīng)沒有用,可以刪掉,因為所有需要的文件都已復(fù)制出來了。 設(shè)置環(huán)境變量以讓 Shell 能夠訪問到工具鏈。運行命令 export PATH=$PATH:/build_mips/bin 即可。 此設(shè)置只在當(dāng)前的 Shell 里有效。關(guān)于如何設(shè)置永久的環(huán)境變量,請自行百度。 4. 清理代碼 此操作用于清理上次編譯產(chǎn)生的臨時文件及配置文件,為下次配置及編譯做準(zhǔn)備。 進(jìn)入 u-boot 目錄:運行命令 cd /u-boot 。 運行命令 make distclean 以執(zhí)行完全清理。 5. 編譯代碼 這里是一個完整的編譯步驟。 a. 指定開發(fā)板類型 此操作表示我們要編譯哪個開
5、發(fā)板。AR7241 的開發(fā)板(這里其實叫參考板,reference board)名稱為 ap99,因此運行 make ap99_config 以進(jìn)行配置。 所有的開發(fā)板定義都寫在 Makefile 里。其中以 *_config: 開頭的行,* 就是開發(fā)板名稱。 AR 及 QCA 系列的參考板名稱會在最后列出。 有些開發(fā)板還有額外的參數(shù)可以定義,這里暫不講解。b. 編譯 運行命令 make CROSS_COMPILE=mips-linux- 進(jìn)行編譯。 CROSS_COMPILE=mips-linux- 指定了交叉編譯器的文件名前綴為 mips-linux-。例如,要使用工具鏈中的 gcc 程序
6、,那么就運行 mips-linux-gcc。這個可以看一下 build_mips/bin 目錄下的文件名。 由于之前運行了 export PATH=$PATH:/build_mips/bin 命令,所以 Shell 能夠直接找到相關(guān)程序的位置。否則,CROSS_COMPILE= 需要指定為 /build_mips/bin/mips-linux-。 c. 測試 編譯成功后,u-boot 目錄下會生成 u-boot.bin,這就是未填充到 128K 的文件。 6. 常用編譯命令。 make *_config 配置生成為指定的開發(fā)板(* 為開發(fā)板名稱)。 make CROSS_COMPILE=* 編
7、譯代碼,并指定交叉編譯器文件名前綴為 *。 make clean 清理上次編譯生成的臨時文件。此命令不會刪除開發(fā)板配置,下次編譯可以直接運行 make 命令。 make distclean 清理編譯生成的臨時文件及開發(fā)板配置。運行此命令后,需要再次指定開發(fā)板后才能進(jìn)行編譯。其它說明: 這里使用的 MR3420 v1 代碼不能生成壓縮代碼。其他的,如 AR9331 AR934x 等代碼需要在編譯時加入 COMPRESSED_UBOOT=1 來進(jìn)行編譯,如 make CROSS_COMPILE=mips-linux- COMPRESSED_UBOOT=1 。 編譯 AR934x QCA95xx 的
8、代碼需要指定使用的以太網(wǎng)交換機(jī) PHY 類型,即在編譯時加入 ETH_CONFIG=_s27 或 ETH_CONFIG=_s17 。其中 _s27 為內(nèi)置百兆 PHY,_s17 為外部千兆 PHY。 具體路由型號的 GPL 代碼里都有說明文件,可以根據(jù)說明文件來進(jìn)行編譯,并了解參考板名稱。常見參考板名稱: AR7240 - ap91 AR7241 - ap99 AR9331 - ap121 AR9341 - ap123 AR9342 - mi124 AR9344 - db12x QCA953x - ap143 QCA9558 - ap135 其它的請在 及 上進(jìn)行查找。:UBoot 啟動過程及
9、簡單代碼分析這里以 AR7241 的 U-Boot 為例MIPS 架構(gòu)簡介MIPS 地址空間:這里說的是地址空間,不是內(nèi)存空間。內(nèi)存只是映射在一部分地址空間上而已。內(nèi)存分為4段 (Kuseg、Kseg0、Kseg1、Kseg2),其中 Kseg0 (0x80000000 0x9fffffff) 為緩存段,直接映射在物理地址段上。Kseg1 (0xa0000000 0xbfffffff) 為非緩存段,直接映射在物理地址段上。Kuseg 和 Kseg2 需要經(jīng)過地址轉(zhuǎn)換才能訪問。在 CPU 復(fù)位時,緩存未被初始化,只有 Kseg1 能夠被直接訪問。AR71XX 物理段:內(nèi)存、Flash、IO寄存器
10、等都被映射在物理段上范圍為 00x1fffffff,訪問時需要通過宏 KSEG0ADDR(_addr) 來通過 Kseg0 訪問或 KSEG1ADDR(_addr) 來通過 Kseg1 訪問。物理地址一般不能直接訪問,都需要通過 Kseg0 或 Kseg1 來訪問。主要的映射范圍:DDR:00x0fffffff (這一段直接映射物理內(nèi)存,一般通過帶緩存的 Kseg0 來訪問,以便加快速度)I/O空間:0x10000000 0x1dffffff (這一段直接控制硬件,必須通過 Kseg1 來訪問)SPI Flash 空間:0x1f000000 0x1fffffff (這一段映射閃存的前 16MB
11、 數(shù)據(jù))AR71XX 啟動過程CPU 上電時,物理段中,SPI Flash 的前4MB 被循環(huán)映射在 0x1f000000 上,因此會被重復(fù) 4 次。執(zhí)行地址為 KSEG1ADDR(0x1fc00000),即 0xbfc00000。*注意:U-Boot 在編譯時,實際設(shè)置的基址,即啟動地址為 KSEG0ADDR(0x1f000000),即 0x9f000000。下面會講到為什么要這么設(shè)置。U-Boot 中的起始代碼在 cpu/mips/start.S 中:_start:#ifndef COMPRESSED_UBOOTRVECENT(reset,0) /* U-boot entry point
12、*/RVECENT(reset,1) /* software reboot */RVECENT(romReserved,2)-省略-RVECENT(romReserved,125)RVECENT(romReserved,126)RVECENT(romReserved,127)/* We hope there are no more reserved vectors!* 128 * 8 = 1024 = 0x400* so this is address R_VEC+0x400 = 0xbfc00400*/復(fù)制代碼以上代碼設(shè)置異常向量,不需要理解第一句 RVECENT(reset,0) 為一個跳
13、轉(zhuǎn),直接轉(zhuǎn)到下面的代碼進(jìn)行運行.align 4reset:/* set GPIO_OE- added by lsz to fix the LED issue */li a1, AR7100_GPIO_OElw v1, 0(a1)li v0, 0x3fdffor v1, v1, v0sw v1, 0(a1)lw v0, 0(a1)lw v0, 0(a1)-省略-/* CONFIG0 register */li t0, CONF_CM_UNCACHEDmtc0 t0, CP0_CONFIG復(fù)制代碼以上代碼前半部分通過設(shè)置 GPIO 來點亮路由的 LED。后半部分設(shè)置 CPU 相關(guān)參數(shù),不需要理解以
14、上代碼沒有包含使用相對地址的指令,也就是說,無論這段代碼在 CPU 地址空間的何種位置,都能夠正常執(zhí)行因此雖然 CPU 的執(zhí)行地址為 0xbfc00000,以上代碼依然能執(zhí)行/* Initialize GOT pointer.*/bal 1fnop.word _GLOBAL_OFFSET_TABLE_1:move gp, ralw t1, 0(ra)move gp, t1復(fù)制代碼以上代碼加載了用于 U-Boot 重定位的 GOT 指針,它是 U-Boot 在內(nèi)存中進(jìn)行自身移動的關(guān)鍵la t9, lowlevel_initjalr t9nop復(fù)制代碼以上代碼進(jìn)行 CPU 頻率設(shè)置,超頻就是在這里
15、實現(xiàn)的la t0, rel_startj t0noprel_start:復(fù)制代碼以上代碼很關(guān)鍵,它實現(xiàn)了 U-Boot 的執(zhí)行地址的轉(zhuǎn)移假設(shè)當(dāng)前 CPU 的執(zhí)行地址在 0xbfc00000 + x那么執(zhí)行此段代碼后,CPU 執(zhí)行地址將跳轉(zhuǎn)到 0x9f000000 + x 處進(jìn)行執(zhí)行前面提到了 CPU 在復(fù)位時,物理段 0x1f000000 處循環(huán)映射 4 次 Flash 的前 4MB,而 U-Boot 大小只有100KB多,因此 0x1f000000 跟 0x1fc00000 處的數(shù)據(jù)是一樣的,這就實現(xiàn)了運行地址的轉(zhuǎn)移。至于為什么不跳轉(zhuǎn)到 0xbf000000 + x 處運行,是因為 AR71
16、XX CPU 在復(fù)位時,緩存可用,因此通過 Kseg0 段執(zhí)行,可以加快速度。/* REMAP_DISABLE */li a0, AR7100_SPI_CLOCKli t0, 0x43sw t0, 0(a0)復(fù)制代碼以上代碼的作用是禁用物理段 0x1f000000 的 4MB Flash 數(shù)據(jù)循環(huán)映射,以便讓 0x1f000000 能夠映射 16MB 的 Flash 數(shù)據(jù)/* Initialize caches.*/* 初始化緩存 */la t9, simple_mips_cache_resetjalr t9nop/* . and enable them.*/* 啟用緩存 */li t0, C
17、ONF_CM_CACHABLE_NONCOHERENTmtc0 t0, CP0_CONFIG-省略-#if defined(CONFIG_AR7100) | defined(CONFIG_AR7240)/* 將緩存鎖定在 Kseg0 低端處 */la t9, mips_cache_lock_24kjalr t9nop#endif#endif /* #ifndef COMPRESSED_UBOOT */* 將棧指針指向緩存 */li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSETla sp, 0(t0)/* 進(jìn)入 C 環(huán)境 */la t9, board_init_
18、fj t9nop復(fù)制代碼這段代碼的作用是初始化緩存,并將緩存鎖定在 Kseg0 上,用作臨時的棧空間此時內(nèi)存并未初始化, Kseg0 對應(yīng)的 0x80000000 0x8fffffff 還不能被訪問,因此需要用緩存代替。然后跳轉(zhuǎn)到 board_init_f 進(jìn)行執(zhí)行下面開始在 C 環(huán)境中運行void board_init_f(ulong bootflag)gd_t gd_data, *id;bd_t *bd;init_fnc_t *init_fnc_ptr;ulong addr, addr_sp, len = (ulong)&uboot_end - CFG_MONITOR_BASE;ulong
19、 *s;#ifdef COMPRESSED_UBOOTchar board_string50;#endif#ifdef CONFIG_PURPLEvoid copy_code (ulong);#endif/* Pointer is writable since we allocated a register for it.*/gd = &gd_data;/* compiler optimization barrier needed for GCC = 3.4 */_asm_ _volatile_(: : :memory);memset (void *)gd, 0, sizeof (gd_t);
20、/* 依次運行初始化函數(shù) */for (init_fnc_ptr = init_sequence; *init_fnc_ptr; +init_fnc_ptr) if (*init_fnc_ptr)() != 0) hang ();#ifdef COMPRESSED_UBOOTcheckboard(board_string);printf(%snn,board_string);gd-ram_size = bootflag;puts (DRAM:);print_size (gd-ram_size, n);#endif/* Now that we have DRAM mapped and worki
21、ng, we can* relocate the code and continue running from DRAM.*/addr = CFG_SDRAM_BASE + gd-ram_size;/* We can reserve some RAM on top here.*/* round down to next 4 kB limit.*/addr &= (4096 - 1);debug (Top of RAM usable for U-Boot at: %08lxn, addr);-省略-/* Save local variables to board info struct*/* 記
22、錄內(nèi)存基址及大小、串口波特率 */bd-bi_memstart = CFG_SDRAM_BASE; /* start ofDRAM memory */bd-bi_memsize = gd-ram_size; /* sizeofDRAM memory in bytes */bd-bi_baudrate = gd-baudrate; /* Console Baudrate */memcpy (id, (void *)gd, sizeof (gd_t);/* On the purple board we copy the code in a special way* in order to solv
23、e flash problems*/#ifdef CONFIG_PURPLEcopy_code(addr);#endif/* 執(zhí)行代碼轉(zhuǎn)移 */relocate_code (addr_sp, id, addr);/* NOTREACHED - relocate_code() does not return */復(fù)制代碼board_init_f 的作用為進(jìn)行內(nèi)存、時鐘、串口等設(shè)備的初始化,并為 U-Boot 的運行劃分內(nèi)存。初始化函數(shù)位于 board_init_f 函數(shù)上方init_fnc_t *init_sequence = #ifndef COMPRESSED_UBOOTtimer_init
24、, /* 初始化時鐘 */#endifenv_init, /* initialize environment */ /* 初始化環(huán)境變量 */#ifdef CONFIG_INCA_IPincaip_set_cpuclk, /* set cpu clock according to environment variable */#endifinit_baudrate, /* initialze baudrate settings */#ifndef COMPRESSED_UBOOTserial_init, /* serial communications setup */ /* 初始化串口,這樣
25、 TTL 才有輸出 */#endifconsole_init_f, /* 初始化控制臺環(huán)境 */display_banner, /* say that we are here */ /* 顯示 U-Boot . */#ifndef COMPRESSED_UBOOTcheckboard, /* 顯示 AP99 (ar7241 - Virian) U-boot */init_func_ram, /* 初始化內(nèi)存 */#endifNULL,;復(fù)制代碼以上為初始化函數(shù)列表,依次運行在初始化完成后,board_init_f 調(diào)用 relocate_code 將 U-Boot 代碼從 Flash 中復(fù)制到
26、內(nèi)存中,再從內(nèi)存中執(zhí)行.globl relocate_code.ent relocate_coderelocate_code:move sp, a0 /* Set new stack pointer */li t0, CFG_MONITOR_BASEla t3, in_ramlw t2, -12(t3) /* t2 - uboot_end_data */move t1, a2/* Fix GOT pointer:* New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address*/* 根據(jù)傳遞的參數(shù)計算移動距離 */mo
27、ve t6, gpsub gp, CFG_MONITOR_BASEadd gp, a2 /* gp now adjusted */sub t6, gp, t6 /* t6 - relocation offset */* t0 = source address* t1 = target address* t2 = source end address*/* 復(fù)制代碼到內(nèi)存 */1:lw t3, 0(t0)sw t3, 0(t1)addu t0, 4ble t0, t2, 1baddu t1, 4 /* delay slot */* If caches were enabled, we would
28、 have to flush them here.*/* Jump to where weve relocated ourselves.*/* 跳轉(zhuǎn)到移動后的代碼繼續(xù)執(zhí)行 */addi t0, a2, in_ram - _startj t0nop.word uboot_end_data.word uboot_end.word num_got_entriesin_ram:/* 此時已經(jīng)在內(nèi)存中了 */* Now we want to update GOT.*/lw t3, -4(t0) /* t3 - num_got_entries */addi t4, gp, 8 /* Skipping fi
29、rst two entries. */li t2, 2/* GOT 表重定位 */1:lw t1, 0(t4)beqz t1, 2fadd t1, t6sw t1, 0(t4)2:addi t2, 1blt t2, t3, 1baddi t4, 4 /* delay slot */* Clear BSS.*/lw t1, -12(t0) /* t1 - uboot_end_data */lw t2, -8(t0) /* t2 flags |= GD_FLG_RELOC; /* tell others: relocation done */debug (Now running in RAM -
30、U-Boot at: %08lxn, dest_addr);gd-reloc_off = dest_addr - CFG_MONITOR_BASE;/* 記錄 U-Boot 重定位時移動的偏移量 */monitor_flash_len = (ulong)&uboot_end_data - dest_addr;/* We have to relocate the command table manually*/* U-Boot 命令表,重定位所有字符串地址和函數(shù)地址 */for (cmdtp = &_u_boot_cmd_start; cmdtp !=&_u_boot_cmd_end; cmdt
31、p+) ulong addr;addr = (ulong) (cmdtp-cmd) + gd-reloc_off;#if 0printf (Command %s: 0x%08lx = 0x%08lxn,cmdtp-name, (ulong) (cmdtp-cmd), addr);#endifcmdtp-cmd =(int (*)(struct cmd_tbl_s *, int, int, char *)addr;addr = (ulong)(cmdtp-name) + gd-reloc_off;cmdtp-name = (char *)addr;if (cmdtp-usage) addr =
32、(ulong)(cmdtp-usage) + gd-reloc_off;cmdtp-usage = (char *)addr;#ifdef CFG_LONGHELPif (cmdtp-help) addr = (ulong)(cmdtp-help) + gd-reloc_off;cmdtp-help = (char *)addr;#endif/* there are some other pointer constants we must deal with */#ifndef CFG_ENV_IS_NOWHEREenv_name_spec += gd-reloc_off;#endif/* 熄
33、滅路由的 LED */* turn off switch LED added by tiger 20091225 */ar7240_gpio_sw_led();-省略-/* configure available FLASH banks */* 初始化 Flash,顯示 Flash:XXXX (X MB) */size = flash_init();display_flash_config (size);bd = gd-bd;bd-bi_flashstart = CFG_FLASH_BASE;bd-bi_flashsize = size;#if CFG_MONITOR_BASE = CFG_F
34、LASH_BASEbd-bi_flashoffset = monitor_flash_len; /* reserved area for U-Boot */#elsebd-bi_flashoffset = 0;#endif/* initialize malloc() area */* 初始化內(nèi)存管理器,以便能夠使用 malloc 等函數(shù) */mem_malloc_init();malloc_bin_reloc();/* relocate environment function pointers etc. */* 重定位環(huán)境變量相關(guān)函數(shù)和數(shù)據(jù) */env_relocate();/* board
35、 MAC address */s = getenv (ethaddr);for (i = 0; i bi_enetaddri = s ? simple_strtoul (s, &e, 16) : 0;if (s)s = (*e) ? e + 1 : e;/* IP Address */bd-bi_ip_addr = getenv_IPaddr(ipaddr);#if defined(CONFIG_PCI)/* Do pci configuration*/* PCI 設(shè)備初始化 */pci_init();#endif/* leave this here (after malloc(), envi
36、ronment and PCI are working) */* Initialize devices */devices_init ();jumptable_init ();/* Initialize the console (after the relocation and devices init) */console_init_r ();/* * * * * * * * * * * * * * * * * * * * * */* Initialize from environment */if (s = getenv (loadaddr) != NULL) load_addr = si
37、mple_strtoul (s, NULL, 16);#if (CONFIG_COMMANDS & CFG_CMD_NET)if (s = getenv (bootfile) != NULL) copy_filename (BootFile, s, sizeof (BootFile);#endif /* CFG_CMD_NET */#if defined(CONFIG_MISC_INIT_R)/* miscellaneous platform dependent initialisations */misc_init_r ();#endif#if (CONFIG_COMMANDS & CFG_
38、CMD_NET)/* 初始化網(wǎng)絡(luò) */#if defined(CONFIG_NET_MULTI)puts (Net: );#endifeth_initialize(gd-bd);#endif/* main_loop() can return to retry autoboot, if so just run it again. */* 進(jìn)入命令主循環(huán),永不返回 */for (;) main_loop ();/* NOTREACHED - no way out of command loop except booting */復(fù)制代碼到此為止 U-Boot 就開始正常運行了在處理交互命令前,U-Boot 會檢查有沒有啟動命令void main_loop (void)-省略-#if defined(CONFIG_BOOTDELAY) & (CONFIG_BO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度寵物照料保姆雇傭合同協(xié)議書
- 商鋪轉(zhuǎn)讓服務(wù)合同
- 2025年度撫養(yǎng)權(quán)變更與財產(chǎn)分割調(diào)解合同模板
- 2025年度個人挖機(jī)租賃與施工驗收服務(wù)合同
- 2025年度房東轉(zhuǎn)租合同-科技園區(qū)房產(chǎn)租賃
- 2025年度醫(yī)院醫(yī)護(hù)人員崗位調(diào)整與勞動合同
- 2025年度互聯(lián)網(wǎng)企業(yè)期權(quán)投資合作協(xié)議
- 2025年度影視作品宣傳策劃代理合同
- 二零二五年度數(shù)字經(jīng)濟(jì)領(lǐng)域聘用業(yè)務(wù)經(jīng)理專屬合同
- 2025年度原油出口退稅及關(guān)稅優(yōu)惠合同
- 流行性感冒診療方案(2025年版)
- 2024CSCO免疫檢查點抑制劑相關(guān)的毒性管理指南
- 《影像增強(qiáng)檢查外周靜脈通路三級評價模式應(yīng)用規(guī)范》編制說明
- 2025年社區(qū)計生工作計劃(三篇)
- 2025年湖北中煙工業(yè)限責(zé)任公司招聘筆試高頻重點提升(共500題)附帶答案詳解
- 2025江西上饒經(jīng)濟(jì)技術(shù)開發(fā)區(qū)招商集團(tuán)限公司招聘29人高頻重點提升(共500題)附帶答案詳解
- 石油行業(yè)海洋石油勘探與開發(fā)方案
- 勞動保護(hù)知識培訓(xùn)課件
- 山東工業(yè)職業(yè)學(xué)院《家政職業(yè)經(jīng)理人》2023-2024學(xué)年第一學(xué)期期末試卷
- 水果加工工廠規(guī)劃
- 十八洞精準(zhǔn)扶貧課件
評論
0/150
提交評論