看板 SmallBee
作者 SmallBee (SmallBee.bbs@naiveage.me.ncu.edu.tw)
標題 [轉寄][心得] AVR使用GCC的變數宣告
時間 2010年05月23日 Sun. PM 11:27:01
看板 P_SmallBee
作者 SmallBee (普通的蜜蜂貓)
標題 [心得] AVR使用GCC的變數宣告
時間 Fri Sep 4 00:02:58 2009
基本宣告法: 類型 變數名稱
類型有基本的 char, int 等
因為AVR沒有浮點運算器, 用浮點數會增加一大堆的程式碼
基本的前置字有
unisigned : 宣告為無負號型態
static : 宣告為全域變數或靜態變數, 可以防止被重複宣告或是刪除
const : 宣告為唯讀變數
stdint.h裡面可以查到諸如 uint8_t(無負號8位元整數) 等預設格式
============
另外有一個特殊的前置字 : volatile
這個關鍵字的意思是「編譯器不准將這個變數最佳化」,也就是禁止包含:
寫入時的延遲寫入, 讀取時直接從暫存區讀取, 刪除與之相關的多餘迴圈
尤其是寫SLEEP LOOP時, 一定要把用到的變數都指定volatile
============
還有一個更特殊的前置字: register
例如這樣的宣告: register uint8_t counter asm("r3");
這意思是宣告變數名稱counter為無負號8位元整數,並且強制指定使用R3暫存器
也就是當AVR在存取counter變數時, 是直接對R3暫存器進行存取
這個動作同時也會禁止compiler將R3暫存器用於其他地方
根據WinAVR的lib, 這個語法是不被推薦的
不過如果程式不大又重視效能,或是SRAM不夠用, 這樣用倒是無妨
建議的使用範圍為R2~R15, 絕對不要用R0跟R1
===========
基本宣告法,會使用AVR裡面的SRAM記憶體
如果要把變數寫進程式碼可以這樣宣告:
#include <avr/pgmspace.h>
..
unsigned char mydata[11][10] PROGMEM = { ... }
另外在讀取變數時,也必須用其他的方法:
byte = pgm_read_byte(&mydata[i][j]);
雙位元則用pgm_read_word, 四位元用pgm_read_dword
超過64KB定址區則要用pgm_read_???_far, 用錯的話會讀錯東西喔...
註:
const前置字並不會令編譯器將變數編譯至程式記憶體
寫進程式碼的變數資料則是強制唯讀的,加不加const都一樣只能讀取
但是在宣告的時候加上const則可以提醒自己&編譯器不應該對該變數做寫入動作
==========
除了把變數宣告進 Register/SRAM/PROGMEM以外還可以宣告進EEPROM
用法其實跟PROGMEM差不多
#include <avr/eeprom.h>
..
unsigned char mydata[11][10] EEMEM = { ... }
..
byte = eeprom_read_byte(&mydata[i][j]);
EEPROM不像PROGMEM有定址太遠的問題, 所以沒有_far相關的function
共通得是都有_word, _dword 等讀取位元數
另外多了eeprom_write_byte , _word, _dword 的功能
但是要注意EEPROM的寫入次數大約是10萬次, 讀取則沒有次數問題
==========
差異點:
SRAM/PROGRAM/EEPROM 允許在燒錄期寫入資料
SRAM/EEPROM/Register 允許在執行期寫入資料
Register 會因為斷電而失去資料
資料讀取所需Cycle: Register>SRAM>PROGRAM>EEPROM
EEPROM有寫入約10萬次的限制, PROGRAM則大概只有1萬次, SRAM/Register則無此問題
若要說用途的話:
Register 執行期中所持續需要且變動的變數
SRAM 一般的變數
PROGRAM 唯讀的資料(尤其是陣列/文字等)
EEPROM 長時間(可能中間會斷電)的變動紀錄
神奇的是..SRAM理論上應該是斷電會消失...但是確可以宣告成const
或許是compilier在編譯時自動補到程式碼開頭了吧?
==========
參考文獻:
變數型態
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__inttypes.html
PROGRAM
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003
Locking Register
http://www.nongnu.org/avr-libc/user-manual/porting.html
EEPROM
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38417
--
※
發信站: 中央機械純真年代(naiveage.me.ncu.edu.tw)
◆ From: 122.116.180.163
--
※ 來源: DISP BBS 看板: SmallBee 文章連結: http://disp.cc/b/106-2CZ