以前不熟悉指標,當然也不熟悉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;
或許有人可以想到這樣做有什麼好處了
不過不知道的也沒關係
有時候,真的就是"了解它,玩它",就對了
好處是uC有些周邊可以設定資料自動放在固定位址(EX:DMA),只要直接到該位址抓資料就...XD
回覆刪除會宣告volatile通常可以看做這個變數會被變動(通常是被週邊),即變變數沒有被指定值,其內容也會變。如果不這樣宣告,程式中又沒被賦值的動作,就有可能被編譯器看做無用變數被優化掉了。
[版主回覆02/07/2011 08:10:43]我覺得是要看應用:如果只有一顆MCU當主角,且也不用與外界合作的話,那麼有沒有絕對位址我覺得不是那麼重要。但如果要與外界合作的話,那麼有沒有絕對位址就會有比較大的落差了。 因為工作的關係,我的MCU幾乎是一顆slave,所以絕對位址在使用上就方便很多了。
另外祝你新年快樂
還有更好的好處唷~~~
回覆刪除一般來說編譯器在做最佳化的時候
會對某些變數進行 "共用位址" 的動作
在使用到眾多中斷源的程式中
很容易發生原來規劃為共用位址的變數會同時出現的情況
如果堆疊管理不夠好的話
程式就很容易發生靈異現象了~~~
此時如果變數強制宣告為絕對位址
可以避開編譯器最佳化時的誤失......
不過在中斷源不是很多或很密集的系統
這樣是感覺不出來的!!