亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于CanFestival和μC/OS-II的CANopen平臺(tái)構(gòu)建*

        2014-09-06 10:49:55張錚程和生賴世勛
        關(guān)鍵詞:堆棧寄存器字典

        張錚,程和生,賴世勛

        (安徽省煤炭科學(xué)研究院 監(jiān)控技術(shù)中心,合肥 230001)

        ?

        基于CanFestival和μC/OS-II的CANopen平臺(tái)構(gòu)建*

        張錚,程和生,賴世勛

        (安徽省煤炭科學(xué)研究院 監(jiān)控技術(shù)中心,合肥 230001)

        基于開源的CANopen架構(gòu)CanFestival和嵌入式實(shí)時(shí)系統(tǒng)μC/OS-II,提出了一種構(gòu)建CANopen從站平臺(tái)的方法。詳細(xì)闡述CANopen協(xié)議棧的軟件結(jié)構(gòu)設(shè)計(jì),實(shí)現(xiàn)了μC/OS-II系統(tǒng)在MC9S12XF512上的移植,并將CANopen從站協(xié)議的狀態(tài)機(jī)封裝成任務(wù)后嵌入到μC/OS-II中運(yùn)行。該硬件平臺(tái)采用單片機(jī)MC9S12XF512和高速CAN總線收發(fā)器TJA1040來實(shí)現(xiàn)。通信測試表明CANopen從站通信穩(wěn)定,實(shí)現(xiàn)了DS301通信規(guī)范的功能。

        CANopen協(xié)議;μC/OS-II;CanFestival

        引 言

        CanFestival作為一個(gè)開源的CANopen架構(gòu),實(shí)現(xiàn)了CANopen通信規(guī)范DS301的基本協(xié)議,并且在不斷升級(jí)[1]。本文結(jié)合CANopen開源協(xié)議棧CanFestival,分析CANopen的協(xié)議結(jié)構(gòu)、對象字典和通信對象,實(shí)現(xiàn)了嵌入式操作系統(tǒng)μC/OS-II在Freescale微控制器MC9S12XF512上的移植;進(jìn)一步修改CAN總線的底層驅(qū)動(dòng)程序,將CANopen從站協(xié)議嵌入到μC/OS-II系統(tǒng)中,實(shí)現(xiàn)了一種CANopen從站平臺(tái)的方法。

        1 CANopen協(xié)議通信機(jī)制分析

        CANopen通信以CAN總線為基礎(chǔ),物理層遵循IS11898標(biāo)準(zhǔn),數(shù)據(jù)鏈路層遵循CAN2.0標(biāo)準(zhǔn),在應(yīng)用層上CANopen協(xié)議定義了一系列規(guī)范來實(shí)現(xiàn)高層通信,主要分為CANopen通信規(guī)范和CANopen設(shè)備規(guī)范。CANopen的通信規(guī)范主要包括DS301,DS301定義CANopen設(shè)備之間的通信方式和行為規(guī)范,所有設(shè)備必須實(shí)現(xiàn)DS301。 CANopen的設(shè)備規(guī)范則定義了特定類型設(shè)備進(jìn)入CAN總線的通信方式和功能。

        CANopen設(shè)備模型分為三個(gè)部分[2,5],如圖1所示。通信接口實(shí)現(xiàn)CANopen四種通信對象的功能,來實(shí)現(xiàn)不同數(shù)據(jù)的收發(fā),包括服務(wù)數(shù)據(jù)對象(SDO)、過程數(shù)據(jù)對象(PDO)、網(wǎng)絡(luò)管理對象(NMT)以及一些特殊功能對象(SYNC、TIME和EMCY)。

        圖1 CANopen設(shè)備模型

        CANopen設(shè)備最核心的部分是對象字典,它是一個(gè)有序的對象組,每個(gè)對象采用一個(gè)16位的索引值來尋址,同時(shí)為允許訪問數(shù)據(jù)結(jié)構(gòu)中的單個(gè)元素,定義一個(gè)8位的子索引[7-8]。對象字典中的對象可以是輸入輸出信號(hào)、設(shè)備功能以及網(wǎng)絡(luò)變量。在應(yīng)用程序中,CANopen主從站進(jìn)行連接,通過SDO對CANopen設(shè)備對象字典進(jìn)行配置,同時(shí)通過PDO進(jìn)行實(shí)時(shí)數(shù)據(jù)的通信。

        2 CANopen平臺(tái)構(gòu)建

        2.1 CAN總線通信硬件實(shí)現(xiàn)

        CANopen平臺(tái)的構(gòu)建使用飛思卡爾的芯片MC9S12XF512。CAN總線收發(fā)器采用TJA1040。如圖2所示,在CANH和CANL之間并聯(lián)兩個(gè)60 Ω的電阻并通過一個(gè)30 pF的小電容接地,從而濾除CAN總線上的高頻干擾。MSCAN控制器模塊上的TXD、RXD引腳與TJA1040的TXD、RXD相互連接,并通過TJA1040的CANH和CANL引腳接入到CAN總線網(wǎng)絡(luò)中。

        圖2 CAN總線接口硬件電路

        2.2 CANopen協(xié)議棧軟件設(shè)計(jì)

        整個(gè)CANopen協(xié)議棧的軟件設(shè)計(jì)遵循模塊化的原則,并依據(jù)協(xié)議棧的分層結(jié)構(gòu)按照以下三個(gè)相對獨(dú)立的部分來進(jìn)行設(shè)計(jì),包括操作系統(tǒng)及硬件驅(qū)動(dòng)接口層、CAN-open 通信協(xié)議層以及設(shè)備行規(guī)應(yīng)用層,如圖3所示。

        圖3 CANopen協(xié)議棧軟件結(jié)構(gòu)

        2.2.1 操作系統(tǒng)及硬件驅(qū)動(dòng)接口層

        底層提供操作系統(tǒng)與CAN總線驅(qū)動(dòng)接口,操作系統(tǒng)接口使得CANopen協(xié)議??梢郧度氲讲煌南到y(tǒng)中,實(shí)現(xiàn)任務(wù)的調(diào)度。CAN總線驅(qū)動(dòng)接口處理CAN總線的數(shù)據(jù)幀信息,獲得其中的有效數(shù)據(jù)進(jìn)行存儲(chǔ)并提供給上層通信對象使用?;贛C9S12XF512芯片的CAN總線驅(qū)動(dòng)程序主要包括CAN總線控制器初始化函數(shù)、CAN總線報(bào)文發(fā)送程序、CAN總線報(bào)文接收程序以及中斷函數(shù)的設(shè)置,其中初始化的內(nèi)容包括CAN總線波特率、濾波器的設(shè)置,CAN總線控制器時(shí)鐘的選擇。CAN總線驅(qū)動(dòng)中定義結(jié)構(gòu)體Message來存儲(chǔ)CAN總線的信息幀:

        typedef struct{

        SHORT_CAN cob-id;

        UNS8 rtr;

        UNS8 len;

        UNS8 data[8];

        }Message

        其中 32位的cob_id表示CAN幀ID值,兼容CAN2.0A/B;rtr表示是否為遠(yuǎn)程幀,0為數(shù)據(jù)幀,1為遠(yuǎn)程幀;len代表數(shù)據(jù)的長度,對應(yīng)CAN總線幀里DLC的數(shù)值;8字節(jié)數(shù)組data存儲(chǔ)CAN總線有效數(shù)據(jù)。 CAN總線驅(qū)動(dòng)接口將CAN總線底層驅(qū)動(dòng)的收發(fā)程序封裝在對應(yīng)于CanFestival的f_can_send和f_can_receive函數(shù)當(dāng)中,二者分別讀寫CAN總線收發(fā)程序的緩沖區(qū),獲取其中CAN總線數(shù)據(jù)cob_id、rtr、len、data的數(shù)值并存入到結(jié)構(gòu)體Message中。通過這種方式,在運(yùn)行高層協(xié)議時(shí),CANopen通信對象不需要關(guān)心底層驅(qū)動(dòng)的實(shí)現(xiàn)過程及執(zhí)行環(huán)境,從而將CANopen通信協(xié)議層和底層驅(qū)動(dòng)分隔開來,便于移植。

        2.2.2 CANopen通信協(xié)議層

        CANopen通信協(xié)議層實(shí)現(xiàn)協(xié)議4種通信對象的功能,每個(gè)設(shè)備獨(dú)立擁有一個(gè)對象字典,它作為通信對象與上層應(yīng)用程序的接口,存放著設(shè)備的配置參數(shù)和過程參數(shù),設(shè)備之間配置參數(shù)的通信通過SDO以客戶機(jī)/服務(wù)器的方式來實(shí)現(xiàn)。SDO提供基于請求和應(yīng)答的點(diǎn)對點(diǎn)通信,允許大于8字節(jié)的數(shù)據(jù)采用分段或分塊的方式傳輸。過程參數(shù)的通信通過PDO采用生產(chǎn)者/消費(fèi)者方式來實(shí)現(xiàn),數(shù)據(jù)從一個(gè)生產(chǎn)者傳到一個(gè)或者多個(gè)消費(fèi)者,且數(shù)據(jù)長度在8字節(jié)以內(nèi)。PDO在對象字典中通過通信參數(shù)規(guī)定該P(yáng)DO所使用的cob-id、傳輸類型、抑制時(shí)間等參數(shù),通過映射參數(shù)設(shè)置映射到PDO中的對象字典里的具體對象。時(shí)間標(biāo)記、同步、應(yīng)急等預(yù)定義的報(bào)文則可以提高網(wǎng)絡(luò)利用率,NMT用來實(shí)現(xiàn)節(jié)點(diǎn)狀態(tài)的轉(zhuǎn)移和錯(cuò)誤的控制。它采用主從結(jié)構(gòu),主節(jié)點(diǎn)對從節(jié)點(diǎn)進(jìn)行狀態(tài)管理和節(jié)點(diǎn)保護(hù),每個(gè)CANopen從節(jié)點(diǎn)以狀態(tài)機(jī)的方式接受主節(jié)點(diǎn)NMT對其狀態(tài)的切換。

        圖4 報(bào)文處理

        根據(jù)CANopen預(yù)定義連接集的描述,cob-id的高4位是用來區(qū)分不同通信對象的功能碼[2],報(bào)文接收到以后,通過判斷高4位功能碼來區(qū)分所接收到的通信對象,并通過一個(gè)指向函數(shù)的指針來調(diào)用相應(yīng)的函數(shù)對報(bào)文進(jìn)行處理,如圖4所示,通過接收中斷,CAN總線信息寫入到接收緩沖區(qū)后調(diào)用f_can_receive函數(shù),將CAN總線幀中的有效數(shù)據(jù)存入Message結(jié)構(gòu)體,而后通過ReceiveHandler函數(shù)讀取cob-id高4位功能碼,并根據(jù)不同的功能碼最終切換至4種通信對象的報(bào)文處理函數(shù)。

        2.2.3 對象字典的建立

        協(xié)議棧軟件的頂層主要包括對象字典的建立和訪問以及其他一些應(yīng)用包括節(jié)點(diǎn)反饋、網(wǎng)絡(luò)的設(shè)置等。由于CANopen對象字典采用主索引和子索引結(jié)構(gòu),二者形成天然的二維數(shù)組結(jié)構(gòu),因此協(xié)議棧對象字典的實(shí)現(xiàn)是基于數(shù)組和數(shù)組的變型。主索引和子索引不同的數(shù)組下標(biāo)在內(nèi)存中就代表索引數(shù)據(jù)距離對象字典首地址的偏移量,通過該偏移量,便可以訪問到對象字典中的數(shù)據(jù)。一個(gè)對象的信息應(yīng)該包括索引、子索引、數(shù)據(jù)、數(shù)據(jù)類型和訪問類型。這里通過定義兩個(gè)結(jié)構(gòu)體來表示主索引和子索引:

        typedef struct td_subindex{

        enum e_accessAttribute bAccessType;

        UNS8 bDataType;

        UNS8 size;

        void* pObject;

        } subindex;

        typedef struct td_indextable{

        subindex* pSubindex;

        UNS8 bSubCount;

        } indextable;

        其中bAccessType表示數(shù)據(jù)的訪問類型,分為只讀、只寫和可讀寫,bDataType表示數(shù)據(jù)類型,指針*pObject指向所包含的數(shù)據(jù),通過結(jié)構(gòu)體indextable來定義主索引,其中bSubCount表示此索引下子索引的數(shù)目。以對象字典中索引為1001H的錯(cuò)誤寄存器為例,其對象字典定義為:

        UNS8 OBJNAME = 0x0;

        subindex Index1001[] ={

        { RO, uint8, sizeof(UNS8), (void*)&OBJNAME }

        };

        3 μC/OS-II移植及CANopen的嵌入

        3.1 μC/OS-II在MC9S12XF512上的移植

        為了使μC/OS-II系統(tǒng)內(nèi)核能在某一特定的微控制器上運(yùn)行,必須對與處理器相關(guān)的代碼進(jìn)行修改。MC9S12XF512單片機(jī)有512 KB的片內(nèi)FLASH和 32 KB RAM[3],可以在占有資源相對較少的條件下,運(yùn)行操作系統(tǒng)的實(shí)時(shí)內(nèi)核。集成的開發(fā)環(huán)境CodeWarrior可以進(jìn)行程序的編譯、下載以及調(diào)試,提高了工作效率。由于μC/OS-II系統(tǒng)具有較強(qiáng)的可移植性,其移植工作主要是修改與處理器相關(guān)的代碼,包括OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM[4],因?yàn)镃odeWarrior支持C語言與匯編語言的混合編程,所以可將后兩個(gè)文件合成一個(gè)OS_CPU_C.C文件,以下從與移植相關(guān)的聲明和函數(shù)兩方面進(jìn)行代碼的修改。

        3.1.1 修改與移植相關(guān)的聲明

        在OS_CPU.H中定義了與編譯器有關(guān)的數(shù)據(jù)類型、開關(guān)中斷宏、堆棧的生長方向以及任務(wù)切換宏。在MC9S12中堆棧是按字節(jié)進(jìn)行操作,因此定義堆棧數(shù)據(jù)類型OS_STK為8位[6]。MC9S12處理器的堆棧是由高地址向低地址增長的,所以常量OS_STK_GROWTH設(shè)置為1。任務(wù)切換宏OS_TASK_SW()是在μC/OS-II從低優(yōu)先級(jí)任務(wù)切換到最高優(yōu)先級(jí)任務(wù)時(shí)被調(diào)用的,OS_TASK_SW()通過模擬一次中斷過程,在中斷返回的時(shí)候進(jìn)行任務(wù)切換。MC9S12提供了軟中斷源和陷阱中斷源,這兩個(gè)中斷源都可以使得處理器的寄存器狀態(tài)保存到將被掛起任務(wù)的堆棧中。由于芯片中不存在監(jiān)控程序,所以利用MC9S12XF512提供的軟中斷指令SWI來定義OS_TASK_SW(),并將其中斷服務(wù)程序的入口點(diǎn)指向OSCtxSw()。

        3.1.2 修改與處理器相關(guān)的函數(shù)

        (1) 任務(wù)切換函數(shù)

        任務(wù)級(jí)任務(wù)切換函數(shù)OSCtxSw()的任務(wù)是將當(dāng)前的CPU的狀態(tài)保存到正在運(yùn)行任務(wù)的堆棧中,然后將堆棧指針保存到任務(wù)控制塊中,之后運(yùn)行OSTaskSwHook()鉤子函數(shù),而后將任務(wù)控制變量OSTCBCur和OSPrioCur的值更改為即將要運(yùn)行的任務(wù)的屬性,從任務(wù)控制塊中得到將要運(yùn)行任務(wù)的堆棧指針賦給SP寄存器,最后運(yùn)行中斷返回指令。對于中斷級(jí)任務(wù)切換函數(shù),由于中斷服務(wù)函數(shù)已經(jīng)將CPU寄存器和中斷發(fā)生前正運(yùn)行的任務(wù)堆棧指針保存過,因此OSIntCtxSw()即是OSCtxSw()在調(diào)用鉤子函數(shù)的后半部分。在MC9S12中,當(dāng)中斷發(fā)生時(shí)芯片會(huì)將CPU寄存器推入堆棧,但是不會(huì)包括頁面管理寄存器,因此需要用匯編語言加入其入棧和出棧的操作:

        ldaa PPAGE

        psha //PPAGE入棧

        pula

        staa PPAGE //PPAGE出棧

        (2) 任務(wù)堆棧初始化函數(shù)

        任務(wù)堆棧初始化函數(shù)OSTaskStkInit()在創(chuàng)建任務(wù)的時(shí)候調(diào)用,用來在任務(wù)堆棧中按照一定順序初始化任務(wù)最初的數(shù)據(jù)。在MC9S12XF512芯片中,根據(jù)數(shù)據(jù)存放的順序,從高到低位對opt參數(shù)、PC寄存器、Y寄存器、X寄存器、D寄存器、CCR寄存器和PPAGE寄存器進(jìn)行初始化,并最后返回堆棧指針?biāo)赶虻牡刂贰F渲蠵C的值設(shè)置為任務(wù)的入口地址并存放兩次,第一個(gè)值是建立擴(kuò)展任務(wù)所需的; D的值初始化為參數(shù)pdata的值用來傳遞任務(wù)參數(shù);PPAGE則是用來存儲(chǔ)頁面寄存器的值。

        (3) 時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)

        和其他中斷服務(wù)程序一樣,首先OSTickISR()在被中斷任務(wù)堆棧中保存CPU的值,然后調(diào)用OSIntEnter(),使得中斷嵌套層數(shù)全局變量OSIntNesting加1。隨后通過調(diào)用OSTimeTick(),遍歷任務(wù)控制鏈表中的所有任務(wù)控制塊,把各自用來存放延時(shí)時(shí)限的OSTCBDly變量減1,若其計(jì)數(shù)值為0,則表明該任務(wù)進(jìn)入就緒狀態(tài),最后調(diào)用OSIntExit()標(biāo)志著時(shí)鐘節(jié)拍中斷服務(wù)子程序的結(jié)束。本次移植中時(shí)鐘節(jié)拍由硬件產(chǎn)生,必須設(shè)置好實(shí)時(shí)時(shí)鐘的控制寄存器,使得MC9S12芯片在產(chǎn)生相應(yīng)中斷后,調(diào)用處理程序。實(shí)時(shí)時(shí)鐘控制寄存器設(shè)置如下:

        RTICTL=0x49; //每秒產(chǎn)生100次中斷

        CRGINT|=0x80; //使能中斷

        μC/OS-II系統(tǒng)經(jīng)過上述修改后在MC9S12芯片中運(yùn)行起來。μC/OS-II的引入使得系統(tǒng)開發(fā)的效率得以提高,編寫程序時(shí),只要將相關(guān)的功能封裝成任務(wù),并根據(jù)任務(wù)的輕重緩急設(shè)定優(yōu)先級(jí),啟動(dòng)多任務(wù)環(huán)境后,由μC/OS-II來管理這些任務(wù)。

        3.2 μC/OS-II系統(tǒng)中嵌入CANopen

        狀態(tài)機(jī)作為CANopen協(xié)議整個(gè)操作流程的核心,其從站狀態(tài)機(jī)定義了4個(gè)基本狀態(tài):初始化、預(yù)操作、操作和停止,如圖3所示。執(zhí)行過程中,從站上電復(fù)位后由初始化狀態(tài)跳轉(zhuǎn)到預(yù)操作狀態(tài),等待主站控制命令的到來;主站是狀態(tài)機(jī)的控制者,從站待命后,主站發(fā)送命令切換各個(gè)從站的狀態(tài),從而在各個(gè)狀態(tài)下完成操作。為將CANopen協(xié)議嵌入到μC/OS-II中,需要將狀態(tài)機(jī)封裝成一個(gè)任務(wù):

        void CANopenTask(void *pdata){

        e_nodeState lastState=unknown_state;

        pdata=pdata;

        while(1){

        switch(getState()){

        case Initialisation:

        ……

        case Pre_operational:

        ……

        case Operational:

        ……

        case Stopped:

        ……

        }

        }

        }

        在主函數(shù)中,操作系統(tǒng)完成初始化、創(chuàng)建任務(wù)和啟動(dòng)任務(wù)的過程,通過OSTaskCreate()函數(shù)創(chuàng)建封裝好的CANopen從站任務(wù),最后通過OSStart()函數(shù),啟動(dòng)操作系統(tǒng),運(yùn)行任務(wù)。

        4 CANopen從站通信測試

        實(shí)驗(yàn)中將μC/OS-II上運(yùn)行的CANopen從站與主節(jié)點(diǎn)連接,按照以下流程進(jìn)行通信實(shí)驗(yàn)。在系統(tǒng)上電完成初始化后,從節(jié)點(diǎn)首先向主節(jié)點(diǎn)發(fā)送Boot-up報(bào)文,通知主節(jié)點(diǎn)已進(jìn)入Pre_operational狀態(tài)。從節(jié)點(diǎn)處于Pre_operational狀態(tài)時(shí),接收來自主節(jié)點(diǎn)的SDO報(bào)文對其對象字典進(jìn)行配置。當(dāng)從節(jié)點(diǎn)接收到主節(jié)點(diǎn)的NMT報(bào)文后,從節(jié)點(diǎn)進(jìn)入operational狀態(tài),此時(shí)主節(jié)點(diǎn)和從節(jié)點(diǎn)通過PDO進(jìn)行實(shí)時(shí)數(shù)據(jù)的交互。在operational狀態(tài)下,將從節(jié)點(diǎn)的TPDO1~3映射到主節(jié)點(diǎn)的RPDO1~3,以時(shí)間觸發(fā)和事件觸發(fā)方式分別進(jìn)行PDO傳送。通信實(shí)驗(yàn)表明平臺(tái)能夠完成DS301通信規(guī)范所定義的網(wǎng)絡(luò)管理、PDO和SDO報(bào)文收發(fā)以及同步報(bào)文發(fā)送等功能。

        [1] Francis Dupin CanFestival v2.03 Manual [OL]. [2013-07]. http:// www. canfestival.org.

        [2] CiA Draft Standard 301 Version 4.02, CANopen Application Layer and Communication Profile,2002.

        [3] Freescale Semiconductor Inc. MC9S12XF512 Reference Manual Rev.1.19,2010.

        [4] Labrosse J J.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II[M].2版.邵貝貝,譯.北京:北京航空航天大學(xué)出版社,2003:278-283.

        [5] Xu Zhe, Dong Shifeng. The Design and Implementation of a CANopen Slave Stack for Powertrain Controller in Hybrid Electric Vehicle [C]//International Conference on Intelligent Computation Technology and Automation,May 11-12, 2010:755-758.

        [6] 孫同景,陳桂友. Freescale 9S12十六位單片機(jī)原理與嵌入式開發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社,2008:389-391.

        [7] 陶維青,劉寧,余淼,等.基于DSP與CAN總線技術(shù)的饋線監(jiān)控終端開發(fā)[J].合肥工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2008,31(7):1016-1019.

        [8] 孫樹文,楊建武,張慧慧,等.基于CANopen協(xié)議的分布式控制系統(tǒng)I/O從站設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2007,15(12):1705-1707.

        Zhang Zheng,Cheng Hesheng,Lai Shixun

        (Monitoring Technology Center, Anhui Province Coal Science Research Institute, Hefei 230001,China)

        This paper presents a method for using MC9S12XF512 chip to construct a CANopen slave station based on μC/OS-II system and CanFestival open source stack, and illustrates the software design of CANopen protocol stack, the transplantation of μC/OS-II and the process of embedding CANopen slave stack to μC/OS-II. The communication test shows that the slave station realized the function of DS301 standard.

        CANopen protocol;μC/OS-II;CanFestival

        TP336

        A

        2013-07-15)

        猜你喜歡
        堆棧寄存器字典
        開心字典
        家教世界(2023年28期)2023-11-14 10:13:50
        開心字典
        家教世界(2023年25期)2023-10-09 02:11:56
        Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
        嵌入式軟件堆棧溢出的動(dòng)態(tài)檢測方案設(shè)計(jì)*
        分簇結(jié)構(gòu)向量寄存器分配策略研究*
        基于堆棧自編碼降維的武器裝備體系效能預(yù)測
        我是小字典
        正版字典
        讀者(2016年14期)2016-06-29 17:25:50
        高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
        一種用于分析MCS-51目標(biāo)碼堆棧深度的方法
        毛片无遮挡高清免费久久| 精品亚洲麻豆1区2区3区| 国产性自爱拍偷在在线播放 | 精品香蕉一区二区三区| 成人毛片无码一区二区三区| 永久免费无码av在线网站| 无码精品色午夜| 最大色网男人的av天堂| 国产不卡视频在线观看| 摸丰满大乳奶水www免费| 夜夜未满十八勿进的爽爽影院| 国产精品刺激好大好爽视频| 人妻av午夜综合福利视频| 亚洲精品中文字幕91| 午夜无码一区二区三区在线观看| 国产成本人片无码免费2020| 99在线播放视频| 亚洲欧洲无码精品ⅤA| 亚洲丝袜美腿精品视频| 亚洲一区二区二区视频| 四虎影视免费观看高清视频| 99re在线视频播放| 亚洲精品久久久中文字| 亚洲成人一区二区三区不卡| 久久96国产精品久久久| 欧美日韩国产一区二区三区不卡| 精品国产亚洲一区二区三区演员表| 中文字幕丰满人妻有码专区| 国内久久婷婷六月综合欲色啪| 欧美老熟妇喷水| 国产AV无码专区久久精品网站| 亚洲蜜芽在线精品一区| 精品亚洲一区中文字幕精品| 一本加勒比hezyo无码专区| 国产亚洲av片在线观看18女人| 国产亚洲美女精品久久| av男人天堂网在线观看| 九九综合va免费看| 国产精品午夜无码av天美传媒| 91福利国产在线观一区二区| 日韩一区二区av伦理|