• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            milkyway的窩

            最初想法的誕生地

             

            ARM開發(fā)過程中最最需要注意的問題

            作者:microsun

            平時(shí)大家接觸最多的可能是X86平臺(tái),在這種系統(tǒng)上寫程序幾乎不需要考慮太多問題,但ARM上就不一樣了,最常見也最容易被忽略的問題可能就是字節(jié)的對(duì)齊,即使像我這樣有六七年程序開發(fā)經(jīng)驗(yàn)的才手也時(shí)常難于提防,最近就有一個(gè)BUG,花了一天時(shí)間最終發(fā)現(xiàn)是對(duì)齊引發(fā)的,在此與大家分享,但愿大家能夠注意到。

              我在EBOOT中讀取存在HARD DISK上的nk.bin文件,從而從HARD DISK上LOAD WINCE系統(tǒng),在這個(gè)過程中總是有check sum錯(cuò)誤,但從ethernet下載時(shí)不會(huì)有錯(cuò),所以問題應(yīng)該還是在我加的這部分代碼上,而且同樣的代碼在PC上能正常運(yùn)行。經(jīng)過檢查代碼的邏輯關(guān)系是正確的。接著我在出錯(cuò)時(shí)將那些數(shù)據(jù)全部用調(diào)試信息打出來,發(fā)現(xiàn)從文件開始算起第4096個(gè)字節(jié)被丟掉了,而其它的字節(jié)都是對(duì)的。初步判斷是對(duì)齊引發(fā)的問題,所以去查每一個(gè)BUFFER,最終發(fā)現(xiàn)是在讀取硬盤數(shù)據(jù)時(shí)BUFFERR并沒有按雙字節(jié)對(duì)齊,而硬盤以16BIT讀取數(shù)據(jù),而引發(fā)了錯(cuò)誤。

            實(shí)際上,這類問題在ARM系統(tǒng)上很常見,讓人防不勝防,以下是我的一些例子。

            1,解析數(shù)據(jù)流時(shí)應(yīng)該時(shí)刻注意。如果需要把一個(gè)數(shù)據(jù)流(BUFFER)轉(zhuǎn)化成結(jié)構(gòu)進(jìn)行取值,就應(yīng)該把這個(gè)結(jié)構(gòu)定義為按字節(jié)存取.考慮如下結(jié)構(gòu):

            struct a{

            char a;
            short b;
            long c;
            };
            如果某個(gè)數(shù)據(jù)流中包含這樣的結(jié)構(gòu),而且我們要直接將數(shù)據(jù)流的指針轉(zhuǎn)化成該結(jié)構(gòu)的指針,然后直接取結(jié)構(gòu)成員的值,我們就應(yīng)該將這個(gè)結(jié)構(gòu)定義成按字節(jié)訪問,即將其夾在語句
            #pragma pack(push,1)
            ...

            #pragma pack(pop)
            之中。如果我們不這樣做,編譯器會(huì)將成員b的地址對(duì)齊到short指針的地址,即在a之后加上一個(gè)char即8位的成員,將C對(duì)齊到LONG,即在B之后再加一個(gè)char成員。如此一來,成員B和成員C就得不到正確的值了。

            如果我們定義一個(gè)普通的結(jié)構(gòu)用來存放一些數(shù)據(jù),則不用定義成按字節(jié)存取,編譯器會(huì)加上一些占位成員,但并不會(huì)影響程序的運(yùn)行。從這個(gè)意義上講,在ARM中,將結(jié)構(gòu)成員定義成CHAR和SHORT來節(jié)約內(nèi)存是沒有意義的。

            一個(gè)典型的例子就文件系統(tǒng)的驅(qū)動(dòng)程序,文件是以一些已經(jīng)定義好的結(jié)構(gòu)存放在存儲(chǔ)介質(zhì)上的,它們被讀取到一個(gè)BUFFER中,而具體取某個(gè)文件、目錄結(jié)構(gòu)時(shí),我們會(huì)將地址轉(zhuǎn)化成結(jié)構(gòu)而讀取其中的值。


            2,訪問外設(shè)時(shí)。
            例如,磁盤驅(qū)動(dòng)通常以16BIT的方式存取數(shù)據(jù),即每次存取兩個(gè)字節(jié),這樣就要求傳給它的BUFFER是雙字節(jié)對(duì)齊的,驅(qū)動(dòng)程序應(yīng)該至上層傳來的指針做出正確的處理以保證數(shù)據(jù)的正確性。


            3.有時(shí),我們沒有將數(shù)據(jù)流指針轉(zhuǎn)化為結(jié)構(gòu)指針取值,但如果我們讀取的是雙字節(jié)或者是四字節(jié)的數(shù)據(jù),同樣需要注意對(duì)齊的問題,例如,如果從一個(gè)BUFFER的偏移10處讀取一個(gè)四字節(jié)值,則實(shí)際得到的值是偏移8處的
            地址上的DWORD值。

            posted on 2007-01-20 21:24 milkyway 閱讀(1228) 評(píng)論(0)  編輯 收藏 引用 所屬分類: wince(別人的文章技巧總結(jié))

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            隨筆皆原創(chuàng),文章乃轉(zhuǎn)載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品国产一区二区三区久久蜜臀| 久久亚洲私人国产精品| 日本精品一区二区久久久| 日本精品久久久久久久久免费| 久久精品国产精品亚洲精品 | 免费国产99久久久香蕉| 久久99精品久久久久久秒播| 亚洲国产精品嫩草影院久久 | 精品999久久久久久中文字幕| 91麻豆精品国产91久久久久久| 亚洲精品无码久久久| 国产成人精品白浆久久69| 亚洲国产成人久久精品99 | 久久久久免费精品国产| 久久亚洲国产欧洲精品一| 久久精品国产乱子伦| 久久精品国产亚洲5555| 国产成人无码久久久精品一| 伊人久久国产免费观看视频 | 狠狠色婷婷久久综合频道日韩| 国产欧美一区二区久久| 国色天香久久久久久久小说| 久久久久久噜噜精品免费直播| 久久国产高清字幕中文| 亚洲欧美伊人久久综合一区二区 | 久久亚洲精品无码播放| 青青青国产精品国产精品久久久久| 国产一区二区久久久| 久久久久久亚洲精品不卡| 久久天堂电影网| 99精品国产在热久久| 色狠狠久久AV五月综合| 久久精品国产欧美日韩99热| 久久久久婷婷| 久久久久久亚洲精品不卡| 久久久久久久国产免费看| 久久99精品国产麻豆婷婷| 国产精品欧美久久久久无广告 | 人妻丰满?V无码久久不卡| 久久精品国产亚洲一区二区三区| 国产叼嘿久久精品久久|