国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

ARM微控制器快速實(shí)現(xiàn)ModBus協(xié)議中的CRC校

2016-05-27 08:46:17馮毓春張如芹
關(guān)鍵詞:并行計(jì)算匯編語言

馮毓春,張如芹

(1.河南宏天實(shí)業(yè)有限公司,鄭州 450016;2.中原油田分公司天然氣處理廠輕烴站)

?

馮毓春1,張如芹2

(1.河南宏天實(shí)業(yè)有限公司,鄭州 450016;2.中原油田分公司天然氣處理廠輕烴站)

摘要:通過軟件并行計(jì)算來模擬硬件串行電路計(jì)算CRC校驗(yàn)碼的輸出結(jié)果,用于提高M(jìn)odBus通信協(xié)議中CRC校驗(yàn)程序的執(zhí)行效率,并由高效的ARM匯編語言封裝而成的函數(shù)來實(shí)現(xiàn)。程序代碼的運(yùn)行時(shí)間和存儲(chǔ)空間均超過常見的高度優(yōu)化的查表法。

關(guān)鍵詞:ARM;ModBus;CRC校驗(yàn);并行計(jì)算;匯編語言

引言

在現(xiàn)代工業(yè)生產(chǎn)中,利用微機(jī)進(jìn)行數(shù)據(jù)通信的工業(yè)控制應(yīng)用越來越廣泛。隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,大多數(shù)的應(yīng)用系統(tǒng)都需要將生產(chǎn)現(xiàn)場(chǎng)數(shù)據(jù)采集的資料上傳到上位計(jì)算機(jī),以便實(shí)現(xiàn)生產(chǎn)的科學(xué)調(diào)度和安全控制等。生產(chǎn)現(xiàn)場(chǎng)的這些設(shè)備雖然由不同的廠家生產(chǎn)和提供,但很多設(shè)備都遵循ModBus通信協(xié)議,提供了各種設(shè)備間互聯(lián)互通的基本接口。為保證數(shù)據(jù)通信的可靠性, ModBus通信協(xié)議提供了縱向冗余校驗(yàn)(LRC)和循環(huán)冗余校驗(yàn)(CRC)[1]兩種數(shù)據(jù)幀的差錯(cuò)檢驗(yàn)方法。實(shí)際應(yīng)用中,CRC校驗(yàn)的檢錯(cuò)率非常高[2-3],因而得到廣泛使用。

在很多情況下,CRC計(jì)算是靠專用的硬件電路來實(shí)現(xiàn)的,但是為了減少元器件數(shù)量,并且由此降低由于元器件故障帶來的系統(tǒng)維護(hù)工作量,一般低成本的單片機(jī)應(yīng)用系統(tǒng)都不配備專用的CRC校驗(yàn)的硬件電路,而是趨向于采用軟件的方式來實(shí)現(xiàn)CRC檢驗(yàn),所以首先要解決的問題就是如何通過軟件高效快速地完成CRC校驗(yàn)碼的計(jì)算問題,也就是CRC算法的問題。

1傳統(tǒng)的實(shí)現(xiàn)方法

ModBus通信協(xié)議采用CRC16運(yùn)算方式,其生成多項(xiàng)式G(x)= 1 + x2+x15+x16,在實(shí)際使用中,并不需要考慮CRC的最高位,因?yàn)樗偸潜簧釛壍?,所以只考慮余下的16個(gè)數(shù)據(jù)位。舍棄最高位的1后,多項(xiàng)式對(duì)應(yīng)的二進(jìn)制表現(xiàn)形式為1000 0000 0000 0101b,即對(duì)應(yīng)的十六進(jìn)制數(shù)值為0x8005。因?yàn)镸odBus通信協(xié)議采用反向的CRC16運(yùn)算方式,先傳送數(shù)據(jù)的LSB,最后傳送數(shù)據(jù)的MSB,所以需要將上面的16位二進(jìn)制數(shù)據(jù)反向書寫為1010 0000 0000 0001b,即對(duì)應(yīng)的十六進(jìn)制值為0xA001。

