




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、大多數(shù)bootloader 都分為stagel和stage2兩部分,u-boot也不例外。依賴于 CPU體系結構的代碼(如設備初始化代碼等)通常都放在 stage1 且可以用匯編語言來實現(xiàn),而 stage2 則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復雜的功能,而且有更好的可讀性和移植性。1 、 Stage1 代碼結構u-boot 的 stage1 代碼通常放在文件中,他用匯編語言寫成,其主要代碼部分如下:(1 )定義入口。由于一個可執(zhí)行的 Image 必須有一個入口點,并且只能有一個全局入口, 通常這個入口放在 RO(MFlash )的 0x0 地址, 因此, 必須通知編譯器以使其知道這個入口, 該
2、工作可通過修改連接器腳本來完成。(2)設置異常向量( Exception Vector )。(3)設置CPU的速度、時鐘頻率及終端控制寄存器。( 4 )初始化內存控制器。(5 )將ROM中的程序復制到 RAM中。( 6 )初始化堆棧。(7)轉到RAM中執(zhí)行,該工作可使用指令Idr pc來完成。2、Stage2 C 語言代碼部分lib_arm/中的start arm boot是C語言開始的函數(shù)也是整個啟動代碼中C語言的主函數(shù),同時還是整個 u-boot ( armboot )的主函數(shù),該函數(shù)只要完成如下操作:(1)調用一系列的初始化函數(shù)。( 2)初始化 Flash 設備。( 3)初始化系統(tǒng)內存分
3、配函數(shù)。(4)如果目標系統(tǒng)擁有 NAN蠻備,則初始化 NAN蠻備。( 5)如果目標系統(tǒng)有顯示設備,則初始化該類設備。(6) 初始化相關網(wǎng)絡設備,填寫IP、MAC地址等。(7) 進去命令循環(huán)(即整個boot 的工作循環(huán)) ,接受用戶從串口輸入的命令,然后進行相 應的工作。3、U-Boot 的啟動順序 ( 示例,其他 u-boot 版本類似 ) cpu/arm920t/文件包含處理#include 由頂層的 mkconfig 生成, 其中只包含了一個文件: configs/.h#include #include /* Jump vector table as in table in 1*/注:AR
4、M微處理器支持字節(jié)(8位)、半字(16位)、字(32位)3種數(shù)據(jù)類型向量跳轉表,每條占四個字節(jié)(一個字),地址范圍為 0x0000 00000x0000 0020AR體系結構規(guī)定在上電復位后的起始位置,必須有8條連續(xù)的跳專指令,通過硬件實現(xiàn)。他們就是異常向量表。ARM在上電復位后, 巷從0x00000000開始啟動的,其實如果 bootloader 存在,在執(zhí)行下面第一條指令后,就無條件跳轉到start_code ,下面一部分并沒 執(zhí)行。設置異常向量表的作用是識別bootloader。以后系統(tǒng)每當有異常出現(xiàn),貝U CPU會根據(jù)異常號,從內存的0x00000000 處開始查表 做相應的處理/*;
5、當一個異常出現(xiàn)以后,ARM會自動執(zhí)行以下幾個步驟:;1.把下一條指令的地址放到連接寄存器LR(通常是R14).-保存位置;2.將相應的 CPSR當前程序狀態(tài)寄存器)復制到SPSR備份的程序狀態(tài)寄存器 )中-保存CPSR3根據(jù)異常類型,強制設置CPSR的運行模式位;4.強制PC(程序計數(shù)器)從相關異常向量地址取出下一條指令執(zhí)行,從而跳轉到相應的異常處理程序中*/.globl _start /* 系統(tǒng)復位位置 , 整個程序入口 */_start是GNU匯編器的默認入口標簽,.globl將_start 聲明為外部程序可訪問的標簽,.globl是GNU匚編的保留關鍵字,前面加點是GNU匚編的語法_st
6、art: b start_code 0x00ARMt電后執(zhí)行的第一條指令,也即復位向量,跳轉到 start_codereset用b,就是因為reset在MMU建立前后都有可能發(fā)生鎭他的異常只有在 MMU建立之后才會發(fā)生ldr pc, _un defi ned_in structi on /*未定義指令異常 ,0x04*/ldr pc, _prefetch_abort /* 內存操作異常 ,0x0c*/ldr pc, _data_abort /* 數(shù)據(jù)異常 ,0x10*/ldr pc, _not_used /* 未適用 ,0x14*/ldr pc, _irq /*慢速中斷異常 ,0x18*/ld
7、r pc, _fiq /*快速中斷異常 ,0x1c*/寸于ARM數(shù)據(jù)從內存到 CPU之間的移動只能通過 L/S指令,如:ldr rO,Ox為把Ox內存中 的數(shù)據(jù)寫到rO中,還有一個就是ldr偽指令,女如: ldr rO,=Ox為把Ox地址寫到rO中,mov 只能完成寄存器間數(shù)據(jù)的移動,而且立即數(shù)長度限制在 8 位_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abor
8、t: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.word為GNU ARMC編特有的偽操作,為分配一段字內存單元(分配的單元為字對齊的),可以使用.word把標志符作為常量使用。如_fiq:.word fiq即把fiq存入內存變量_fiq中, 也即是把 fiq 放到地址 _fiq 中。.balignl 16,Oxdeadbeef.balig nl 是.balig n的變體 .align 偽操作用于表示對齊方式:通過添加填充字節(jié)使當前位置滿足一定的對齊方式。 .balign 的作用同 .align
9、 。 .align alignment ,fill ,max 其中: alignment 用于指定對齊方式,可能的取值為 2 的次冪,缺省為4。fill是填充內容,缺省用 0填充。max是填充字節(jié)矽最大值,如果填充字節(jié)數(shù)超過 max, 就不進行對齊 , 例如: .align 4 /* 指定對齊方式為字對齊 */參考好野人的窩,于關 u-boot 中的 .balignl 16,0xdeadbeef的理解】/* Startup Code (called from the ARM reset exception vector)* do important init only if we dont s
10、tart from memory!* relocate armboot to ram* setup stack* jump to second stage*保存變量的數(shù)據(jù)區(qū),保存一些全局變量,用于BOOT程序從FLASH拷貝到RAM或者其它的使用。還有一些變量的長度是通過連接腳本里得到, 實際上由編譯器算出來的_TEXT_BASE:因為 linux 開始地址是 Ox,我這里是 64M SDRAM所以 TEXT_BASE = 0x33F80000?.word TEXT_BASE /*uboot 映像在 SDRAM中 的重定位地址 */TEXT_BAS在開發(fā)板相關的目錄中的文檔中定義,他定C了代碼
11、在運行時所在的地址,那么_TEXT_BAS沖保存了這個地t (這個TEXT_BAS怎么來的還不清楚).globl _armboot_start_armboot_start:.word _start 用 _start 來初始化 _armboot_start 。(為什么要這么定義一下還不明白)/* * These are defined in the board-specific linker script.*/下面這些是定義在開發(fā)板目錄鏈接腳本中的.globl _bss_start_bss_start:.word _bss_start標號所在的地_bss_start 定義在和開發(fā)板相關的中, _
12、bss_start 保存的是 _bss_start 址。.globl _bss_end_bss_end:.word _end同上,這樣賦值是因為代碼所在地址非編譯時的地址,直接取得該標號對應地址。中斷的堆棧設置#ifdef CONFIG_USE_IRQ/* IRQ stack memory (calculated at run-time) */.globl IRQ_STACK_STARTIRQ_STACK_START: .word 0x0badc0de/* IRQ stack memory (calculated at run-time) */ .globl FIQ_STACK_STARTFI
13、Q_STACK_START:.word 0x0badc0de#endif/* the actual start code*/復位后執(zhí)行程序薛正的初始化從這里開始了。其實在CPU上電以后就是跳到這里執(zhí)行的reset:/* set the cpu to SVC32 mode*/更改處理器模式為管理模式對狀態(tài)寄存器的修改要按照:讀出- 修改- 寫回的順序來執(zhí)行31 30 29 28 - 7 6 - 4 3 2 1 0 N Z C V I F M4 M3 M2 M1 M0 0 0 0 0 0 User26 模式 0 0 0 0 1 FIQ26 模式 0 0 0 1 0 IRQ26 模式 0 0 0 1
14、 1 SVC26 模式1 0 0 0 0 User 模式1 0 0 0 1 FIQ模式1 0 0 1 0 IRQ 模式1 0 0 1 1 SVC 模式1 0 1 1 1 ABT 模式1 1 0 1 1 UND 模式1 1 1 1 1 SYS 模式mrs r0,cpsr將 cpsr 的值讀到 r0 中bic r0,r0,#0x1f清除 M0M4orr r0,r0,#0xd3禁止 IRQ,FIQ 中斷,并將處理器置于管理模式msr cpsr,r0以下是點燈了,這里應該會牽涉到硬件設置,移植的時候應該可以不要bl coloured_LED_initbl red_LED_on針對AT91RM920Q進
15、行特殊處理#if defined(CONFIG_AT91RM9200DK) | defined(CONFIG_AT91RM9200EK)/* * relocate exception table*/ ldr r0, =_startldr r1, =0x0mov r2, #16copyex:subs r2, r2, #1sub帶上了 s用來更改進位標志,對于sub來說,若發(fā)生借位則C標志置0,沒有則為1,這跟 adds 指令相反!要注意。ldr r3, r0, #4str r3, r1, #4bne copyex#endif酚對S3C2400和S3C2410進行特殊處理CONFIG_S3C240
16、0CONFIG_S3C241等定義在include/configs/下不同開發(fā)板的頭文件中#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410)/* turn off the watchdog */關閉看門狗定時器的自動復位功能并屏蔽所有中斷,上電后看門狗為開,中斷為關# if defined(CONFIG_S3C2400)# define pWTCON 0x# define INTMSK 0x /* Interupt-Controller base addresses */# define CLKDIVN 0x /* clock divis
17、or register */#else s3c2410 的配置# define pWTCON 0xpWTCO定義為看門狗控制寄存器的地址(S3C2410和S3C2440相同)# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */INTMS定義為主中斷屏蔽寄存器的地址(S3C2410和s3c2440相同)# define INTSUBMSK 0x4A00001CINTSUBMS定義為副中斷屏蔽寄存器的地址(S3C2410和s3c2440相同)# define CLKDIVN 0x4C000014 /* CloCk d
18、iviSor regiSter */CLKDIV定義為時鐘分頻控制寄存器的地址(S3C2410和s3c2440相同)# endif至此寄存器地址設置完畢ldr r0, =pWTCONmov r1, #0x0Str r1, r0寸于S3C2440和S3C2410的WTCO寄存器的0控制允許或禁止看門狗定時器的復位輸出功 能,設置為“ 0”禁止復位功能。/* maSk all IRQS by Setting all bitS in the INTMR - default*/mov r1, #0xffffffffldr r0, =INTMSKStr r1, r0# if defined(CONFIG
19、_S3C2410)ldr r1, =0x3ff 2410 好像應該為 7ff 才寸(不理解 uboot 為何是這個數(shù)字)ldr r0, =INTSUBMSKstr r1, r0 # endif寸于S3C2410的INTMSK寄存器的32位和INTSUBMS寄存器的低11位每一位對應一個中斷,相應位置“1”為不響應相應的中斷。 對于S3C2440的INTSUBMSI有 15位可用,所以應該為0x7fff 了。/* FCLI:HCLI:PCLI = 1:2:4 */* default FCLI is 120 MHz ! */ldr r0, =CLIDIVNmov r1, #3str r1, r0寸
20、鐘分頻設置,F(xiàn)CLK為核心提供時鐘,HCLK為AHB( ARM920T內存妙制器,中斷控制器,LCD控制器,DMA和主USB模塊)提供時鐘,PCLI為APB (看門狗、IIS、I2C、PWM MMCADC UART GPIO RTC SPI)提供時鐘。分頻數(shù)一般選擇 1: 4: 8,所以 HDIVN=2,PDIVN=1,CLKDIVN=5這里僅僅是配置了分頻寄存器,3納出CLKDIVN的值跟分頻的關系:0x0 = 1:1:1 , 0x1 = 1:1:2 , 0x2 = 1:2:2 , 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8,0x6 = 1:3:3,0x7 =
21、 1:3:6S3C2440勺輸出時鐘計算式為:Mpll=(2*m*Fi n)/(p*2S)S3C2410 的輸出時鐘計算式為:Mpll=(m*Fi n)/(p*2As)m=M(the value for divider M)+8;p=P(the value for divider P)+2M,P,S 的選擇根據(jù) datasheet 中 PLL VALUE SELECTION TABLE表格進行,我的開發(fā)板晶振為,所以輸出頻率選為:的話 M=0x6e,P=3,S=1s3c2440增加了攝像頭,其FCLK、HCLK PCLK的分頻數(shù)還受到CAMDIVN9(默認為0),CAMDIVN8 (默認為 0
22、)的影響#endif /* CONFIG_S3C2400 | CONFIG_S3C2410 */* we do sys-critical inits only at reboot,* not when booting from ram!*/選擇是否初始化 CPU#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit妙行CPU初始化,BL完成跳轉的同時會把后面緊跟的一條指令地址保存到連接寄存器LR(R14)中。以使子程序執(zhí)行完后正常返回。#endif酬試階段的代碼是直接在RAM中運行的,而最后需要把這些代碼固化到Flash中,因此U-Boot 需要自己
23、從 Flash 轉移到RA中運行,這也是重定向的目的所在。通過 adr 指令得到當前代碼的地址信息:如果U-boot 是從 RAM 開始運行,則從adr,r0,_start 得到的地址信息為r0=_start=_TEXT_BASE=TEXT_BASE=0x33F80000ffl果 U-boot 從 Flash 開始運行,即從處 理器對應的地址運行,則 r0=0x0000, 這時將會執(zhí)行 copy_loop 標識的那段代碼了。 _TEXT_BASE定義在 board/smdk2410/ 中#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocat
24、e U-Boot to RAM */ adr r0, _start /* r0 - current position of code */ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* dont reloc during debug */ beq stack_setupldr r2, _armboot_start_armboot_start 為 _start 地址ldr r3, _bss_start_bss_start 為數(shù)據(jù)段地址sub r2, r3, r2 /* r2 - size of arm
25、boot */add r2, r0, r2 /* r2 - source end address */ copy_loop:ldmia r0!, r3-r10 /* copy from source address r0 */ 從源地址 r0 讀取 8 個字節(jié)到寄存器 , 每讀一個就更新一次 r0 地址ldmia:r0 安字節(jié)增長stmia r1!, r3-r10 /* copy to target address r1 */LDM(STM)于在寄存器所指的一片連續(xù)存儲器和寄存器列表的寄存器間進行數(shù)據(jù)移動,或是進行壓棧和出棧操作。格式為:LDM(STM)條件類型基址寄存器 ! ,寄存器列表 仔
26、對于類型有以下幾種情況:IA 每次傳送后地址加 1,用于移動數(shù)據(jù)塊IB 每次傳送前地址加 1,用于移動數(shù)據(jù)塊DA 每次傳送后地址減 1,用于移動數(shù)據(jù)塊DB 每次傳送前地址減 1,用于移動數(shù)據(jù)塊FD 滿遞減堆棧,用于操作堆棧(即先移動指針再操作數(shù)據(jù),相當于DB)ED 空遞減堆棧,用于操作堆棧(即先操作數(shù)據(jù)再移動指針,相當于DA)FA 滿遞增堆棧,用于操作堆棧(即先移動指針再操作數(shù)據(jù),相當于IB )EA 空遞增堆棧,用于操作堆棧(即先操作數(shù)據(jù)再移動指針,相當于IA )(這里是不是應該要涉及到NAND或者NOR的讀寫沒有看出來)cmp r0, r2 /* until source end addre
27、ee r2 */ble copy_loop#endif /* CONFIG_SKIP_RELOCATE_UBOOT */* Set up the stack */初始化堆棧stack_setup:ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */獲取分配區(qū)域起始指針,sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */CFG_MALLOC_LEN=128*1024+CFG_ENV_SIZE=128*1024+0x10000=192K用來存儲開發(fā)板sub r0, r0, #CONFIG
28、_SYS_GBL_DATA_SIZE /* bdinfo */CFG_GBL_DATA_SIZE 128-size in bytes reserved for initial data信息#ifdef CONFIG_USE_IRQ這里如果需要使用 IRQ, 還有給 IRQ 保留堆??臻g , 一般不使用 . sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endifsub sp, r0, #12 /* leave 3 words for abort-stack */該部分將未初始化數(shù)據(jù)段 _bss_start_bss_end 中
29、的數(shù)據(jù) 清零clear_bss:ldr r0, _bss_start /* find start of bss segment */ldr r1, _bss_end /* stop here */mov r2, #0x00000000 /* clear */ clbss_l:str r2, r0 /* clear loop. */add r0, r0, #4cmp r0, r1ble clbss_l跳到階段二 C 語言中去ldr pc, _start_armboot_start_armboot: .word start_armbootC語言start_armboot 在 /lib_arm/ 中
30、,到這里因該是第一階段已經完成了吧,下面就要去 中執(zhí)行第二階段了吧/* CPU_init_critical registers* setup important registers* setup memory timing*/CP初始化在“ relocate: /* relocate U-Boot to RAM */”之前被調用#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:/* flush v4 I/D caches*/初始化 CACHESmov r0, #0mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cac
31、he */mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */* disable MMU stuff and caches*/關閉 MMI和 CACHESmrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002300 clear bits 13, 9:8 (-V- -RS) bic r0, r0, #0x00000087 clear bits 7, 2:0 (B- -CAM) orr r0, r0, #0x00000002 set bit 2 (A) Align orr r0, r0, #0x00001000 set bit
32、 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 對協(xié)處理器的操作還是看不懂,暫時先不管吧,有時間研究一下 部分。/* before relocating, we have to setup RAM timing* because memory timing is board-dependend, you will* find a in your board directory.*/初始化RAM寸鐘,因為內存是跟開發(fā)板密切相關的,所以這部分在 mov ip, lr保存LR,以便正常返回,注意前面是通過 BL跳到cpu_init_crit ( ARM9有 37
33、個寄存器,ARM7有 27 個)37個寄存器=7個未分組寄存器(R0R7) + 2X ( 5個分組寄存器 R14=lr 分組寄存器) + 1(R15=PC) +1(CPSR) + 5(SPSR) 用途和訪問權限:R(R7:USR(用戶模式)、fiq (快速中斷模式)、irq (中斷模式)、ARM技術手冊的協(xié)處理器/ 開發(fā)板目錄 / 中實現(xiàn)來的。R8R12) +6X 2( R13=SPsvc (超級用法模式)、abt、undR8R12: R8_usr R12_usr (usr , irq , svc , abt , und)R8_fiq R12_fiq (fiq )R11=fpR12=IP(從反
34、匯編上看,fp和ip 一般用于存放 SP的值)R13R14: R13_usr R14_usr( 每種模式都有自己的寄存器 )SP lr : R13_fiq R14_fiqR13_irq R14_irqR13_svc R14_svcR13_abt R14_abtR13_und R14_undR15(PC):都可以訪問(即 PC的值為當前指令的地址值加8個字節(jié))R16 :( (Current Program Status Register ,當前程序狀態(tài)寄存器 ) )SPSR _fiq,SPSR_irq,SPSR_abt,SPSR_und(USR 模式沒有 )#if defined(CONFIG_
35、AT91RM9200EK)#elsebl lowlevel_init在重定向代碼之前,必須初始化內存時序,因為重定向時需要將flash 中的代碼復制到內存中 lowlevel_init 在 /board/smdk2410/ 中。#endifmov lr, ip mov pc, lr返回到主程序#endif /* CONFIG_SKIP_LOWLEVEL_INIT */* Interrupt handling*/這段沒有看明白,不過好像跟移植關系不是很大,先放一放。 IRQ stack frame.#define S_FRAME_SIZE 72#define S_OLD_R0 68#define
36、 S_PSR 64#define S_PC 60#define S_LR 56 #define S_SP 52#define S_IP 48 #define S_FP 44#define S_R10 40#define S_R9 36#define S_R8 32#define S_R7 28#define S_R6 24#define S_R5 20#define S_R4 16#define S_R3 12#define S_R2 8#define S_R1 4#define S_R0 0#define MODE_SVC 0x13#define I_BIT 0x80/* use bad_s
37、ave_user_regs for abort/prefetch/undef/swi .* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling*/.macro bad_save_user_regssub sp, sp, #S_FRAME_SIZEstmia sp, r0 - r12 Calling r0-r12ldr r2, _armboot_startsub r2, r2, #(CONFIG_STACKSIZE)sub r2, r2, #(CONFIG_SYS_MALLOC_LEN)sub r2, r2, #
38、(CONFIG_SYS_GBL_DATA_SIZE+8) set base 2 words into abort stackldmia r2, r2 - r3 get pc, cpsradd r0, sp, #S_FRAME_SIZE restore sp_SVCadd r5, sp, #S_SPmov r1, lrstmia r5, r0 - r3 save sp_SVC, lr_SVC, pc, cpsrmov r0, sp.endm.macro irq_save_user_regssub sp, sp, #S_FRAME_SIZEstmia sp, r0 - r12 Calling r0
39、-r12add r7, sp, #S_PCstmdb r7, sp, lrA Calli ng SP, LRstr lr, r7, #0 Save calling PCmrs r6, spsrstr r6, r7, #4 Save CPSRstr r0, r7, #8 Save OLD_R0mov r0, sp .endm.macro irq_restore_user_regsIdmia sp, r0 - lrA Calli ng r0 - Irmov r0, r0ldr lr, sp, #S_PC Get PCadd sp, sp, #S_FRAME_SIZEsubs pc, lr, #4 return & move spsr_svc into cpsr.endm.macro get_bad_stackldr r13, _armboot_start setup our mode stacksub r13, r13, #(CONFIG_STACKSIZE)sub r13, r13, #(CONFIG_SYS_MALLOC_L
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 老人火災應急預案演練(3篇)
- 建筑結構設計軟件的使用技巧試題及答案
- 精準突破水利水電工程考試試題及答案
- 探討水利工程的可持續(xù)發(fā)展試題及答案
- 2025年能源行業(yè)智能電網(wǎng)優(yōu)化與智能電網(wǎng)設備選型研究報告
- 公共關系職業(yè)發(fā)展路徑的試題及答案
- 行政管理學的項目管理實踐試題及答案
- 涉及領域水利水電考試試題及答案
- 行政管理的競爭優(yōu)勢維持策略與試題及答案
- 自考行政管理本科發(fā)展方向試題及答案
- MOOC 認識中國-南京大學 中國大學慕課答案
- 2024ABB ConVac真空接觸器安裝說明書
- 阿托品知識課件
- 衛(wèi)星通信與移動通信技術融合與應用
- 職工食堂外包項目服務方案
- 醫(yī)院死亡證明培訓課件
- 2024山東能源集團中級人才庫選拔高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 旅游服務行業(yè)的自我品牌推廣與營銷
- 面部抗衰培訓課件
- 醫(yī)院輸血反應應急預案演練腳本
- 基于PLC的網(wǎng)球自動發(fā)射機課程設計說明書
評論
0/150
提交評論