在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 嵌入式軟件開發(fā)之: 基于ARM處理器的嵌入式系統(tǒng)設計

            嵌入式軟件開發(fā)之: 基于ARM處理器的嵌入式系統(tǒng)設計

            作者: 時間:2013-09-30 來源:網(wǎng)絡 收藏

            本文引用地址:http://www.biyoush.com/article/257030.htm

            從上例可以看出,所有對結構體域成員的訪問都是通過字節(jié)訪問實現(xiàn)的,所以這種不對齊內(nèi)存訪問無論從代碼占用的存儲器空間,還是代碼的執(zhí)行時間上都要付出一定的代價。

            然而,開發(fā)者可以給編譯器提供更多的信息,使其知道結構體內(nèi)哪個字段是對齊的,哪個字段不是。為此,必須將聲明為__packed,并從struct本身除去__packed屬性。通過這種方法可以保證對struct中自然對齊成員的快速訪問。而且,哪個字段是未對齊的也更清楚,但這樣就增加了訪問struct結構的難度,當用戶從結構中增加或刪除字段時需要特別小心。

            修改上例中結構體的定義,來減少訪問結構體的開銷。具體代碼如下所示。

            struct mystruct {

            int aligned_i;

            short aligned_s;

            __packed int unaligned_i;

            };

            struct mystruct S1;

            對修改后的程序進行編譯,產(chǎn)生的匯編代碼如下所示。

            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

            從編譯后的匯編代碼不難看出,對結構體內(nèi)符號自然邊界對齊的域,編譯器直接使用相應的Load/Store指令進行訪問,而只有那些非自然邊界對齊的域,編譯器才進行附加處理。這樣,從時間和空間兩方面減小了程序的開銷。

            同一原理也適應于聯(lián)合體結構(unions)。使用在存儲器中未對齊的聯(lián)合組件的__packed屬性。

            13.1.3 用于半字存取的非對齊 LDR指令

            一些特殊情況下,ARM編譯程序可以生成非對齊LDR指令。特別是編譯程序從存儲器中載入半字時將使用該方法。這是因為,通過使用相應地址,所需的半字可以載入到寄存器的高半段(bits[31:16]),然后通過移位,將有效數(shù)據(jù)移到寄存器的低半段(bits[15:0])。這樣做的目的是通過減少內(nèi)存訪問次數(shù)來減少程序的執(zhí)行時間。通過上面的方法,程序只需要一次存儲器的訪問,而使用LDRB指令做同樣的操作需要兩次存儲器的存取,而且還要為將這兩個字節(jié)合并在一起添加特殊的代碼。在ARM體系結構v3和其早期版本中,通常使用該方法進行所有的半字載入。但在ARMv4及其以后版本中,出現(xiàn)了專門的半字載入指令,這種方法逐漸被取代。但是,非對齊LDR指令仍可能會出現(xiàn),比如在一個充填結構中存取一個非對齊short域類型。

            注意

            在RVCT中已經(jīng)不再支持ARMv3架構。

            13.1.4 移植代碼并檢測非對齊內(nèi)存訪問

            在非RISC體系結構的處理器上執(zhí)行的代碼中,可能會存在使用指針訪問非自然邊界對齊的數(shù)據(jù)類型。這種操作,在ARM體系結構中是不允許的。這就給代碼的移植帶來很大困難。用戶必須識別并更改此類內(nèi)存訪問代碼才能使其在RISC體系結構的處理器上正確執(zhí)行。

            識別非對齊存取可能會很困難,因為使用非對齊地址進行的載入或存儲操作會產(chǎn)生不正確的動作。追蹤到底是哪部分的C源程序造成了這個問題是很困難的。

            具有完整存儲器管理單元(MMUs)的,例如ARM920TTM,支持內(nèi)存對齊檢測功能,用戶可以通過設置MMU使處理器檢測每一次的內(nèi)存訪問以確保其被正確地對齊。如果出現(xiàn)非對齊內(nèi)存訪問,MMU將產(chǎn)生數(shù)據(jù)中斷。這樣就給追蹤出錯代碼帶來了很大的方便。

            對于一些簡單的沒有MMU的內(nèi)核,如ARM7TDMI,最好的方法是在ASIC(Application Specific Integrated Circuit)/ASSP(Application Specific Standard Product)內(nèi)部實現(xiàn)對齊檢測??梢栽黾訉iT的ARM內(nèi)核擴展硬件,由其監(jiān)控每次數(shù)據(jù)的訪問的內(nèi)存大小和存取地址總線的最低有效位。在非對齊存取的情況下,可以通過配置ASIC/ASSP產(chǎn)生中斷信號(ABORT)。ARM公司建議在需要運行移植代碼設備中包含這樣的ASIC/ASSP邏輯。

            如果在設計系統(tǒng)時,將系統(tǒng)設計成為當出現(xiàn)非對齊的內(nèi)存訪問時產(chǎn)生異常,則必須安裝數(shù)據(jù)中斷異常處理程序(Data Abort Handler)。出現(xiàn)非對齊存取時,程序進入數(shù)據(jù)中斷處理程序,并由此識別位于返回地址(在LR中保存的地址)減8(r14-8)的出錯數(shù)據(jù)存取指令。

            一旦出現(xiàn)數(shù)據(jù)中斷異常,必須通過改變C源程序來修復非對齊的數(shù)據(jù)訪問。使用下列指令可有條件地完成修復:

            #ifdef __arm

            #define PACKED __packed

            #else

            #define PACKED

            #endif

            :

            PACKED int *pi;

            :

            由于代碼大小和性能上的開銷,最好盡可能少采用存取非對齊數(shù)據(jù)。

            ARM編譯器支持--pointer_alignment和--min_array_alignment與內(nèi)存對齊相關的編譯選項,詳見ARM相關文檔。

            c++相關文章:c++教程



            上一頁 1 2 下一頁

            評論


            相關推薦

            技術專區(qū)

            關閉