目前用軟件來實(shí)現(xiàn)該CRC算法的主要方式有兩種:按位計(jì)算法和查表法。按位計(jì)算法通過多次移位和異或運(yùn)算計(jì)算余數(shù)來實(shí)現(xiàn),該算法的原理其實(shí)就是模擬如圖1所示的串行CRC校驗(yàn)硬件電路[4-5]原理來實(shí)現(xiàn)的,這種算法每次只能處理一位數(shù)據(jù),效率低而且運(yùn)算量大。

為了快速實(shí)現(xiàn)CRC,人們自然會(huì)想到采用查表格的方法來實(shí)現(xiàn)CRC校驗(yàn)碼的生成[6],查表算法的思路是先離線計(jì)算一個(gè)字節(jié)的數(shù)據(jù)信息的所有余式,置于一個(gè)稱為“余式表”的表格中,供隨時(shí)讀取和調(diào)用,該表格占用512個(gè)字節(jié)[6-7]。對(duì)于大多數(shù)單片機(jī)應(yīng)用系統(tǒng)來說,由于肩負(fù)很多的控制和數(shù)據(jù)采集任務(wù),完成這些任務(wù)已經(jīng)占用了大部分的指令執(zhí)行時(shí)間和程序存儲(chǔ)空間,所以提高整個(gè)應(yīng)用系統(tǒng)的數(shù)據(jù)處理速度和減少程序代碼就顯得尤為重要。

圖1 串行反向CRC16校驗(yàn)碼電路原理圖

2快速實(shí)現(xiàn)方法概述

采用如圖1所示的基本原理,將一個(gè)或兩個(gè)字節(jié)數(shù)據(jù)的每個(gè)位輸入硬件電路的輸入端后,在時(shí)鐘脈沖的作用下,根據(jù)該硬件電路的最終運(yùn)算結(jié)果來推導(dǎo)出最終的輸出結(jié)果與輸入數(shù)據(jù)的各數(shù)據(jù)位的邏輯關(guān)系,從而得出CRC校驗(yàn)碼運(yùn)算的快速實(shí)現(xiàn)公式。以此公式為基礎(chǔ),單片機(jī)可對(duì)一個(gè)或兩個(gè)字節(jié)數(shù)據(jù)為單位并行進(jìn)行數(shù)據(jù)處理,可以快速得到CRC校驗(yàn)碼的運(yùn)算結(jié)果。

從運(yùn)算的角度看,圖1所示的串行反向CRC16校驗(yàn)碼電路可以看作是一個(gè)除法電路,輸入的數(shù)據(jù)為被除數(shù),而帶有反饋?zhàn)饔玫囊莆患拇嫫骺梢暈槌龜?shù),運(yùn)算的商被丟棄。數(shù)據(jù)逐位輸入到電路中進(jìn)行運(yùn)算,當(dāng)數(shù)據(jù)輸入完成之后16位移位寄存器中的數(shù)據(jù)就是相對(duì)于特定輸入數(shù)據(jù)流的CRC校驗(yàn)碼數(shù)值[8]。為敘述和分析方便,首先對(duì)各操作數(shù)據(jù)的每個(gè)數(shù)據(jù)位的名稱,按照從CRC_HI (高8位) 和CRC_LO (低8位)的順序及部分參數(shù)做如下定義:

① 當(dāng)前CRC值 = yxwu tsrq hgfe dcba(對(duì)應(yīng)當(dāng)前CRC校驗(yàn)碼結(jié)果數(shù)據(jù)的15位→0位)。

② 輸入數(shù)據(jù)Input = FEDC BA98 7654 3210(對(duì)應(yīng)輸入數(shù)據(jù)數(shù)據(jù)的15位→0位)。

③ 表格各個(gè)單元格中的字符間的邏輯關(guān)系均為異或(XOR)關(guān)系,如ab = a XOR b;又如h7g6 = h XOR 7 XOR g XOR 6,其他的各數(shù)據(jù)項(xiàng)均可參照此例,具有相同的邏輯運(yùn)算意義。

④ CRC_HI、CRC_LO分別輸出新CRC檢驗(yàn)碼的高字節(jié)和低字節(jié)。

CRC校驗(yàn)碼各個(gè)新數(shù)據(jù)位的所有轉(zhuǎn)換狀態(tài)表略——編者注。下面分別對(duì)輸入數(shù)據(jù)是一個(gè)字節(jié)和兩個(gè)字節(jié)數(shù)據(jù)的情況予以說明。

