2011年2月3日 星期四

宣告絕對位址的變數

以前不熟悉指標,當然也不熟悉memory的意思


感謝這個工作,讓我對memory有了進一步的了解


難怪指標在C語言無處不見,因為真的很好用


不過到底那裡好用,這個我一時也說不上來


不過最近研究了一下我之前常用的MCU,絕對位址的宣告如何使用


1、以dsPIC 為例


int var __attribute__ ((address(0x860)));


意思就是將 var 這個變數定義在address 0x860的位址上


2、以stm32  MDK 為例


#include <absacc.h> 
 
int var __at (0x20008000);


 


其實這只是一個簡單的操作手法而已


那麼要讀出絕對位址的方法就很多種了


int ans;


var = 10;


以往的做法


ans = var;


那定義成絕對位址的話


1、以dspic為例


ans = *(volatile int *)0x860;


2、以stm32 為例


ans = *(volatile int *)0x20008000;


 


或許有人可以想到這樣做有什麼好處了


不過不知道的也沒關係


有時候,真的就是"了解它,玩它",就對了


2 則留言:

  1. 好處是uC有些周邊可以設定資料自動放在固定位址(EX:DMA),只要直接到該位址抓資料就...XD
    會宣告volatile通常可以看做這個變數會被變動(通常是被週邊),即變變數沒有被指定值,其內容也會變。如果不這樣宣告,程式中又沒被賦值的動作,就有可能被編譯器看做無用變數被優化掉了。




    [版主回覆02/07/2011 08:10:43]我覺得是要看應用:如果只有一顆MCU當主角,且也不用與外界合作的話,那麼有沒有絕對位址我覺得不是那麼重要。但如果要與外界合作的話,那麼有沒有絕對位址就會有比較大的落差了。 因為工作的關係,我的MCU幾乎是一顆slave,所以絕對位址在使用上就方便很多了。
    另外祝你新年快樂

    回覆刪除
  2. 還有更好的好處唷~~~
    一般來說編譯器在做最佳化的時候
    會對某些變數進行 "共用位址" 的動作
    在使用到眾多中斷源的程式中
    很容易發生原來規劃為共用位址的變數會同時出現的情況
    如果堆疊管理不夠好的話
    程式就很容易發生靈異現象了~~~
     
    此時如果變數強制宣告為絕對位址
    可以避開編譯器最佳化時的誤失......
    不過在中斷源不是很多或很密集的系統
    這樣是感覺不出來的!!

    回覆刪除