新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM內存地址訪問

        ARM內存地址訪問

        作者: 時間:2016-11-11 來源:網絡 收藏
        1、訪問絕對地址的內存位置:

        #define pISR_EINT0 (*(unsigned *) (_ISR_STRATADDRESS+0x74))

        本文引用地址:http://www.104case.com/article/201611/316912.htm

        上述語句把無符號整數_ISR_STRATADDRESS+0x74強制轉換為指針,指向RAM,用下面的語句可以訪問它:

        pISR_EINT0 = (int)Eint0_ISR

        為了訪問一個絕對地址,把一個整形數強制轉換(typecast)為一指針。

        2、__irq:

        為了方便使用高級語言編寫異常處理函數,ARM編譯器對異常處理函數做了特定擴展,只要使用關鍵字_irq,這樣編譯出來的函數就滿足異常響應對現場保護和恢復的需要;

        3、編寫中斷服務程序的一些基本原則:

        √避免在中斷服務程序中做浮點運算:好的終端讀物程序應該遵循短小有效這一原則,在中斷服務程序中做浮點運算大大違背這一原則,同時有些處理器/編譯器就是不允許在中斷服務程序中做浮點運算;

        √中斷服務程序不能有返回值:所以中斷服務程序都定義為返回類型為void,即:void _irq Eint0_ISR(void);

        √中斷服務函數不能傳遞參數:故參數列表為void,即:void _irq Eint0_ISR(void);

        4、Static:

        一個static變量,其實就是全局變量,只不過它有作用域,它可用于保存變量所在函數被類此調用期間的中間狀態,比如:

        int cCout()

        {

        Static int loop = 0;

        .......

        loop++;

        .......

        }

        loop變量的值會跟隨著函數的調用次數而遞增,函數退出后,loop的值還存在,只是loop只能在函數中才能被訪問(函數作用域),而loop的內存空間也只會在函數第一次被調用時才會被分配和初始化,以后每次進入函數,都不為static分配了,而直接使用上一次的值。在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其他函數調用,模塊外其它函數無權訪問,是一個本地全局變量。

        5、Constant:

        將一個變量或對象定義成constant類型,則定義之后不能被更新(可讀不可寫),即在定義或說明類型時必須給他一個初始值。

        幾種須要注意的地方:

        √如果const位于星號(*)的左側,則const修飾指針所指向的變量,即指針指向常量;如:const int *a; 或int const *a;這兩種情況相同(cost放在變量聲明符的位置無關),指針指向一個常量,此時不能對內容進行更改,即不能有寫操作語句*a=3;

        √如果cost位于型號的右側,cost就是修飾指針本身,即指針本身是常量;如:int* const a;語句表示指針本身是常量,所指向內容不是常量,即a++是錯誤的。

        √如果星號左右側都有const修飾,如:const int* const a;表示指針本身和指針指向的內容均為常量。

        6.、Volatile:

        定義一個易失性變量,編譯器有一種技術叫數據流分析,分析程序中的變量在哪里被賦值、在哪里使用、在哪里失效,分析結果可以用于常量合并,常量傳播等優化。當編譯器檢查到代碼沒有修改字段的值,就有可能在你訪問字段時提供上次訪問的緩存值,這能夠提高程序的效率,但有時這些優化會帶來問題,不是我們程序所需要的,特點是對硬件寄存器操作的程序,這時可以用volatile關鍵字禁止做這些優化。

        使用volatile變量的場合:

        √硬件寄存器通常要加volatile說明,因為每次對它的讀寫都可能有不同的意義;

        √在中斷服務程序中修改的供其他程序檢測用的變量需要加volatile聲明;否則編譯器可能對變量更新一次后每次都使用緩存值不再立即更新;

        √多任務環境下各任務間共享的標志應該加voatile關鍵字:在多線程訪問某字段時,代碼希望這些訪問能夠操作到操作(讀取)到字段的最新值,同時寫到變量的操作能立即更新;對字段加上volatile關鍵字,那么對該字段的任何請求(讀/寫)都會立刻得到執行。



        關鍵詞: ARM內存地址訪

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西畴县| 德格县| 商都县| 松滋市| 大宁县| 嘉义市| 南木林县| 鄱阳县| 城固县| 东乌| 商南县| 石林| 多伦县| 奈曼旗| 赣榆县| 玉龙| 噶尔县| 姚安县| 桂平市| 德州市| 宁河县| 台湾省| 来宾市| 义乌市| 广宗县| 临城县| 江源县| 镇巴县| 文成县| 张掖市| 六安市| 连平县| 太保市| 泌阳县| 福泉市| 阿尔山市| 巴东县| 林芝县| 宕昌县| 黄陵县| 子长县|