2.1輸入數(shù)據(jù)為一個(gè)字節(jié)

當(dāng)輸入一個(gè)字節(jié)數(shù)據(jù)后,如簡(jiǎn)化所得的CRC校驗(yàn)碼各數(shù)據(jù)位的書寫字符,特做如下定義:

P = h7g6f5e4d3c2b1a0

(1)

式中的P其實(shí)就是CRC_LO與輸入的一個(gè)字節(jié)數(shù)據(jù)相異或后所得結(jié)果的奇偶標(biāo)志,可對(duì)數(shù)據(jù)項(xiàng)做如下變換:

g6f5e4d3c2b1a0=h7 XOR h7g6f5e4d3c2b1a0 = h7 XOR P = Ph7

(2)

h7g6f5e4d3c2b1a0q=P XOR q=Pq

(3)

因此,電路中輸入一個(gè)字節(jié)數(shù)據(jù)后,新的CRC校驗(yàn)碼的16個(gè)數(shù)據(jù)位的狀態(tài)可表示為:

CRC =PPh7 h7g6 g6f5 f5e4 e4d3 d3c2 c2b1 b1a0y a0x w u t s r Pq

(4)

2.2輸入數(shù)據(jù)為兩個(gè)字節(jié)

當(dāng)輸入兩個(gè)字節(jié)數(shù)據(jù)后,為簡(jiǎn)化所得的CRC校驗(yàn)碼的各數(shù)據(jù)位的書寫字符,特做如下定義:

N = PyFxEwDuCtBsAr9q8

(5)

式中的N實(shí)質(zhì)上是原始CRC校驗(yàn)碼與輸入的兩個(gè)字節(jié)數(shù)據(jù)相異或后所得結(jié)果的奇偶標(biāo)志,由前述可對(duì)表格中的數(shù)據(jù)項(xiàng)做如下變換:

Pb1yFxEwDuCtBsAr9q8=b1 XOR PyFxEwDuCtBsAr9q8 = b1N

(6)

Pa0xEwDuCtBsAr9q8=a0yF XOR PyFxEwDuCtBsAr9q8 = a0yFN

(7)

Pc2yFxEwDuCtBsAr9q8=c2 XOR PyFxEwDuCtBsAr9q8 = c2N

(8)

為方便記憶,將式(6)~(8)中的字符N用字符P來表示,則電路中輸入兩個(gè)字節(jié)數(shù)據(jù)后,新的CRC校驗(yàn)碼的16個(gè)數(shù)據(jù)位的狀態(tài)可表示為:

CRC = b1P a0yFP b1yFxE a0xEwD wDuC uCtB tBsA sAr9 r9q8 q8h7 h7g6 g6f5 f5e4 e4d3 d3c2 c2P

(9)

由上面的推導(dǎo)可以得出,當(dāng)在硬件電路中輸入一個(gè)或兩個(gè)字節(jié)數(shù)據(jù)后,新的CRC校驗(yàn)碼的16個(gè)數(shù)據(jù)位的狀態(tài)可分別由式(4)或式(9)表示,只要用軟件的方法來模擬這些數(shù)據(jù)位的生成,就可以得到與硬件電路相一致的運(yùn)算結(jié)果。

3CRC校驗(yàn)碼的軟件實(shí)現(xiàn)

ARM單片機(jī)具有高效的指令集[9-10],可以利用該指令集中的移位指令和異或指令來實(shí)現(xiàn)CRC校驗(yàn)碼。下面給出具體的符合ATPCS調(diào)用規(guī)則的匯編語言源程序:

;程序功能: 計(jì)算緩沖區(qū)中數(shù)據(jù)的CRC校驗(yàn)碼,該校驗(yàn)碼用于

;ModBus通信協(xié)議

;入口條件: 需要操作的數(shù)據(jù)的地址存放在R0中,數(shù)據(jù)個(gè)數(shù)存放

;到R1中

;出口信息: R0中保存的是數(shù)據(jù)就是新的CRC校驗(yàn)碼,高位在

;前,低位在后

ModBus_CRC:

PUSH{R4,LR};保存寄存器R4和返回地址

EORSR2,R2 ;異或操作,預(yù)先清零CRC數(shù)據(jù)存放寄存器

