資料介紹
本章主要介紹嵌入式應用程序的設計方法。本章中的一些實例程序是以ARM公司的Realview2.2為開發平臺。由于目前嵌入式應用環境相差非常大,這里主要是通過這些實例程序來更直接地介紹嵌入式應用系統的開發方法,具體的代碼因具體的嵌入式環境不同而有所差異。
13.1 基于ARM處理器的嵌入式系統設計
ARM系列處理器是RISC(Reducded Instruction Set Computing)處理器。很多基于ARM的高效代碼的程序設計策略都源于RISC處理器。和很多RISC處理器一樣,ARM系列處理器的內存訪問也要求數據對齊,即存取“字(Word)”數據時要求四字節對齊,地址的bits[1:0]=0b00;存取“半字(Halfwords)”時要求兩字節對齊,地址的bit[0]=0b0;存取“字節(Byte)”數據時要求該數據按其自然尺寸邊界(Natural Size Boundary)定位。
ARM編譯程序通常將全局變量對齊到自然尺寸邊界上,以便通過使用 LDR和STR指令有效地存取這些變量。
這種內存訪問方式與多數CISC(Complex Instruction Set Computing)體系結構不同,在CISC體系結構下,指令直接存取未對齊的數據。因而,當需要將代碼從CISC體系結構向 ARM處理器移植時,內存訪問的地址對齊問題必須予以注意。在RISC體系結構下,存取未對齊數據無論在代碼尺寸或是程序執行效率上,都將付出非常大的代價。
注意在ARM11處理器上,新增加了支持非內存對齊數據訪問的硬件,此結構在本章中不作討論。
下面將從4個方面詳細討論在ARM體系結構下的程序設計:
· 未對齊指針;
· 結構體中的未對齊字段;
· 用于半字存取的Load指令;
· 移植代碼并檢測非對齊存取。
13.1.1 未對齊的數據指針
C和C++編程標準規定,指向某一數據類型的指針,必須和該類型的數據地址對齊方式一致,所以ARM編譯器期望程序中的C指針指向存儲器中字對齊地址,因為這可使編譯器生成更高效的代碼。
比如,如果定義一個指向int數據類型的指針,用該指針讀取一個字,ARM 編譯器將使用LDR指令來完成此操作。如果讀取的地址為4的倍數(即在一個字的邊界)即能正確讀取。但是,如果該地址不是4的倍數,那么,一條LDR指令返回一個循環移位結果,而不是執行真正的未對齊字載入。循環移位結果取決于該地址相對于字的邊界的偏移量和系統所使用的端序(Endianness)。例如,如果代碼要求從指針指向的地址0x8006載入數據,即要載入0x8006、0x8007、0x8008和0x8009 4個字節的內容。但是,在ARM處理器上,這個存取操作載入了0x8004、0x8005、0x8006和0x8007字節的內容。這就是在未對齊的地址上使用指針存取所得到的循環移位結果。
因而,如果想將指針定義到一個指定地址(該地址為非自然邊界對齊),那么在定義該指針時,必須使用__packed限定符來定義指針:
例如:
__packed int *pi; // 指針指向一個非字對其內存地址
使用了__packed限定符限定之后,ARM編譯器將產生字節存取命令(LDRB或STRB指令)來存取內存,這樣就不必考慮指針對齊問題。所生成的代碼是字節存取的一個序列,或者取決于編譯選項、跟變量對齊相關的移位和屏蔽。但這會導致系統性能和代碼密度的損失。
值得注意的是,不能使用__packed限定的指針來存取存儲器映射的外圍寄存器,因為ARM編譯程序可使用多個存儲器存取來獲取數據。因而,可以對實際存取地址附近的位置進行存取,而這些附近的位置可能對應于其他外部寄存器。當使用了位字段(Bitfield)時,ARM程序將訪問整個結構體,而非指定字段。
13.1.2 結構體中未對齊字段
與全局變量位于其自然尺寸邊界相同,結構體(Structure)中的域字段(Filed)也如此。也就是說編譯程序經常要在字段間插入填充字節(Padding)來確保域字段對齊。當編譯程序插入填充字節時,編譯器將產生以下警告信息。
#1301-D: padding inserted in struct mystruct
可以使用-remark編譯選項使編譯器產生備份信息,或使用-diag_warning選項選擇編譯器產生的備份信息。
如果不希望編譯器產生填充字節,可以使用__packed限定符來創建字段之間沒有填充字節的結構,且這些結構需要非對齊存取。
如果ARM編譯器能夠確定所訪問結構體的對齊方式,那么它就可以自動識別所存取結構體中的字段的對齊方式。在這些情況下,編譯程序盡可能地采用更有效的對齊字或半字存取方式。否則,編譯器將使用多個對齊存儲器存取(LDR、STR、LDM和STM)與固定移位和屏蔽相結合來存取存儲器中的字節。
對非對齊元素的存取是通過內聯還是通過調用一個函數來完成,由編譯程序-Ospace(默認,調用一個函數)和-Otime(執行非對齊存取內聯)選項來控制。
例如:
創建一個名為foo.c源文件。
__packed struct mystruct {
int aligned_i;
short aligned_s;
int unaligned_i;
};
struct mystruct S1;
int foo (int a, short b)
{
S1.aligned_i=a;
S1.aligned_s=b;
return S1.unaligned_i;
}
使用armcc -c -Otime foo.c編譯。所生成的代碼為:
MOV r2,r0
LDR r0,|L1.84|
MOV r12,r2,LSR #8
STRB r2,[r0,#0]
STRB r12,[r0,#1]
MOV r12,r2,LSR #16
STRB r12,[r0,#2]
MOV r12,r2,LSR #24
STRB r12,[r0,#3]
MOV r12,r1,LSR #8
STRB r1,[r0,#4]
STRB r12,[r0,#5]
ADD r0,r0,#6
BIC r3,r0,#3
AND r0,r0,#3
LDMIA r3,{r3,r12}
MOV r0,r0,LSL #3
MOV r3,r3,LSR r0
RSB r0,r0,#0x20
ORR r0,r3,r12,LSL r0
BX lr
其中,“|L1.84|”為結構體mystruct在內存中的地址。
從上例可以看出,所有對結構體域成員的訪問都是通過字節訪問實現的,所以這種不對齊內存訪問無論從代碼占用的存儲器空間,還是代碼的執行時間上都要付出一定的代價。
然而,開發者可以給編譯器提供更多的信息,使其知道結構體內哪個字段是對齊的,哪個字段不是。為此,必須將未對齊字段聲明為__packed,并從struct本身除去__packed屬性。通過這種方法可以保證對struct中自然對齊成員的快速訪問。而且,哪個字段是未對齊的也更清楚,但這樣就增加了訪問struct結構的難度,當用戶從結構中增加或刪除字段時需要特別小心。
修改上例中結構體的定義,來減少訪問結構體的開銷。具體代碼如下所示。
struct mystruct {
int aligned_i;
short aligned_s;
__packed int unaligned_i;
};
struct mystruct S1;
對修改后的程序進行編譯,產生的匯編代碼如下所示。
MOV r2,r0
LDR r0,|L1.32|
STR r2,[r0,#0]
STRH r1,[r0,#4]
LDMIB r0,{r3,r12}
MOV r0,r3,LSR #16
ORR r0,r0,r12,LSL #16
BX lr
從編譯后的匯編代碼不難看出,對結構體內符號自然邊界對齊的域,編譯器直接使用相應的Load/Store指令進行訪問,而只有那些非自然邊界對齊的域,編譯器才進行附加處理。這樣,從時間和空間兩方面減小了程序的開銷。
同一原理也適應于聯合體結構(unions)。使用在存儲器中未對齊的聯合組件的__packed屬性。
13.1.3 用于半字存取的非對齊 LDR指令
一些特殊情況下,ARM編譯程序可以生成非對齊LDR指令。特別是編譯程序從存儲器中載入半字時將使用該方法。這是因為,通過使用相應地址,所需的半字可以載入到寄存器的高半段(bits[31:16]),然后通過移位,將有效數據移到寄存器的低半段(bits[15:0])。這樣做的目的是通過減少內存訪問次數來減少程序的執行時間。通過上面的方法,程序只需要一次存儲器的訪問,而使用LDRB指令做同樣的操作需要兩次存儲器的存取,而且還要為將這兩個字節合并在一起添加特殊的代碼。在ARM體系結構v3和其早期版本中,通常使用該方法進行所有的半字載入。但在ARMv4及其以后版本中,出現了專門的半字載入指令,這種方法逐漸被取代。但是,非對齊LDR指令仍可能會出現,比如在一個充填結構中存取一個非對齊short域類型。
注意在RVCT中已經不再支持ARMv3架構。
13.1.4 移植代碼并檢測非對齊內存訪問
在非RISC體系結構的處理器上執行的代碼中,可能會存在使用指針訪問非自然邊界對齊的數據類型。這種操作,在ARM體系結構中是不允許的。這就給代碼的移植帶來很大困難。用戶必須識別并更改此類內存訪問代碼才能使其在RISC體系結構的處理器上正確執行。
識別非對齊存取可能會很困難,因為使用非對齊地址進行的載入或存儲操作會產生不正確的動作。追蹤到底是哪部分的C源程序造成了這個問題是很困難的。
具有完整存儲器管理單元(MMUs)的ARM處理器,例如ARM920TTM,支持內存對齊檢測功能,用戶可以通過設置MMU使處理器檢測每一次的內存訪問以確保其被正確地對齊。如果出現非對齊內存訪問,MMU將產生數據中斷。這樣就給追蹤出錯代碼帶來了很大的方便。
對于一些簡單的沒有MMU的內核,如ARM7TDMI,最好的方法是在ASIC(Application Specific Integrated Circuit)/ASSP(Application Specific Standard Product)內部實現對齊檢測。可以增加專門的ARM內核擴展硬件,由其監控每次數據的訪問的內存大小和存取地址總線的最低有效位。在非對齊存取的情況下,可以通過配置ASIC/ASSP產生中斷信號(ABORT)。ARM公司建議在需要運行移植代碼設備中包含這樣的ASIC/ASSP邏輯。
如果在設計系統時,將系統設計成為當出現非對齊的內存訪問時產生異常,則必須安裝數據中斷異常處理程序(Data Abort Handler)。出現非對齊存取時,程序進入數據中斷處理程序,并由此識別位于返回地址(在LR中保存的地址)減8(r14-8)的出錯數據存取指令。
一旦出現數據中斷異常,必須通過改變C源程序來修復非對齊的數據訪問。使用下列指令可有條件地完成修復:
#ifdef __arm
#define PACKED __packed
#else
#define PACKED
#endif
:
PACKED int *pi;
:
由于代碼大小和性能上的開銷,最好盡可能少采用存取非對齊數據。
ARM編譯器支持--pointer_alignment和--min_array_alignment與內存對齊相關的編譯選項,詳見ARM相關文檔。
?
13.1 基于ARM處理器的嵌入式系統設計
ARM系列處理器是RISC(Reducded Instruction Set Computing)處理器。很多基于ARM的高效代碼的程序設計策略都源于RISC處理器。和很多RISC處理器一樣,ARM系列處理器的內存訪問也要求數據對齊,即存取“字(Word)”數據時要求四字節對齊,地址的bits[1:0]=0b00;存取“半字(Halfwords)”時要求兩字節對齊,地址的bit[0]=0b0;存取“字節(Byte)”數據時要求該數據按其自然尺寸邊界(Natural Size Boundary)定位。
ARM編譯程序通常將全局變量對齊到自然尺寸邊界上,以便通過使用 LDR和STR指令有效地存取這些變量。
這種內存訪問方式與多數CISC(Complex Instruction Set Computing)體系結構不同,在CISC體系結構下,指令直接存取未對齊的數據。因而,當需要將代碼從CISC體系結構向 ARM處理器移植時,內存訪問的地址對齊問題必須予以注意。在RISC體系結構下,存取未對齊數據無論在代碼尺寸或是程序執行效率上,都將付出非常大的代價。
注意在ARM11處理器上,新增加了支持非內存對齊數據訪問的硬件,此結構在本章中不作討論。
下面將從4個方面詳細討論在ARM體系結構下的程序設計:
· 未對齊指針;
· 結構體中的未對齊字段;
· 用于半字存取的Load指令;
· 移植代碼并檢測非對齊存取。
13.1.1 未對齊的數據指針
C和C++編程標準規定,指向某一數據類型的指針,必須和該類型的數據地址對齊方式一致,所以ARM編譯器期望程序中的C指針指向存儲器中字對齊地址,因為這可使編譯器生成更高效的代碼。
比如,如果定義一個指向int數據類型的指針,用該指針讀取一個字,ARM 編譯器將使用LDR指令來完成此操作。如果讀取的地址為4的倍數(即在一個字的邊界)即能正確讀取。但是,如果該地址不是4的倍數,那么,一條LDR指令返回一個循環移位結果,而不是執行真正的未對齊字載入。循環移位結果取決于該地址相對于字的邊界的偏移量和系統所使用的端序(Endianness)。例如,如果代碼要求從指針指向的地址0x8006載入數據,即要載入0x8006、0x8007、0x8008和0x8009 4個字節的內容。但是,在ARM處理器上,這個存取操作載入了0x8004、0x8005、0x8006和0x8007字節的內容。這就是在未對齊的地址上使用指針存取所得到的循環移位結果。
因而,如果想將指針定義到一個指定地址(該地址為非自然邊界對齊),那么在定義該指針時,必須使用__packed限定符來定義指針:
例如:
__packed int *pi; // 指針指向一個非字對其內存地址
使用了__packed限定符限定之后,ARM編譯器將產生字節存取命令(LDRB或STRB指令)來存取內存,這樣就不必考慮指針對齊問題。所生成的代碼是字節存取的一個序列,或者取決于編譯選項、跟變量對齊相關的移位和屏蔽。但這會導致系統性能和代碼密度的損失。
值得注意的是,不能使用__packed限定的指針來存取存儲器映射的外圍寄存器,因為ARM編譯程序可使用多個存儲器存取來獲取數據。因而,可以對實際存取地址附近的位置進行存取,而這些附近的位置可能對應于其他外部寄存器。當使用了位字段(Bitfield)時,ARM程序將訪問整個結構體,而非指定字段。
13.1.2 結構體中未對齊字段
與全局變量位于其自然尺寸邊界相同,結構體(Structure)中的域字段(Filed)也如此。也就是說編譯程序經常要在字段間插入填充字節(Padding)來確保域字段對齊。當編譯程序插入填充字節時,編譯器將產生以下警告信息。
#1301-D: padding inserted in struct mystruct
可以使用-remark編譯選項使編譯器產生備份信息,或使用-diag_warning選項選擇編譯器產生的備份信息。
如果不希望編譯器產生填充字節,可以使用__packed限定符來創建字段之間沒有填充字節的結構,且這些結構需要非對齊存取。
如果ARM編譯器能夠確定所訪問結構體的對齊方式,那么它就可以自動識別所存取結構體中的字段的對齊方式。在這些情況下,編譯程序盡可能地采用更有效的對齊字或半字存取方式。否則,編譯器將使用多個對齊存儲器存取(LDR、STR、LDM和STM)與固定移位和屏蔽相結合來存取存儲器中的字節。
對非對齊元素的存取是通過內聯還是通過調用一個函數來完成,由編譯程序-Ospace(默認,調用一個函數)和-Otime(執行非對齊存取內聯)選項來控制。
例如:
創建一個名為foo.c源文件。
__packed struct mystruct {
int aligned_i;
short aligned_s;
int unaligned_i;
};
struct mystruct S1;
int foo (int a, short b)
{
S1.aligned_i=a;
S1.aligned_s=b;
return S1.unaligned_i;
}
使用armcc -c -Otime foo.c編譯。所生成的代碼為:
MOV r2,r0
LDR r0,|L1.84|
MOV r12,r2,LSR #8
STRB r2,[r0,#0]
STRB r12,[r0,#1]
MOV r12,r2,LSR #16
STRB r12,[r0,#2]
MOV r12,r2,LSR #24
STRB r12,[r0,#3]
MOV r12,r1,LSR #8
STRB r1,[r0,#4]
STRB r12,[r0,#5]
ADD r0,r0,#6
BIC r3,r0,#3
AND r0,r0,#3
LDMIA r3,{r3,r12}
MOV r0,r0,LSL #3
MOV r3,r3,LSR r0
RSB r0,r0,#0x20
ORR r0,r3,r12,LSL r0
BX lr
其中,“|L1.84|”為結構體mystruct在內存中的地址。
從上例可以看出,所有對結構體域成員的訪問都是通過字節訪問實現的,所以這種不對齊內存訪問無論從代碼占用的存儲器空間,還是代碼的執行時間上都要付出一定的代價。
然而,開發者可以給編譯器提供更多的信息,使其知道結構體內哪個字段是對齊的,哪個字段不是。為此,必須將未對齊字段聲明為__packed,并從struct本身除去__packed屬性。通過這種方法可以保證對struct中自然對齊成員的快速訪問。而且,哪個字段是未對齊的也更清楚,但這樣就增加了訪問struct結構的難度,當用戶從結構中增加或刪除字段時需要特別小心。
修改上例中結構體的定義,來減少訪問結構體的開銷。具體代碼如下所示。
struct mystruct {
int aligned_i;
short aligned_s;
__packed int unaligned_i;
};
struct mystruct S1;
對修改后的程序進行編譯,產生的匯編代碼如下所示。
MOV r2,r0
LDR r0,|L1.32|
STR r2,[r0,#0]
STRH r1,[r0,#4]
LDMIB r0,{r3,r12}
MOV r0,r3,LSR #16
ORR r0,r0,r12,LSL #16
BX lr
從編譯后的匯編代碼不難看出,對結構體內符號自然邊界對齊的域,編譯器直接使用相應的Load/Store指令進行訪問,而只有那些非自然邊界對齊的域,編譯器才進行附加處理。這樣,從時間和空間兩方面減小了程序的開銷。
同一原理也適應于聯合體結構(unions)。使用在存儲器中未對齊的聯合組件的__packed屬性。
13.1.3 用于半字存取的非對齊 LDR指令
一些特殊情況下,ARM編譯程序可以生成非對齊LDR指令。特別是編譯程序從存儲器中載入半字時將使用該方法。這是因為,通過使用相應地址,所需的半字可以載入到寄存器的高半段(bits[31:16]),然后通過移位,將有效數據移到寄存器的低半段(bits[15:0])。這樣做的目的是通過減少內存訪問次數來減少程序的執行時間。通過上面的方法,程序只需要一次存儲器的訪問,而使用LDRB指令做同樣的操作需要兩次存儲器的存取,而且還要為將這兩個字節合并在一起添加特殊的代碼。在ARM體系結構v3和其早期版本中,通常使用該方法進行所有的半字載入。但在ARMv4及其以后版本中,出現了專門的半字載入指令,這種方法逐漸被取代。但是,非對齊LDR指令仍可能會出現,比如在一個充填結構中存取一個非對齊short域類型。
注意在RVCT中已經不再支持ARMv3架構。
13.1.4 移植代碼并檢測非對齊內存訪問
在非RISC體系結構的處理器上執行的代碼中,可能會存在使用指針訪問非自然邊界對齊的數據類型。這種操作,在ARM體系結構中是不允許的。這就給代碼的移植帶來很大困難。用戶必須識別并更改此類內存訪問代碼才能使其在RISC體系結構的處理器上正確執行。
識別非對齊存取可能會很困難,因為使用非對齊地址進行的載入或存儲操作會產生不正確的動作。追蹤到底是哪部分的C源程序造成了這個問題是很困難的。
具有完整存儲器管理單元(MMUs)的ARM處理器,例如ARM920TTM,支持內存對齊檢測功能,用戶可以通過設置MMU使處理器檢測每一次的內存訪問以確保其被正確地對齊。如果出現非對齊內存訪問,MMU將產生數據中斷。這樣就給追蹤出錯代碼帶來了很大的方便。
對于一些簡單的沒有MMU的內核,如ARM7TDMI,最好的方法是在ASIC(Application Specific Integrated Circuit)/ASSP(Application Specific Standard Product)內部實現對齊檢測。可以增加專門的ARM內核擴展硬件,由其監控每次數據的訪問的內存大小和存取地址總線的最低有效位。在非對齊存取的情況下,可以通過配置ASIC/ASSP產生中斷信號(ABORT)。ARM公司建議在需要運行移植代碼設備中包含這樣的ASIC/ASSP邏輯。
如果在設計系統時,將系統設計成為當出現非對齊的內存訪問時產生異常,則必須安裝數據中斷異常處理程序(Data Abort Handler)。出現非對齊存取時,程序進入數據中斷處理程序,并由此識別位于返回地址(在LR中保存的地址)減8(r14-8)的出錯數據存取指令。
一旦出現數據中斷異常,必須通過改變C源程序來修復非對齊的數據訪問。使用下列指令可有條件地完成修復:
#ifdef __arm
#define PACKED __packed
#else
#define PACKED
#endif
:
PACKED int *pi;
:
由于代碼大小和性能上的開銷,最好盡可能少采用存取非對齊數據。
ARM編譯器支持--pointer_alignment和--min_array_alignment與內存對齊相關的編譯選項,詳見ARM相關文檔。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 嵌入式軟件開發的特點、設計流程、嵌入式軟件的結構
- 嵌入式軟件開發做什么?嵌入式開發培訓學哪些
- 嵌入式軟件開發是什么??
- 嵌入式軟件開發環境
- 嵌入式控制系統的ARM處理器
- ARM處理器與嵌入式系統
- 基于ARM的嵌入式Web服務器設計方案 20次下載
- 嵌入式系統教程之嵌入式處理器的詳細資料說明 18次下載
- 嵌入式教程之嵌入式系統基礎的詳細資料說明 30次下載
- ARM主板,嵌入式主板,ARM工控主板,嵌入式工控機控制系統的人機界面組態軟件開發方案 21次下載
- 嵌入式軟件開發概述 1次下載
- 嵌入式軟件技術應用設計方案匯總 4次下載
- ARM嵌入式軟件開發 64次下載
- 嵌入式軟件開發與Embedded-GIS 36次下載
- 基于ARM的嵌入式系統軟件設計
- 什么是嵌入式微處理器?嵌入式微處理器有哪些? 729次閱讀
- 嵌入式軟件開發和軟件開發的區別 1738次閱讀
- 基于UML嵌入式軟件開發環境的自動取款機系統的應用方案 3608次閱讀
- 基于嵌入式軟件的JNI技術應用解析 1020次閱讀
- 關于嵌入式ARM多核處理器的并行方法 4127次閱讀
- 嵌入式軟件開發編程規范介紹 4206次閱讀
- 嵌入式軟件工程師職業規劃必知 6346次閱讀
- 嵌入式開發和底層開發有什么區別 1.5w次閱讀
- 以MicroBlaze 處理器為內核的嵌入式系統開發過程詳解 2360次閱讀
- 液晶顯示屏設計方案:基于Nios嵌入式軟核處理器 1081次閱讀
- 嵌入式開發工具有哪些_五款嵌入式開發工具推薦 4w次閱讀
- 嵌入式處理器匯總_常見的嵌入式處理器對比分析 1.4w次閱讀
- 嵌入式開發環境的搭建 8304次閱讀
- 32位嵌入式處理器與8位處理器應用開發的區別 1528次閱讀
- 基于ARM的嵌入式無線視頻采集系統設計 1809次閱讀
下載排行
本周
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 137次下載 | 1 積分
- 2PCB布線和布局電路設計規則
- 0.40 MB | 4次下載 | 免費
- 3TPS6287B25降壓轉換器評估模塊
- 3.46MB | 1次下載 | 免費
- 4INA226EVM用戶指南
- 4.7MB | 1次下載 | 免費
- 5INA226EVM修訂版A模型用戶指南和軟件教程
- 2.28MB | 1次下載 | 免費
- 6Altium Designer印刷電路板設計與制作PDF電子書免費下載
- 14.11 MB | 0次下載 | 3 積分
- 7DLPC3470和DLPC3478軟件編程人員指南
- 1.68MB | 次下載 | 免費
- 8TPS1213-Q1智能高側驅動器評估模塊
- 1.63MB | 次下載 | 免費
本月
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 137次下載 | 1 積分
- 2新概念模擬電路第四冊信號處理電路電子書免費下載
- 10.69 MB | 60次下載 | 免費
- 3800VA純正弦波逆變器的參考設計
- 2.96MB | 34次下載 | 免費
- 4純電動汽?的主要部件及?作原理
- 5.76 MB | 15次下載 | 5 積分
- 5JESD79-5C_v1.30-2024 內存技術規范
- 2.71 MB | 10次下載 | 免費
- 6elmo直線電機驅動調試細則
- 4.76 MB | 9次下載 | 6 積分
- 7明偉電源模塊RSP-3000圖紙
- 0.30 MB | 8次下載 | 免費
- 8使用BQ76PL102系列電量計進行BQ78PL114的快速入門指南
- 4.04MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191366次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183329次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73805次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評論
查看更多