999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

飛思卡爾KEA128微控制器位帶技術的應用解析

2016-11-08 08:36:06李躍華王宜懷
計算機應用與軟件 2016年10期

李躍華 王宜懷

1(南通大學計算機科學與技術學院 江蘇 南通 226019)2(蘇州大學計算機科學與技術學院 江蘇 蘇州 215006)

?

飛思卡爾KEA128微控制器位帶技術的應用解析

李躍華1,2王宜懷2

1(南通大學計算機科學與技術學院江蘇 南通 226019)2(蘇州大學計算機科學與技術學院江蘇 蘇州 215006)

在嵌入式系統開發中,對內存的訪問需使用“讀-改-寫”操作,至少會生成三條機器指令,不適合執行速度要求較高場合,此外還可能導致多任務間共享資源的“互鎖”問題。詳細解析了KEA128微控制器硬件提供的位帶技術對SRAM_U內存位操作的工作機制。實例對比分析和應用結果表明,利用位帶技術可以降低代碼占用空間,減少程序執行的機器指令周期,適合程序員在高級編程中使用該技術實現對位的快速“原子操作”,提高程序運行速度。

SRAM_U位帶區位帶別名區原子操作互鎖

0 引 言

在嵌入式編程中,通常情況下對RAM的操作,只能進行整字節讀取/寫入。一般需要進行“讀-改-寫”操作,即讀內存賦給臨時變量,然后對臨時變量進行修改,最后將臨時變量結果寫回內存[1]。這樣編譯后會生成多條指令,執行的指令周期長,代碼占用空間也大。在嵌入式應用中經常會出現執行效率要求較高的場景,尤其是對RAM的頻繁操作需要提高運行速度。使用普通的讀取/寫入方法,會產生較多的機器指令代碼,降低系統的運行效率。此外,在多任務共享資源的“互鎖”解決方案中也需要對位的操作特殊處理,實現對位的快速“原子操作”。KEA128微控制器是飛思卡爾針對汽車市場最新開發的微控制器(MCU),有非常廣泛的應用范圍。由于芯片的高可靠性,也大量應用于一般的工業控制系統中。KEA128微控制器內部具有位帶技術這種位操作機制,從硬件上提供了對位帶別名區外設地址空間用“讀-改-寫”的操作方式來實現位操作[2]。硬件設計采用相對比較復雜的映射機制,一般程序員在編程時不會使用,而在高級編程中使用該技術實現對位的快速操作。本文通過詳細解析位帶技術要點及其與普通位操作方法的比較,并給出實際應用案例場景,為其他編程人員提供參考。使用這種機制能夠降低總線的占用率和CPU執行時間,提高系統的運行速度,降低系統的功耗。本文的研究是在國家自然科學基金資助下開展的,該項目的熒光投影數據采集檢測模塊,需大量處理內存中的采集數據,對于程序的代碼空間和運行時間要求較高。使用普通位操作技術很難達到較好的效果,利用本文位帶技術設計的評估系統為基金項目中數據檢測模塊的研究做了一定的探索。

1 KEA128微控制器位帶技術機制概述

KEA128微控制器的SRAM(16 KB)分為兩部分:SRAM_L(4 KB)和SRAM_U(12 KB)。硬件機制提供利用“位帶別名區”對SRAM_U“位帶區”的對應位置1或清0操作[2]。位帶別名區的32位字地址的寫操作與SRAM_U上的目標位的“讀-改-寫”操作作用相同,但僅需一個指令周期。利用“位帶別名區”的98 304字地址編號實現對12 KB 的SRAM_U的98 304個位的操作,位帶別名區地址空間(0x22000000-0x2205FFFF,384 KB,98 304字)對應SRAM_U位帶區(0x20000000-0x20002FFFF,12 KB)的12×1024×8=98 304個位。位帶別名區只支持簡單的置1和清0寫操作,目的是方便對位的快速原子操作[3,4]。