MVNSR2,R2 ;將R2內(nèi)容取反為0xFFFFFFFF

LSRSR3,R1,#1;將需要計(jì)算的數(shù)據(jù)的個(gè)數(shù)預(yù)先初以

;2,以便采用雙字節(jié)運(yùn)算程序

BEQCRC_BYTE;若R1為0,表明只有一個(gè)字節(jié)數(shù)據(jù)需

;要計(jì)算,跳轉(zhuǎn)

SUBSR1,#1;數(shù)據(jù)個(gè)數(shù)大于1時(shí),預(yù)先將個(gè)數(shù)減1,

;以便控制運(yùn)算次數(shù)

CRC16_NEXT:

LDRHR3,[R0,#0];獲取需要計(jì)算的數(shù)據(jù)到寄存器R3

;中,高16位被清零

EORSR2,R3;R2內(nèi)容為:yF xE wD uC tB sA r9 q8

;h7 g6 f5 e4 d3 c2 b1 a0

LSLSR3,R2,#1;將R2向左移1位,結(jié)果存放到R3

EORSR3,R2;異或,初步得到對(duì)應(yīng)的結(jié)果位的狀態(tài)

LSRSR4,R3,#2;將R3右移2位,以便判斷相鄰的每4

;位數(shù)據(jù)的奇偶性

EORSR4,R3;異或,判斷相鄰的每4位數(shù)據(jù)的奇偶

;性,結(jié)果暫存于R4中

LSLSR2,R2,#14;將R2中的最低兩位b1、a0移到15、

;14位,順便將其低位全部清零

EORSR3,R2;將b1、a0位異或到R3寄存器中的

;15、14位上

UXTHR3,R3;將R3的高16位數(shù)據(jù)清零

LSRSR3,R3,#2;將R3的內(nèi)容右移2位,即將R3的第

;15,14位預(yù)先清零

EORSR3,R2;再次將b1、a0位異或到R3的第15、

;14位

LSRSR2,R4,#4;右移4位,準(zhǔn)備判斷相鄰的每8位的

;數(shù)據(jù)的奇偶性

EORSR2,R4;異或,判斷相鄰的每8位的奇偶性

LSRSR4,R2,#8;右移8位,準(zhǔn)備判斷整個(gè)16位數(shù)據(jù)

;的奇偶性[11]

EORSR2,R4;異或,得到數(shù)據(jù)的奇偶位P,R2的最

;低兩位狀態(tài)為P yFP

LSLSR2,R2,#14;現(xiàn)在R2中的第15、14位上為P

;yFP,其余低位為0

EORSR3,R2;將所得的奇偶標(biāo)志位的狀態(tài)異或到R3

UXTHR3,R3;將R3的高16位數(shù)據(jù)清零

LSRSR2,R3,#15;將R3中的第15位b1P右移到0位

;上,并將結(jié)果存放到R2中

EORSR2,R3;將b1P異或到R2的最低位,得到本

;次運(yùn)算的結(jié)果

ADDSR0,#2;指向下一個(gè)需要計(jì)算的數(shù)據(jù)的存放

;位置

SUBSR1,#2;數(shù)據(jù)個(gè)數(shù)計(jì)數(shù)單元減2

BHICRC16_NEXT;未處理完成時(shí)返回,繼續(xù)處理一下個(gè)

;數(shù)據(jù)

BNE RESULT_CRC;標(biāo)志位C為0,表明參與計(jì)算的數(shù)據(jù)

;個(gè)數(shù)是偶數(shù)

CRC_BYTE:

UXTHR2,R2;R2的高16位設(shè)置為0,只保存R2低

;16位中的CRC數(shù)值

LDRBR3,[R0,#0];讀取需要計(jì)算的數(shù)據(jù)到寄存器R3

;中,高24位被清零

EORSR2,R3;R2高位保持不變,低位內(nèi)容為: h7

;g6 f5 e4 d3 c2 b1 a0

LSLSR3,R2,#1;將R2內(nèi)容左移一位,結(jié)果存放到R3

EORSR3,R2;此時(shí)R3的低8位狀態(tài)為:h7g6 g6f5

;f5e4 e4d3 d3c2 c2b1 b1a0 a0

UXTBR3,R3;R3高24位清零,保留低8位:h7g6

;g6f5 f5e4 e4d3 d3c2 c2b1 b1a0 a0

LSRSR4,R3,#2;R3內(nèi)容右移2位,準(zhǔn)備判斷相鄰的

;每4位的數(shù)據(jù)的奇偶性

EORSR4,R3;異或,判斷相鄰的每4BIT的奇偶性

LSLSR3,R3,#6;R3的低16位為:0 0 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0 a0 0 0 0 0 0 0

LSRSR2,R2,#8;R2的低16位為:0 0 0 0 0 0 0 0 y x

;w u t s r q

EORSR3,R2;R3低16位的內(nèi)容:0 0 h7g6 g6f5 ;f5e4 e4d3 d3c2 c2b1 b1a0y a0x wutsrq

LSRSR2,R4,#4;準(zhǔn)備判斷相鄰的每8位的數(shù)據(jù)的奇

;偶性

EORSR2,R4;異或,判斷相鄰的每8BIT的奇偶性,

;此時(shí)R4的最低兩位為P、Ph7

LSLSR2,R2,#14;將P、Ph7右移到R2的第15、14兩位

;上,低位清零

EORSR2,R3;R2中低16位為:P Ph7 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0y a0x w u t s r q

UXTHR2,R2;R2的高16位設(shè)置為0,只保存R2中

;低16位

LSRSR3,R2,#15;將R2中位于15位上的奇偶標(biāo)志P

;左移到最低位,結(jié)果存放到R3中

EORSR2,R3

;R2中低16位狀態(tài)為:P Ph7 h7g6 g6f5 f5e4

;e4d3 d3c2 c2b1 b1a0y a0x w u t s r Pq

RESULT_CRC:

UXTHR0,R2;將處理結(jié)果存放到R0,以便得到

;正確的返回值

POP {R4,PC};出棧,設(shè)置返回地址到PC

ARM微控制器的開發(fā)一般采用集成開發(fā)環(huán)境,為方便使用,可以將上面的子程序封裝成符合集成開發(fā)環(huán)境調(diào)用規(guī)則的函數(shù)。這里假定封裝好的函數(shù)名為ModbusCRC,為測(cè)試該函數(shù)與采用傳統(tǒng)查表法的C語言函數(shù)的對(duì)比性能,在KEIL MDK-ARM集成開發(fā)環(huán)境下[12],按下Alt+F7快捷按鍵,將當(dāng)前項(xiàng)目的C/C++ 選項(xiàng)卡中的Optimizations設(shè)置為Level3(-03),勾選Optimize for Time,以便最大限度地減少C語言函數(shù)的代碼長度和運(yùn)行時(shí)間。C語言函數(shù)可從http://www.freemodbus.org網(wǎng)站下載。函數(shù)的性能對(duì)比數(shù)據(jù)可從表1中查看。

表1 CRC校驗(yàn)碼生成函數(shù)性能對(duì)比表

結(jié)語

通過分析串行硬件CRC校驗(yàn)碼電路的數(shù)據(jù)轉(zhuǎn)換狀態(tài),得出了其在輸入一個(gè)或兩個(gè)字節(jié)數(shù)據(jù)后的電路輸出狀態(tài)。采用并行計(jì)算的方法,一次處理一個(gè)或兩個(gè)字節(jié)數(shù)據(jù),實(shí)現(xiàn)了用軟件的方法來模擬該硬件電路的輸出狀態(tài)。從表1可以看出,由ARM微控制器匯編語言實(shí)現(xiàn)的CRC校驗(yàn)碼生成函數(shù),不但運(yùn)行速度比傳統(tǒng)的查表函數(shù)快,而且程序存儲(chǔ)空間不到查表函數(shù)的20%,在不損失速度優(yōu)勢(shì)的前提下,極大地節(jié)省了存儲(chǔ)空間。該快速實(shí)現(xiàn)方法已用于實(shí)際項(xiàng)目,具有很強(qiáng)的實(shí)用性,值得推廣應(yīng)用。

編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。

參考文獻(xiàn)

[1] 王新梅,肖國鎮(zhèn).糾錯(cuò)碼—原理與方法(修訂版)[M].西安:西安電子科技大學(xué)出版社,2001.

[2] 譚明新,李瑞.CRC檢錯(cuò)探究[J].科技創(chuàng)業(yè),2006(11):197-199.

[3] 張平安.16位循環(huán)冗余校驗(yàn)碼(CRC)的原理和性能分析[J].山西科技,2005(5):123-125.

[4] 彭偉.嵌入式系統(tǒng)CRC循環(huán)冗余校驗(yàn)算法設(shè)計(jì)研究[J].南京信息工程大學(xué)學(xué)報(bào):自然科學(xué)版,2012,4(3):258-265.

[5] 姚威.循環(huán)冗余校驗(yàn)碼并行算法的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,2006,34(9):112-114.

[6] 孟開元.MODBUS通信協(xié)議中CRC校驗(yàn)的快速C語言算法[J].福建電腦,2004(11):63-64.

[7] 張莉麗,張振權(quán),劉仁.CRC查表生成算法匯編的實(shí)現(xiàn)及其優(yōu)化[J].石油化工自動(dòng)化,2005(4):37-39.

[8] 劉星華.CRC校驗(yàn)在單片機(jī)系統(tǒng)中的軟件快速實(shí)現(xiàn)[J].福建工程學(xué)院學(xué)報(bào),2007,5(1):76-78.

[9] ARM.Cortex-M0 Technical Reference Manual(Revision: r0p0),2009.

[10] Joseph Yiu.ARM Cortex-M3權(quán)威指南[M].宋巖,譯.北京:北京航空航天大學(xué)出版社,2009.

[11] Henry SWarren Jr.高效程序的奧秘[M].馮速,譯.北京:機(jī)械工業(yè)出版社,2004.

[12] 李寧.ARM MCU開發(fā)工具M(jìn)DK使用入門[M].北京:北京航空航天大學(xué)出版社,2012.

馮毓春(工程師),主要從事工業(yè)儀器儀表的研究與設(shè)計(jì)工作;張如芹(工程師),主要從事油田天然氣處理裝置中自動(dòng)化儀表的研究與改進(jìn)工作。

Feng Yuchun1,Zhang Ruqin2

(1.Henan Hongtian Industrial Co.,Ltd.,Zhengzhou 450016,China;2.Zhongyuan Oil of Natural Gas Processing Plant Field)

Abstract:The parallel computing of the software is used to simulate the hardware serial circuit to calculate the output results of CRC checksum,which can improve the execution efficiency of the CRC checksum procedure in the ModBus communication protocol.That is achieved by the functions which are packaged by the efficient ARM assembly language.The running time and memory space of the program code are better than the common look-up table method highly optimized.

Key words:ARM;ModBus;CRC checking;parallel computing;assembly language

收稿日期:(責(zé)任編輯:楊迪娜2015-11-25)

中圖分類號(hào):TP313

文獻(xiàn)標(biāo)識(shí)碼:A

猜你喜歡
并行計(jì)算匯編語言
高等學(xué)校計(jì)算機(jī)專業(yè)課程教學(xué)改革實(shí)踐——以匯編語言與接口技術(shù)課程為例
匯編語言與C語言的混合程序設(shè)計(jì)技術(shù)研究
電子制作(2019年10期)2019-06-17 11:45:16
提高《匯編語言程序設(shè)計(jì)》教學(xué)效率的思考與實(shí)踐
云計(jì)算中MapReduce分布式并行處理框架的研究與搭建
矩陣向量相乘的并行算法分析
并行硬件簡(jiǎn)介
基于Matlab的遙感圖像IHS小波融合算法的并行化設(shè)計(jì)
科技視界(2016年11期)2016-05-23 08:13:35
匯編語言指令系統(tǒng)教學(xué)中應(yīng)該重視的兩個(gè)方面問題
达拉特旗| 额尔古纳市| 安宁市| 长海县| 青海省| 来宾市| 东光县| 湘乡市| 榆中县| 肃南| 图片| 大同县| 巴彦县| 丁青县| 砚山县| 南涧| 黑龙江省| 宁波市| 娄烦县| 丁青县| 石门县| 榆树市| 教育| 城口县| 彭州市| 和龙市| 图木舒克市| 日土县| 鄂尔多斯市| 浮山县| 丘北县| 孝义市| 桂平市| 龙胜| 宜春市| 象州县| 屏东县| 宜丰县| 福鼎市| 筠连县| 汝城县|