顯示廣告
隱藏 ✕
看板 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
※ 看板: SmallBee 文章推薦值: 0 目前人氣: 0 累積人氣: 1322 
※ 文章分類: 程式語言
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