“位帶別名區”操作實質是一種內存映射關系。硬件將SRAM_U“位帶區”的存儲單元按“位”映射到對應“位帶別名區”的32 位“字”上,“位帶別名區”中的一個32位地址,對應“位帶區”一個地址中的一個位[2,3]。按“字”訪問“位帶別名區”的存儲單元時,就相當于訪問“位帶區”對應“位”。對“位帶別名區”地址的訪問等同于對真實地址的某個位的訪問。“位帶區”與“位帶別名區”的映射關系如圖1所示。

圖1 “位帶區”和“位帶別名區”的映射關系

通過位帶技術映射存儲空間之后,編寫程序時可以方便實現位操作。“位帶別名區”第0位的值決定寫入目標位的值,為1代表向目標位寫1;為0代表目標位清0。可以通過向“位帶別名區”寫0x00000000,表明目標位清0;寫0x00000001表明目標位置1。根據KEA128微控制器位帶區“位”與位帶別名區“字”的對應關系,位帶別名區地址的計算方法[6]為:位帶別名區地址= 位帶別名區基地址+ 位帶區字節偏移量×32 + 位偏移量×4。設SRAM_U“位帶區”的地址為X,需要置1或清0的位為m(0≤m≤31),可以通過公式計算出“位帶別名區”的地址為:0x22000000+(X-0x20000000)×32+m×4。

2 KEA128微控制器位帶技術應用機制解析

2.1不同方法操作SRAM_U解析

2.1.1普通方法操作SRAM_U

一般情況下,如何修改內存中的一位?如果要求是改動一位,不能影響其他位。以32位字長為例進行解析,設目標地址為0x20002FF0,改動其第16位為“0”的方法如下[5]:

1) 讀一個字:讀出0x20002FF0-0x20002FF3中內容到變量temp中:

temp=(*( volatile unsigned long int *)(unsigned long int)0x20002FF0);

2) 改一個位:將temp中的第16位清0:

temp=temp&(0xFFFEFFFF);

3) 寫一個字:將temp寫回目標地址:

(*(volatile unsigned long int *)(unsigned long int)0x20002FF0)=temp;

這就是通常所說的“讀-改-寫”操作,即讀內存賦給臨時變量,然后對臨時變量進行修改,最后將臨時變量結果寫回內存。

2.1.2位帶技術操作SRAM_U

如果我們使用KEA128微控制器硬件機制所提供的“位帶別名區”將SRAM_U“位帶區”地址為0x20002FF0的內存單元第16位變成“0”,僅需一步寫操作就可以實現:

(*(volatile unsigned long int *)(unsigned long int)0x2205FE40)=0;

其中“位帶別名區”的地址0x2205FE40可以通過公式0x22000000+(0x20002FF0-0x20000000)×32+16×4計算得到。

2.2實例對比分析

為了充分說明位帶技術的優勢,我們在Kinetis Design Studio 2.0.0編譯環境中對上述代碼反匯編進行對比。可以發現,使用位帶技術比原有“讀-改-寫”方法的代碼空間要小,執行效率更高。通過“位帶別名區”的寫操作就可以實現對SRAM_U“位帶區”中位的操作,將位操作的“讀-改-寫”過程變為只有“寫”的操作,提高了程序的運行效率。

普通方法操作SRAM_U的機器碼:

//SARM_U位帶區讀一個字

temp=(*( volatile unsigned long int *)(unsigned long int)0x20002FF0);

