寫(xiě)在前面的話,由于已經(jīng)學(xué)習(xí)了JZ2440V3開(kāi)發(fā)板的裸機(jī)程序。想檢驗(yàn)下學(xué)習(xí)成果,所以從今天開(kāi)始把以前學(xué)的知識(shí)點(diǎn)在tiny4412開(kāi)發(fā)板上面做個(gè)檢驗(yàn)。裸機(jī)部分學(xué)習(xí)到把uboot移植完成就結(jié)束;然后,學(xué)習(xí)內(nèi)核的驅(qū)動(dòng)和其他子系統(tǒng)框架。言歸正傳,現(xiàn)在開(kāi)始學(xué)習(xí)交叉編譯工具鏈的使用。
源文件需要經(jīng)過(guò)編譯才能生成可執(zhí)行文件。在Windows下進(jìn)行開(kāi)發(fā)時(shí),只需要點(diǎn)幾個(gè)按鈕即可編譯,集成開(kāi)發(fā)環(huán)境(比如 Visual studio)已經(jīng)將各種編譯工具的使用封裝好了。
Linux下也有很優(yōu)秀的集成開(kāi)發(fā)工具,但是更多的時(shí)候是直接以命令方式運(yùn)行編譯工具;即使使用集成開(kāi)發(fā)工具,也需要掌握一些編譯選項(xiàng)。
PC機(jī)上的編譯工具鏈為gcc、 ld、 objcopy、 objdump等,它們編譯出來(lái)的程序在x86平臺(tái)上運(yùn)行。要編譯出能在ARM平臺(tái)上運(yùn)行的程序,必須使用交叉編譯工具arm-linux-gcc、arm-linux-ld等,下面分別介紹。
1.arm-linux-gcc工具介紹
一個(gè) C/C++文件要經(jīng)過(guò)預(yù)處理(preprocessing)、編譯(compilation)、匯編(assembly)和連接(linking)等4步才能變成可執(zhí)行文件,如表1.1所示。在日常交流中通常使用"編譯"統(tǒng)稱這4個(gè)步驟,如果不是特指這4個(gè)步驟中的某一個(gè),本書(shū)也依慣例使用"編譯"這個(gè)統(tǒng)稱。
1.1.預(yù)處理
C/C++源文件中,以"#"開(kāi)頭的命令被稱為預(yù)處理命令,如包含命令"#include"、宏定義命令"#define"、條件編譯命令"#if"、"#ifdef"等。預(yù)處理就是將要包含(include)的文件插入原文件中、將宏定義展開(kāi)、根據(jù)條件編譯命令選擇要使用的代碼,最后將這些東西輸出到一個(gè)".i"文件中等待進(jìn)一步處理。預(yù)處理將用到arm-linux-cpp工具。
1.2.編譯
編譯就是把 C/C++代碼(比如上述的".i"文件)"翻譯"成匯編代碼,所用到的工具為cc1(它的名字就是 cc1,不是 arm-linux-cc1)。
1.3.匯編
匯編就是將第二步輸出的匯編代碼翻譯成符合一定格式的機(jī)器代碼,在Linux系統(tǒng)上一般表現(xiàn)為ELF目標(biāo)文件(OBJ文件),用到的工具為arm-linux-as。"反匯編"是指將機(jī)器代碼轉(zhuǎn)換為匯編代碼,這在調(diào)試程序時(shí)常常用到。
1.4.連接
連接就是將上步生成的OBJ文件和系統(tǒng)庫(kù)的OBJ文件、庫(kù)文件連接起來(lái),最終生成了可以在特定平臺(tái)運(yùn)行的可執(zhí)行文件,用到的工具為arm-linux-ld。
編譯器利用這4個(gè)步驟中的一個(gè)或多個(gè)來(lái)處理輸入文件,源文件的后綴名表示源文件所用的語(yǔ)言,后綴名控制著編譯器的缺省動(dòng)作,如表1.1。
其他后綴名的文件被傳遞給連接器(linker),通常包括:
o:目標(biāo)文件(Object file,OBJ文件)
a:歸檔庫(kù)文件(Archive file)
在編譯過(guò)程中,除非使用了"-c","-S"或"-E"選項(xiàng)(或者編譯錯(cuò)誤阻止了完整的過(guò)程),否則最后的步驟總是連接。在連接階段中,所有對(duì)應(yīng)于源程序的.o文件,"-l"選項(xiàng)指定的庫(kù)文件,無(wú)法識(shí)別的文件名(包括指定的".o"目標(biāo)文件和".a"庫(kù)文件)按命令行中的順序傳遞給連接器。
以一個(gè)簡(jiǎn)單的"Hello, world!" C程序?yàn)槔拇a如下,功能為打印"Hello World!"字符串。
/* File: hello.c */
#include int main(int argc, char *argv[]) { printf("Hello World!n"); return 0; } 使用arm-linux-gcc,只需要一個(gè)命令就可以生成可執(zhí)行文件hello,它包含了上述4個(gè)步驟: arm-linux-gcc -o hello hello.c 加上"-v"選項(xiàng), 即使用"arm-linux-gcc -v -o hello hello.c"命令可以觀看編譯的細(xì)節(jié),下面摘取關(guān)鍵部分: cc1 hello.c -o /tmp/cctETob7.s as -o /tmp/ccvv2KbL.o /tmp/cctETob7.s collect2 -o hello crt1.o crti.o crtbegin.o /tmp/ccvv2KbL.o crtend.o crtn.o 以上3個(gè)命令分別對(duì)應(yīng)于編譯步驟中的預(yù)處理、編譯、匯編和連接, ld被collect2調(diào)用來(lái)連接程序。預(yù)處理和編譯被放在了一個(gè)命令(cc1)中進(jìn)行的,可以把它再次拆分為以下兩步: cpp -o hello.i hello.c cc1 hello.i -o /tmp/cctETob7.s 可以通過(guò)各種選項(xiàng)來(lái)控制arm-linux-gcc的動(dòng)作,下面介紹一些常用的選項(xiàng): 總體選項(xiàng): -c選項(xiàng):預(yù)處理、編譯和匯編源文件,但是不作連接,編譯器根據(jù)源文件生成OBJ文件。缺省情況下,GCC通過(guò)用".o"替換源文件名的后綴".c",".i",".s"等,產(chǎn)生OBJ文件名。可以使用-o選項(xiàng)選擇其他名字。GCC忽略-c選項(xiàng)后面任何無(wú)法識(shí)別的輸入文件。 -S選項(xiàng):編譯后即停止,不進(jìn)行匯編。對(duì)于每個(gè)輸入的非匯編語(yǔ)言文件,輸出結(jié)果是匯編語(yǔ)言文件。缺省情況下,GCC通過(guò)用".s"替換源文件名后綴".c",".i"等等,產(chǎn)生匯編文件名。可以使用-o選項(xiàng)選擇其他名字。GCC忽略任何不需要匯編的輸入文件。 -E選項(xiàng):預(yù)處理后即停止,不進(jìn)行編譯。預(yù)處理后的代碼送往標(biāo)準(zhǔn)輸出。GCC忽略任何不需要預(yù)處理的輸入文件。 -o選項(xiàng):指定輸出文件為file。無(wú)論是預(yù)處理、編譯、匯編還是連接,這個(gè)選項(xiàng)都可以使用。如果沒(méi)有使用'-o'選項(xiàng),默認(rèn)的輸出結(jié)果是:可執(zhí)行文件為'a.out';修改輸入文件的名稱是'source.suffix',則它的OBJ文件是'source.o',匯編文件是'source.s',而預(yù)處理后的C源代碼送往標(biāo)準(zhǔn)輸出。 -v選項(xiàng):顯示制作GCC工具自身時(shí)的配置命令;同時(shí)顯示編譯器驅(qū)動(dòng)程序、預(yù)處理器、編譯器的版本號(hào)。 以一個(gè)程序?yàn)槔齻€(gè)文件,下面列出源碼: //File: main.c #include #include "sub.h" int main(int argc, char *argv[]) { int i; printf("Main fun!n"); sub_fun(); return 0; } //File: sub.h void sub_fun(void); //File: sub.c void sub_fun(void) { printf("Sub fun!n"); } arm-linux-gcc、arm-linux-ld等工具與gcc、ld等工具的使用方法相似,很多選項(xiàng)是一樣的。本節(jié)使用gcc、ld等工具進(jìn)行編譯、連接,這樣可以在PC上直接看到運(yùn)行結(jié)果。使用上面介紹的選項(xiàng)進(jìn)行編譯,命令如下: $ gcc -c -o main.o main.c $ gcc -c -o sub.o sub.c $ gcc -o test main.o sub.o 其中,main.o、sub.o是經(jīng)過(guò)了預(yù)處理、編譯、匯編后生成的OBJ文件,它們還沒(méi)有被連接成可執(zhí)行文件;最后一步將它們連接成可執(zhí)行文件test,可以直接運(yùn)行以下命令: $ ./test Main fun! Sub fun! 現(xiàn)在試試其他選項(xiàng),以下命令生成的main.s是main.c的匯編語(yǔ)言文件: gcc -S -o main.s main.c 以下命令對(duì)main.c進(jìn)行預(yù)處理,并將得到的結(jié)果打印出來(lái)。里面擴(kuò)展了所有包含的文件、所有定義的宏。在編寫(xiě)程序時(shí),有時(shí)候查找某個(gè)宏定義是非常繁瑣的事,可以使用'-dM –E'選項(xiàng)來(lái)查看。命令如下: $ gcc -E main.c 警告選項(xiàng): -Wall選項(xiàng):這個(gè)選項(xiàng)基本打開(kāi)了所有需要注意的警告信息,比如沒(méi)有指定類型的聲明、在聲明之前就使用的函數(shù)、局部變量除了聲明就沒(méi)再使用等。 上面的main.c文件中,第6行定義的變量i沒(méi)有被使用,但是使用"gcc –c –o main.o main.c"進(jìn)行編譯時(shí)并沒(méi)有出現(xiàn)提示。 可以加上-Wall選項(xiàng),例子如下: $ gcc -Wall -c main.c 執(zhí)行上述命令后,得到如下警告信息: main.c: In function `main': main.c:6: warning: unused variable `i 這個(gè)警告雖然對(duì)程序沒(méi)有壞的影響,但是有些警告需要加以關(guān)注,比如類型匹配的警告等。 調(diào)試選項(xiàng): -g選項(xiàng):以操作系統(tǒng)的本地格式(stabs,COFF,XCOFF,或DWARF)產(chǎn)生調(diào)試信息,GDB能夠使用這些調(diào)試信息。在大多數(shù)使用stabs格式的系統(tǒng)上,'-g'選項(xiàng)加入只有GDB才使用的額外調(diào)試信息。可以使用下面的選項(xiàng)來(lái)生成額外的信息:'-gstabs+','-gstabs','-gxcoff+','-gxcoff','-gdwarf+'或'-gdwarf',具體用法請(qǐng)讀者參考GCC手冊(cè)。 優(yōu)化選項(xiàng): -O或-O1選項(xiàng):優(yōu)化:對(duì)于大函數(shù),優(yōu)化編譯的過(guò)程將占用稍微多的時(shí)間和相當(dāng)大的內(nèi)存。不使用"-O"或"-O1"選項(xiàng)的目的是減少編譯的開(kāi)銷,使編譯結(jié)果能夠調(diào)試、語(yǔ)句是獨(dú)立的;如果在兩條語(yǔ)句之間用斷點(diǎn)中止程序,可以對(duì)任何變量重新賦值,或者在函數(shù)體內(nèi)把程序計(jì)數(shù)器指到其他語(yǔ)句,以及從源程序中精確地獲取你所期待的結(jié)果。 -O2選項(xiàng):多優(yōu)化一些。除了涉及空間和速度交換的優(yōu)化選項(xiàng),執(zhí)行幾乎所有的優(yōu)化工作。例如不進(jìn)行循環(huán)展開(kāi)(loop unrolling)和函數(shù)內(nèi)嵌(inlining)。和'-O'或'-O1'選項(xiàng)比較,這個(gè)選項(xiàng)既增加了編譯時(shí)間,也提高了生成代碼的運(yùn)行效果。 -O3選項(xiàng):優(yōu)化的更多。除了打開(kāi)-O2所做的一切,它還打開(kāi)了-finline-functions選項(xiàng)。 -O0選項(xiàng):不優(yōu)化。 如果指定了多個(gè)-O選項(xiàng),不管帶不帶數(shù)字,生效的是最后一個(gè)選項(xiàng)。在一般應(yīng)用中,經(jīng)常使用-O2選項(xiàng),比如對(duì)于options程序: $ gcc -O2 -c -o main.o main.c $ gcc -O2 -c -o sub.o sub.c $ gcc -o test main.o sub.o 連接器選項(xiàng): 下面的選項(xiàng)用于連接OBJ文件,輸出可執(zhí)行文件或庫(kù)文件。 object-file-name選項(xiàng):如果某些文件沒(méi)有特別明確的后綴(a special recognized suffix),GCC就認(rèn)為他們是OBJ文件或庫(kù)文件(根據(jù)文件內(nèi)容,連接器能夠區(qū)分 OBJ 文件和庫(kù)文件)。如果GCC執(zhí)行連接操作,這些OBJ文件將成為連接器的輸入文件。 比如上面的"gcc -o test main.o sub.o"中,main.o、sub.o就是輸入的文件。 -llibrary選項(xiàng):連接名為library的庫(kù)文件。連接器在標(biāo)準(zhǔn)搜索目錄中尋找這個(gè)庫(kù)文件,庫(kù)文件的真正名字是'liblibrary.a'。搜索目錄除了一些系統(tǒng)標(biāo)準(zhǔn)目錄外,還包括用戶以'-L'選項(xiàng)指定的路徑。 目錄選項(xiàng): 下列選項(xiàng)指定搜索路徑,用于查找頭文件,庫(kù)文件,或編譯器的某些成員。 -Idir選項(xiàng):在頭文件的搜索路徑列表中添加dir目錄。 頭文件的搜索方法為:如果以"#include<>"包含文件,則只在標(biāo)準(zhǔn)庫(kù)目錄開(kāi)始搜索(包括使用-Idir選項(xiàng)定義的目錄);如以"#include “” "包含文件,則先從用戶的工作目錄開(kāi)始搜索,再搜索標(biāo)準(zhǔn)庫(kù)目錄。 1.2.arm-linux-ld工具介紹 arm-linux-ld用于將多個(gè)目標(biāo)文件、庫(kù)文件連接成可執(zhí)行文件,它的大多數(shù)選項(xiàng)已經(jīng)在上面介紹過(guò)了。 本小節(jié)介紹'-T'選項(xiàng),可以直接使用它來(lái)指定代碼段、數(shù)據(jù)段、bss段的起始地址,也可以用來(lái)指定一個(gè)連接腳本,在連接腳本中進(jìn)行更復(fù)雜的地址設(shè)置。 '-T'選項(xiàng)只在連接Bootloader、內(nèi)核等“沒(méi)有底層軟件支持”的軟件;連接運(yùn)行于操作系統(tǒng)之上的應(yīng)用程序時(shí),無(wú)需指定`-T’ 選項(xiàng),它們使用默認(rèn)的方式進(jìn)行連接。 直接指定代碼段、數(shù)據(jù)段、bss段的起始地址: 格式如下: -Ttext startaddr -Tdata startaddr -Tbss startaddr 其中的'startaddr'分別表示代碼段、數(shù)據(jù)段和bss段的起始地址,它是一個(gè)16進(jìn)制數(shù)。示例: arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf 它表示代碼段的運(yùn)行地址為0x0000000,由于沒(méi)有定義數(shù)據(jù)段、bss段的起始地址,它們被依次放在代碼段的后面。 使用連接腳本設(shè)置地址: 示例,它的Makefile中有這一句: arm-linux-ld -Ttimer.lds -o timer_elf $^ 其中的'$^'表示"head.o init.o interrupt.o main.o"(為何如此暫時(shí)不用管),所以這句代碼就變?yōu)椋?p> arm-linux-ld -Ttimer.lds -o timer_elf head.o init.o interrupt.o main.o 它使用連接腳本timer.lds來(lái)設(shè)置可執(zhí)行文件timer_elf的地址信息,timer_elf文件內(nèi)容如下: SECTIONS { . = 0x30000000; .text : { *(.text) } .rodata ALIGN(4) : {*(.rodata)} .data ALIGN(4) : { *(.data) } .bss ALIGN(4) : { *(.bss) *(COMMON) } } 解析timer_elf文件之前,先講解連接腳本的格式。連接腳本的基本命令是SECTIONS命令,它描述了輸出文件的"映射圖":輸出文件中各段、各文件怎么放置。一個(gè)SECTIONS命令內(nèi)部包含一個(gè)或多個(gè)段,段(Section)是連接腳本的基本單元,它表示輸入文件中的某部分怎么放置。 完整的連接腳本格式如下,它的核心部分是段(Section): SECTIONS { ... secname start ALIGN(align) (NOLOAD) : AT(ldadr) { contents } >region :phdr =fill ... } secname和contents是必須的,前者用來(lái)命名這個(gè)段,后者用來(lái)確定代碼中的什么部分放在這個(gè)段中。 start是這個(gè)段重定位地址,也稱為運(yùn)行地址。如果代碼中有位置相關(guān)的指令,程序在運(yùn)行時(shí),這個(gè)段必須放在這個(gè)地址上。 ALIGN(align):雖然start指定了運(yùn)行地址,但是仍可以使用 BLOCK(align)來(lái)指定對(duì)齊的要求──這個(gè)對(duì)齊的地址才是真正的運(yùn)行地址。 (NOLOAD):用來(lái)告訴加載器,在運(yùn)行時(shí)不用加載這個(gè)段。顯然,這個(gè)選項(xiàng)只有在有操作系統(tǒng)的情況下才有意義。 AT(ldadr):指定這個(gè)段在編譯出來(lái)的映像文件中的地址──加載地址(load address)。如果不使用這個(gè)選項(xiàng),則加載地址等于運(yùn)行地址。通過(guò)這個(gè)選項(xiàng),可以控制各段分別保存輸出文件中不同的位置,便于把文件保存到到單板上:A段放在A處,B段放在B處,運(yùn)行前再把A、B段分別讀出來(lái)組裝成一個(gè)完整的執(zhí)行程序。 現(xiàn)在,可以明白前面的連接腳本timer.lds的含義了: 第2行表示設(shè)置"當(dāng)前運(yùn)行地址"為0x30000000。 第3行定義了一個(gè)名為".text"的段,它的內(nèi)容為"*(.text)",表示所有輸入文件的代碼段。這些代碼段被集合在一起,起始運(yùn)行地址為0x30000000。 第 4 行定義了一個(gè)名為".rodata"的段,在輸出文件timer_elf中,它緊挨著".text"段存放。其中的"ALIGN(4)"表示起始運(yùn)行地址為4字節(jié)對(duì)齊。假設(shè)前面".text"段的地址范圍是0x30000000~0x300003f1,則".rodata"段的地址是4字節(jié)對(duì)齊后的0x300003f4。 第5、6行的含義與第4行類似。 1.3.arm-linux-objcopy工具介紹 arm-linux-objcopy被用來(lái)拷貝一個(gè)目標(biāo)文件的內(nèi)容到另一個(gè)文件中,可以使用不同于源文件的格式來(lái)輸出目的文件,即可以進(jìn)行格式轉(zhuǎn)換。 在本書(shū)中,常用arm-linux-objcopy來(lái)將ELF格式的可執(zhí)行文件轉(zhuǎn)換為二進(jìn)制文件。arm-linux-objcopy的使用格式如下: arm-linux-objcopy [ -F bfdname | --target=bfdname ] [ -I bfdname | --input-target=bfdname ] [ -O bfdname | --output-target= bfdname ] [ -S | --strip-all ] [ -g | --strip-debug ] [ -K symbolname | --keep-symbol= symbolname ] [ -N symbolname | --strip-symbol= symbolname ] [ -L symbolname | --localize-symbol= symbolname ] [ -W symbolname | --weaken-symbol= symbolname ] [ -x | --discard-all ] [ -X | --discard-locals ] [ -b byte | --byte= byte ] [ -i interleave | --interleave= interleave ] [ -R sectionname | --remove-section= sectionname ] [ -p | --preserve-dates ] [ --debugging ] [ --gap-fill= val ] [ --pad-to= address ] [ --set-start= val ] [ --adjust-start= incr ] [ --change-address= incr ] [ --change-section-address= section{=,+,-} val ] [ --change-warnings ] [ --no-change-warnings ] [ --set-section-flags= section= flags ] [ --add-section= sectionname= filename ] [ --change-leading char ] [--remove-leading-char ] [ --weaken ] [ -v | --verbose ] [ -V | --version ] [ --help ] input-file [ outfile ] 下面講解常用的選項(xiàng): input-file、outfile選項(xiàng):參數(shù)input-file和outfile分別表示輸入目標(biāo)文件(源目標(biāo)文件)和輸出目標(biāo)文件(目的目標(biāo)文件)。如果在命令行中沒(méi)有明確地指定outfile,那么arm-linux-objcopy將創(chuàng)建一個(gè)臨時(shí)文件來(lái)存放目標(biāo)結(jié)果,然后使用input-file的名字來(lái)重命名這個(gè)臨時(shí)文件(這時(shí)候,原來(lái)的input-file將被覆蓋)。 -I bfdname或--input-target=bfdname選項(xiàng):用來(lái)指明源文件的格式,bfdname是BFD庫(kù)中描述的標(biāo)準(zhǔn)格式名。如果不指明源文件格式,arm-linux-objcopy會(huì)自己去分析源文件的格式,然后去和BFD中描述的各種格式比較,從而得知源文件的目標(biāo)格式名。 -O bfdname或--output-target= bfdname選項(xiàng):使用指定的格式來(lái)輸出文件,bfdname是BFD庫(kù)中描述的標(biāo)準(zhǔn)格式名。 -F bfdname或--target= bfdname選項(xiàng):同時(shí)指明源文件、目的文件的格式。將源目標(biāo)文件中的內(nèi)容拷貝到目的目標(biāo)文件的過(guò)程中,只進(jìn)行拷貝不做格式轉(zhuǎn)換,源目標(biāo)文件是什么格式,目的目標(biāo)文件就是什么格式。 -R sectionname或--remove-section= sectionname選項(xiàng):從輸出文件中刪掉所有名為sectionname的段。這個(gè)選項(xiàng)可以多次使用。 -S 或--strip-all選項(xiàng):不從源文件中拷貝重定位信息和符號(hào)信息到目標(biāo)文件中去。 -g 或--strip-debug選項(xiàng):不從源文件中拷貝調(diào)試符號(hào)到目標(biāo)文件中去。 在編譯bootloader、內(nèi)核時(shí),常用arm-linux-objcopy命令將ELF格式的生成結(jié)果轉(zhuǎn)換為二進(jìn)制文件,比如: $ arm-linux-objcopy -O binary -S elf_file bin_file 1.4.arm-linux-objdump工具介紹: arm-linux-objdump用于顯示二進(jìn)制文件信息,本書(shū)中常用來(lái)查看反匯編代碼。使用格式如下: arm-linux-objdump [-a] [-b bfdname | --target=bfdname] [-C] [--debugging] [-d] [-D] [--disassemble-zeroes] [-EB|-EL|--endian={big|little}] [-f] [-h] [-i|--info] [-j section | --section=section] [-l] [-m machine ] [--prefix-addresses] [-r] [-R] [-s|--full-contents] [-S|--source] [--[no-]show-raw-insn] [--stabs] [-t] [-T] [-x] [--start-address=address] [--stop-address=address] [--adjust-vma=offset] [--version] [--help] objfile... 下面講解常用的選項(xiàng): -b bfdname或--target=bfdname選項(xiàng):指定目標(biāo)碼格式。這不是必須的,arm-linux-objdump能自動(dòng)識(shí)別許多格式。可以使用 "arm-linux-objdump –i"命令查看支持的目標(biāo)碼格式列表。 --disassemble或-d選項(xiàng):反匯編可執(zhí)行段(executable sections)。 --disassemble-all或-D選擇:與-d 類似,反匯編所有段。 -EB或-EL或--endian={big|little}選項(xiàng):指定字節(jié)序。 --file-headers或-f選項(xiàng):顯示文件的整體頭部摘要信息。 --section-headers、--headers或-h選項(xiàng):顯示目標(biāo)文件各個(gè)段的頭部摘要信息。
上一篇:Exynos4412芯片的時(shí)鐘管理單元
下一篇:linux系統(tǒng)學(xué)習(xí)1-8:第1個(gè)ARM裸板程序及引申
推薦閱讀
史海拾趣
在電子行業(yè)的激烈競(jìng)爭(zhēng)中,D+H Mechatronic AG公司憑借其在精密機(jī)械與電子技術(shù)結(jié)合領(lǐng)域的深厚積累,成功研發(fā)出一款具有劃時(shí)代意義的智能機(jī)械臂。這款機(jī)械臂不僅具有高精度、高速度的運(yùn)動(dòng)性能,還能通過(guò)智能算法實(shí)現(xiàn)自主學(xué)習(xí)和優(yōu)化操作路徑。這一技術(shù)的突破為公司在工業(yè)自動(dòng)化領(lǐng)域贏得了極高的聲譽(yù),也為其后續(xù)的市場(chǎng)拓展奠定了堅(jiān)實(shí)的基礎(chǔ)。
企業(yè)文化是企業(yè)的靈魂和核心競(jìng)爭(zhēng)力之一。DDD公司一直注重企業(yè)文化的建設(shè)和發(fā)展。公司倡導(dǎo)“創(chuàng)新、協(xié)作、務(wù)實(shí)、進(jìn)取”的企業(yè)精神,鼓勵(lì)員工勇于創(chuàng)新、敢于擔(dān)當(dāng)、追求卓越。同時(shí),DDD公司還注重員工培訓(xùn)和福利待遇的改善,為員工提供了廣闊的發(fā)展空間和良好的工作環(huán)境。這種積極向上的企業(yè)文化氛圍使得DDD公司成為了一個(gè)充滿活力和凝聚力的團(tuán)隊(duì)。
為了進(jìn)一步擴(kuò)大市場(chǎng)份額和品牌影響力,長(zhǎng)江微電積極尋求與業(yè)內(nèi)知名分銷商的合作。基于對(duì)世強(qiáng)先進(jìn)O2O技術(shù)分銷模式的信賴與認(rèn)可,長(zhǎng)江微電與世強(qiáng)先進(jìn)(深圳)科技股份有限公司簽署了授權(quán)代理協(xié)議。雙方將攜手合作,共同為用戶提供車規(guī)級(jí)電感、車規(guī)級(jí)耦合電感等全線產(chǎn)品。這一合作不僅豐富了世強(qiáng)硬創(chuàng)平臺(tái)電子元器件產(chǎn)品的品類及信息,也為長(zhǎng)江微電的市場(chǎng)拓展提供了有力支持。
Dover Corporation自上市以來(lái),一直保持著持續(xù)盈利和向投資者發(fā)放紅利的記錄。公司憑借其強(qiáng)大的業(yè)務(wù)能力和穩(wěn)健的財(cái)務(wù)狀況,贏得了投資者的信任和支持。這一成績(jī)的取得不僅彰顯了Dover在業(yè)務(wù)運(yùn)營(yíng)方面的實(shí)力,也為其未來(lái)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
請(qǐng)注意,以上故事框架僅為概述性質(zhì),具體細(xì)節(jié)和數(shù)據(jù)可能需要根據(jù)Dover Corporation的實(shí)際情況進(jìn)行調(diào)整和補(bǔ)充。
在全球環(huán)保意識(shí)日益增強(qiáng)的背景下,F(xiàn)ERYSTER公司積極響應(yīng)環(huán)保號(hào)召,推動(dòng)企業(yè)的綠色轉(zhuǎn)型。公司采用環(huán)保材料替代傳統(tǒng)材料,優(yōu)化生產(chǎn)工藝減少能源消耗和廢棄物排放。此外,公司還積極推廣綠色電子產(chǎn)品,引導(dǎo)消費(fèi)者關(guān)注環(huán)保問(wèn)題。這些努力不僅提升了公司的社會(huì)形象,也為公司帶來(lái)了更多的商業(yè)機(jī)會(huì)。
Warning: Can\'t find signal in vector source file for input pin |whole|clk10m原因:因?yàn)槟愕牟ㄐ畏抡嫖募?vector source file )中并沒(méi)有把所有的輸入信號(hào)(input pin)加進(jìn)去,對(duì)于每一個(gè)輸入都需要有激勵(lì)源的… 查看全部問(wèn)答∨ |
|
WinCE5.0內(nèi)存映射文件操作的疑惑, 有這么一段程序: // 設(shè)定內(nèi)存映射大小、偏移量等參數(shù) __int64 qwFileSize = 0xD59F80;//文件的最大字節(jié)數(shù)13.3MB(0xD59F80)/64MB(0x4000000)/128MB(0x8000000) __int64 qwFileOffset = 0; & ...… 查看全部問(wèn)答∨ |
|
我不是計(jì)算機(jī)科班畢業(yè)。硬件知識(shí)一點(diǎn)不懂,不過(guò)軟件沒(méi)問(wèn)題(自學(xué)的)。現(xiàn)在在一家軟件公司作開(kāi)發(fā),想學(xué)嵌入式。怎么入手,看什么書(shū)?先學(xué)什么?詳細(xì)點(diǎn)。給分了… 查看全部問(wèn)答∨ |
我在他的AD上外部接了干電池, 我把電壓調(diào)整到2.8V,采樣250次后 我看數(shù)據(jù), 發(fā)現(xiàn)數(shù)據(jù) 從3470----3420 的數(shù)據(jù)都有,真的叫人郁悶 請(qǐng)問(wèn)香主 他的誤差有那么大么.我把電路貼出來(lái), 不知道那位采的數(shù)據(jù)精確點(diǎn)啊… 查看全部問(wèn)答∨ |
這里基本上包括了網(wǎng)上所有有用的SVPWM資料,只要一鍵就可以得到所有的資料。看咱們論壇這方面的資料比較就上傳上來(lái)供大家學(xué)習(xí)! 具體內(nèi)容如下: 代碼如下: [ 本帖最后由 fxw451 于 2011-4-12 15:05 編輯 ]… 查看全部問(wèn)答∨ |
|
我使用ST提供stm32f105-07_f2xx_usbhost_lib.zip的USB庫(kù)在我的板子中進(jìn)行測(cè)試時(shí),板子作為從設(shè)備。用它提供的例程從設(shè)備作為HID設(shè)備時(shí),我不管如何插、拔USB時(shí),電腦都能識(shí)別設(shè)備。當(dāng)從使用VCP例程時(shí),使用JLink進(jìn)行仿真,點(diǎn)擊RUN時(shí),插入U(xiǎn)SB設(shè)備, ...… 查看全部問(wèn)答∨ |
2個(gè)FPGA例程,LED流水燈和4位計(jì)數(shù)器 例程已經(jīng)在板子上跑過(guò)了,附帶詳細(xì)解釋 syn_cnter_4.qpf4位計(jì)數(shù)器led_w.qpfLED流水燈,方向固定… 查看全部問(wèn)答∨ |
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 英飛凌微控制器:以全新實(shí)惠套件和強(qiáng)大開(kāi)發(fā)環(huán)境為開(kāi)發(fā)者提供支持
- iTOP-i.MX6開(kāi)發(fā)板設(shè)備數(shù)驅(qū)動(dòng)Menuconfig的用法
- 迅為IMX6ULL開(kāi)發(fā)板Qt for Android搭建開(kāi)發(fā)環(huán)境
- 迅為i.MX8M mini開(kāi)發(fā)板Windots QT系統(tǒng)開(kāi)發(fā)環(huán)境搭建
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開(kāi)發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開(kāi)發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)設(shè)置開(kāi)機(jī)自啟動(dòng)
- 迅為IMX6Q開(kāi)發(fā)板 Buildroot文件系統(tǒng)mqtt測(cè)試
- 英特爾被曝向臺(tái)積電下達(dá) 2nm 晶圓代工訂單,成為該制程首批客戶
- Akamai 研究發(fā)現(xiàn):在亞太地區(qū)及日本,AI 驅(qū)動(dòng)的應(yīng)用程序遭受了 510 億次 Web 攻擊,年同比增長(zhǎng)達(dá) 73%
- 汽車顯示屏——第1部分:TFT LCD、OLED和micro-LED顯示屏基本原理
- 英特爾首秀上海車展:以“芯”賦能,攜手合作伙伴推動(dòng)全車智能化
- 中國(guó)首個(gè)高速L3商用解決方案!華為新一代ADS 4正式發(fā)布
- 增強(qiáng)自主移動(dòng)機(jī)器人的安全性
- Cadence 推出業(yè)界首款 12800MT/s DDR5 MRDIMM Gen2 內(nèi)存 IP 系統(tǒng)解決方案
- 消息稱英特爾本周內(nèi)公布 20%+ 大裁員計(jì)劃
- 盤(pán)點(diǎn)慕尼黑電子展上那些火熱的機(jī)器人技術(shù)和產(chǎn)品
- AI算力狂飆下的能源困局,ST如何突圍?
- 瑞薩電子RL78/G14 demo板低價(jià)開(kāi)團(tuán) 19.9元包郵
- 停工停課不停學(xué)!羅姆R課堂正式上線
- 【搜集令】曬曬你收藏的經(jīng)典模擬電路!!!
- elexcon 2024 深圳國(guó)際電子展報(bào)名通道開(kāi)啟!參與贏京東卡!
- 西門(mén)子電子書(shū)下載《PCB 制造流程 - 通過(guò)數(shù)字化轉(zhuǎn)型進(jìn)行優(yōu)化》
- 成都站報(bào)名 | Keysight 高速互聯(lián)技術(shù)研討會(huì)
- 美信基礎(chǔ)模擬IC APP下載 助力您創(chuàng)新模擬設(shè)計(jì)!評(píng)論、搶樓全有禮!
- 家電市場(chǎng)競(jìng)爭(zhēng)白熱化_白強(qiáng)黑弱的家電局面新趨勢(shì)
- 國(guó)產(chǎn)AGV行業(yè)興起,最終會(huì)毀于價(jià)格戰(zhàn)嗎?
- 人工智能時(shí)代,如何做到內(nèi)容為王?
- 雄安新區(qū)開(kāi)展“鏈上雄安”,超前布局區(qū)塊鏈項(xiàng)目
- 手機(jī)廠商將開(kāi)啟機(jī)器換人潮,電子廠工人何去何從?
- ATmega88 看門(mén)狗定時(shí)器
- ATmega88 中斷向量
- ATmega88 SPI數(shù)據(jù)模式與時(shí)序
- ATmega88 片上調(diào)試系統(tǒng)
- 全球半導(dǎo)體聯(lián)盟(GSA)2021年度大獎(jiǎng)揭曉:張忠謀獲模范領(lǐng)袖獎(jiǎng)