80e:4b36 ldrr3, [pc, #216]; (8e8 )

810:681b ldrr3, [r3, #0]

812:60fb strr3, [r7, #12]

//改一個位

temp=temp&(0xFFFEFFFF);

814:68fa ldrr2, [r7, #12]

816:4b35 ldrr3, [pc, #212]; (8ec )

818:4013 andsr3, r2

81a:60fb strr3, [r7, #12]

//SARM_U位帶區寫一個字

(*( volatile unsigned long int *)(unsigned long int)0x20002FF0)=temp;

81c:4b32 ldrr3, [pc, #200]; (8e8 )

81e:68fa ldrr2, [r7, #12]

820:601a strr2, [r3, #0]

位帶技術操作SRAM_U的機器碼:

//位帶別名區寫一個字

(*( volatile unsigned long int *)(unsigned long int)0x2205FE40)=0x00000000;

822:4b33 ldrr3, [pc, #204]; (8f0 )

824:2200 movsr2, #0

826:601a strr2, [r3, #0]

3 利用位帶技術編程要點

3.1位帶技術使用的RAM區域

SRAM_U作為普通內存區時,一般被用來存儲全局變量、臨時變量(堆棧空間)等。當SRAM_U用作位帶區時,僅需使用其中很小一部分區域用作位帶區,其余大部分仍然用作普通內存區。如果地址隨意使用,位帶區和普通內存區會出現重疊,從而出現使用混亂,發生錯誤。為此,我們一般在鏈接文件(.LD)中修改堆棧大小和堆棧SP指針,將堆棧的最高地址向小端移動,根據實際項目需要,留出部分高端地址空間給SRAM_U位帶區使用。

3.2使用volatile關鍵字

在C語言編程設計中使用位帶技術時,所訪問的存儲器單元必須使用關鍵字volatile 來加以定義[6]。該關鍵字用于規定C 編譯器不允許對其限定的變量進行優化處理,編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數據。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值。如果這個變量被別的程序更新了的話,將出現不一致的現象。

4 位帶技術應用案例

4.1解決多任務間共享資源的“互鎖”問題

在嵌入式系統設計中,多任務間共享資源會出現“互鎖”問題,采用普通的“讀-改-寫”操作可能會出現紊亂情況[7]。

比如,利用內存中一個字節,用作狀態標記位。在多個中斷服務程序中,根據不同的響應中斷設置對應的狀態標記位;主程序根據狀態標記位去執行不同的程序段,然后清除對應的狀態標記位。下面利用兩種方法來操作狀態標記位,并采用位帶技術來解決使用普通方法可能存在的“互鎖”問題。

4.1.1使用普通方法

采用普通的“讀-改-寫”操作需要 3 條指令,導致這中間留有兩個能被中斷的空當,于是可能會出現狀態標記位的紊亂情況。假設當主程序main中狀態標記位值為0b00000001,需要清除第0位,正處于“讀”-“改”間隔或“改”-“寫”間隔的時候發生isr_one中斷,中斷響應后對需要第1位置1。此時,isr_one中斷服務程序中讀取到狀態標記位值仍然為0b00000001,然后進行修改、寫入后變為0b00000011。退出中斷isr_one服務例程,返回到mian主程序中,繼續執行“讀”、“改”操作的后續“寫”指令。由于發生中斷前已經讀取了狀態標記位的值為0b00000001,修改后為0b00000000,此時會將0b00000000的值寫回狀態標記位,isr_one中斷服務程序中所做的修改動作就會丟失,達不到程序所設計的效果。同樣的紊亂情況可能出現在多任務的執行環境中。其實上述的情況可以看作是多任務的一個特例:主程序mian是一個任務,isr_one是另一個任務,這兩個任務并發執行[7]。示例程序說明如下:

主程序Main中:

Flag&=~(1<<0);

//清除標記位第0位

//該語句實際上為3條復合語句;假設Flag變量對應地址為:0x20002FF0

Flag=(*( volatile unsignedchar *)(unsigned long int)0x20002FF0);

//此處可能會被isr_one中斷

Flag=temp&(0xFE);

//清除第0位

//此處可能會被isr_one中斷

(*(volatile unsignedchar *)(unsigned long int)0x20002FF0)=Flag;

isr_one中斷服務程序中:

Flag|=(1<<1);

//標記位第1位置1

//該語句實際上為3條復合語句

Flag=(*( volatile unsignedchar *)(unsigned long int)0x20002FF0);

Flag=temp|(0x02);

//第1位置1

(*(volatile unsignedchar *)(unsigned long int)0x20002FF0)=Flag;

4.1.2使用位帶技術方法

利用位帶技術的好處是在多任務中,可以實現共享資源在任務間的“互鎖”訪問。多任務的共享資源必須滿足一次只有一個任務訪問它,即所謂的“原子操作”。通過使用位帶技術,就可以避免上例中的紊亂情況。位帶操作把這個“讀-改-寫”操作變成一個硬件級別支持的原子操作,不能被中斷。上述main中對狀態標記位第0位的清0操作采用位帶技術后,執行完清0操作后才會去相應isr_one中斷,執行對應的服務例程完成狀態標記位第1位的置1操作,這樣就不會出現上述紊亂情況。示例程序說明如下:

主程序Main中:

//計算出SRAM_U:0x20002FF0,第0位,對應的位帶別名區地

//址:0x2205FE00

//計算出SRAM_U:0x20002FF0,第1位,對應的位帶別名區地

//址:0x2205FE04

//清除標記位第0位

(*(volatile unsigned long int *)(unsigned long int) 0x2205FE00)=0;

isr_one中斷服務程序中:

//標記位第1位置1

(*(volatile unsigned long int *)(unsigned long int) 0x2205FE04)=1;

4.2利用位帶技術提高LED點陣數量的編程實例

在嵌入式系統設計中,對于內存的訪問操作十分頻繁。下面以筆者設計的一個實際項目案例來說明位帶技術在內存訪問控制上的優勢。

所設計的單色16×16點陣LED屏移動顯示控制系統中,LED點陣屏采用動態掃描方案,使用MCU進行控制掃描。在屏幕點亮前需要將內存中一個字節的數據一位一位串行送入控制芯片74HC595中[8],對于送一個字節數據,程序段需要反復調用執行。在設計中使用了兩種方法進行編程,各有優劣,下面就以實際案例程序進行分析說明。

4.2.1內存數據移位法

該方法利用循環實現將內存*data變量中的數據和i變量進行與操作,i初值為0b1000000。循環首次判斷*data最高位的值,如果是0則將一位數據0送入595;如果是1則將一位數據1送入595,然后將i右移1位,判斷下一位。循環8次實現將一個字節中的數據逐位送入595芯片。利用C語言的基本位操作語句實現,程序可讀性和可移植性較好。

void LED_Sendbyte(uint_8 *data)

{uint_8 i,j;

//GPIOA組寄存器的D16位對應PORTC0,決定PORTC0引腳

//的控制,依次類推

volatile uint_32 *PC=(uint_32*)0x400FF000u;

//將一個字節,送入595(數據上線)

i=0b10000000;

//為了取字節中的一位

for (j = 1; j <=8 ; j++)

//對一個字節循環

{ *PC &= ~(1<<16);

//使CLK為0

((*data&i)==0)?(*PA |= 0b00010000):(*PA &=0b11101111);

//CLK產生上升沿,使數據送到595移位寄存器

*PC |= (1<<16);

//使CLK為1

//i右移一位,為取data_byte字節中的一位做準備

i=i>>1;

}

}

4.2.2位帶技術法

該方法是利用位帶技術訪問存儲空間,修改鏈接文件中堆棧SP地址_estack = 0x20003000-0x20,空出32個字節用于位帶區,防止內存的訪問沖突[9]。利用語句volatile uint_32 *temp=(uint_32*)0x20002FF0定義將需要送入595芯片的內存數據存入SRAM_U位帶區的固定地址0x20002FF0處。通過位帶技術可以直接訪問位帶區所對應的位帶別名區,根據公式可以計算出SRAM_U位帶區0x20002FF0的一個字節8個位所對應的位帶別名區的映射地址為:0x2205FE1C-0x2205FE00。程序通過對位帶別名區的地址讀取判斷,實現將0或1一位數據送入595芯片。

編譯后會生成極少代碼,尤其大大減少了程序執行的指令周期,提高程序運行速度。程序設計時可以利用宏定義預先計算出對應的映射地址,在程序中直接使用宏,增加程序的可讀性和可維護性。

void LED_Sendbyte( )

{//GPIOA組寄存器的D16位對應PORTC0,決定PORTC0引腳的

//控制,依次類推

volatile uint_32 *PC=(uint_32*)0x400FF000u;

//送出第7位,送入595(數據上線)

*PC &= ~(1<<16);

//使CLK為0

((*(volatile uint_32 *) (uint_32)0x2205FE1C)==0)?(*PA |= 0b00010000):(*PA &=0b11101111);

//CLK產生上升沿,使數據送到595移位寄存器

*PC |= (1<<16);

//使CLK為1

//送出第6位,送入595(數據上線)

*PC &= ~(1<<16);

//使CLK為0

((*(volatile uint_32 *) (uint_32)0x2205FE18)==0)?(*PA |= 0b00010000):(*PA &=0b11101111);

//CLK產生上升沿,使數據送到595移位寄存器

*PC |= (1<<16);

//使CLK為1

//依次送出第5、4、3、2、1、0位,送入595(數據上線)

//后續程序段由于篇幅關系,此處省略。重復上述程序段,只需將

//位帶別名區的地址依次修改為: 0x2205FE14、0x2205FE10、0x2205

//FE0C、0x2205FE08、0x2205FE04、0x2205FE00即可。

}

4.2.3實現技術性能比較

隨著KEA128微控制器所控制的16×16點陣LED屏數量的增多,所顯示點陣漢字字節數(一塊屏幕顯示一個漢字,需要送入32字節的數據給74HC595)急劇上升,上述LED_Sendbyte“字節數據上線”函數代碼的重復運行次數會急劇增加。筆者使用Kinetis Design Studio 2.0.0編譯軟件對上述兩種程序代碼進行編譯,下載至芯片。在KEA128芯片使用內部時鐘運行于24 MHz時[3],以點陣LED屏顯示內容不閃爍為標準,實際測試了兩種技術方法最大所支持的點陣LED屏數量和反匯編所生產的機器指令數目,如表1所示。

表1 不同技術方法性能對比

從表1可知,位帶技術法比內存移位法程序執行效率提高了213%,所生成的機器指令數目減少了57%。使用位帶技術訪問內存的程序代碼執行效率遠高于普通內存訪問方法。在上述實際案例項目中使用位帶技術優化代碼進行控制掃描,使用單塊MCU就可以實現控制64塊點陣屏的漢字的移動顯示,從而可以節省硬件成本。

5 結 語

本文介紹了飛思卡爾KEA128微控制器硬件所支持的位帶技術,通過實例分析驗證了技術的優越性;給出解決多任務間共享資源的“互鎖”問題和位帶技術提高LED點陣數量的編程實際應用案例,為其他編程人員提供參考。在嵌入式程序設計中使用位帶技術,比使用普通C語言實現相同功能的代碼,可以提高MCU的位操作性能,減少C代碼的指令大小,減少程序運行時間,提高了指令執行效率。本文所采用的KEA128芯片在汽車電子應用中會出現快速控制汽車電子器件的情況,使用位帶技術尤其適合嵌入式系統中對SRAM_U快速位操作的場合,對于在內核資源緊張的時候可以給用戶提供一個精簡代碼和提高程序執行速度的手段。其能夠降低總線的占用率和CPU執行時間,降低系統的功耗。

[1] 張吉豫,劉先華,譚明星,等.一種針對位操作密集應用的擴展指令自動選擇方法[J].電子學報,2012,40(2):209-214.

[2] Freescale.KEA128 Sub-Family Reference Manual Rev 2[EB/OL].2014:223-240.http://www.Freescale.com.

[3] Freescale.KEA128 Sub-Family Data Sheet Rev 4[EB/OL].2014:20-21.http://www.Freescale.com.

[4] ARM.Cortex-M0+Devices Generic User Guide[EB/OL].2012:54-57.http://www.ARM.com.

[5] Hilewitz Y,Lee R B.A new basis for shifters in general-Purpose processors for existing and advanced bit manipulations[J].IEEE Transactions on Computers,2009,58(8):1035-1048.

[6] 唐飛,王陳寧,查長禮.位帶技術在STM32程序設計中的應用[J].安慶師范學院學報:自然科學版,2014,20(1):54-57,76.

[7] 王曉春,劉興東.嵌入式實時操作系統任務的同步與互斥機制[J].計算機測量與控制,2004,12(6):578-580.

[8] 張飆.LED顯示屏控制器設計研究[J].計算機應用與軟件,2011,28(3):188-190.

[9] 王宜懷,朱仕浪,郭蕓.嵌入式技術基礎與實踐—ARM Cortex-M0+ Kinetis L系列微控制器[M].3版.北京:清華大學出版社,2013.

ANALYSING APPLICATION OF BIT-BAND IN FREESCALE’S KEA128 MICROCONTROLLER

Li Yuehua1,2Wang Yihuai2

1(SchoolofComputerScienceandTechnology,NantongUniversity,Nantong226019,Jiangsu,China)2(SchoolofComputerScienceandTechnology,SoochowUniversity,Suzhou215006,Jiangsu,China)

When developing embedded system, “read-modify-write” operations have to be used to access the memory, and this will produce at least three machine instructions, and is not suitable for the occasions requiring high implementation speed. In addition this may also lead to the problem of "interlocking" in sharing resources between multi-tasks. This paper analyses in detail the working mechanism of bit-band technique, which is provided by KEA128 microcontroller’s hardware, on bit operations of SRAM_U memory. By comparative analysis of examples and application results it is shown that the use of bit-band technology can reduce the space occupied by the code, as well as reduce the machine instruction cycle of program execution, and is suitable for programmers to use this technology in advanced programming to achieve fast "atomic operation" on bits and to improve the speed of program execution as well.

SRAM_UBit-band regionAliased bit-band regionAtomic operationInterlock

2015-06-16。國家自然科學基金項目(60871086);南通市應用研究項目(BK2012068)。李躍華,副教授,主研領域:嵌入式與物聯網技術。王宜懷,教授。

TP391

A

10.3969/j.issn.1000-386x.2016.10.048

主站蜘蛛池模板: 日本色综合网| 欧美精品啪啪一区二区三区| 97在线公开视频| 欧美成人精品一级在线观看| 亚洲an第二区国产精品| 日韩精品一区二区三区视频免费看| 2021天堂在线亚洲精品专区| 性69交片免费看| 2021国产乱人伦在线播放| 手机在线国产精品| 四虎成人在线视频| 婷婷午夜天| 激情网址在线观看| 一区二区影院| 毛片免费试看| 亚洲成aⅴ人在线观看| 伊人丁香五月天久久综合| 99久久婷婷国产综合精| 欧美精品亚洲精品日韩专| 亚洲精品图区| 亚洲人成人无码www| 狠狠五月天中文字幕| 99久久国产精品无码| 一级片免费网站| 国产亚洲欧美在线中文bt天堂 | 亚洲国产欧美国产综合久久 | 午夜福利视频一区| 丁香五月亚洲综合在线| 亚洲精品无码人妻无码| 国产成人久视频免费| 久久婷婷六月| 欧美日本视频在线观看| 成人毛片免费在线观看| 国产尤物jk自慰制服喷水| 最新亚洲人成无码网站欣赏网 | 日本手机在线视频| 女高中生自慰污污网站| 国产精品无码作爱| 日本精品影院| 亚洲天堂网视频| 欧美日韩在线第一页| 亚洲AⅤ综合在线欧美一区| 成人夜夜嗨| 欧美午夜小视频| 国产玖玖玖精品视频| 日韩免费毛片| 97国产精品视频人人做人人爱| 欧美成人免费| 国产欧美自拍视频| 亚洲浓毛av| 国产SUV精品一区二区6| 亚洲成a人片77777在线播放| 国产一区二区三区夜色| 国产精品三级专区| 国产一区二区三区在线观看免费| 国产精品三级专区| 欧美激情视频一区| 青青草国产免费国产| 精品福利视频导航| 999国内精品久久免费视频| 国产精品网曝门免费视频| 2024av在线无码中文最新| 国产精品网曝门免费视频| 国产精品人人做人人爽人人添| 国产99视频精品免费视频7| a欧美在线| 欧美精品二区| 久久精品这里只有国产中文精品| 麻豆精品国产自产在线| 亚洲无线国产观看| 极品国产在线| 黄色网页在线观看| 91香蕉视频下载网站| 国产丝袜无码精品| 欧美综合中文字幕久久| 四虎永久免费在线| 亚洲国产精品美女| 嫩草国产在线| 国产肉感大码AV无码| 一本一本大道香蕉久在线播放| 国内精品小视频福利网址| 91精品国产综合久久香蕉922 |