WinAVRで,特に属性を付けずに変数を定義すると,AVRのRAM空間上に置かれる。
AVRはハーバードアーキテクチャーなんで,プログラムがあるFlash ROMとRAMは別のバスにつながれている。

よく使われる整数データの型は,<inttypes.h>にまとめられている。
<avr/io.h>をインクルードすると,<avr/sfr-defs.h>経由で,<inttypes.h>が自動的にインクルードされる。

定数は,"const"キーワードで定義する。

<inttypes.h>による定義済みの型 anchor.png

整数型名変数サイズ表現できる範囲
int8_t1-128~127
uint8_t10~255
int16_t2-32768~32767
uint16_t20~65535
int32_t4-2147483648~2147483647
uint32_t40~4294967295
int64_t8-9.22*10^18~9.22*10^18
uint64_t80~1.844*10^19
Page Top

宣言の仕方 anchor.png

uint_8 val;  // RAM上に変数を作成
val = 10;    // 10にする
Page Top

RAM上定数の宣言 anchor.png

const uint8_t ver = 10;  // RAM上に定数を設定

定数宣言は,その後値を代入などで変更できないことを除けば,初期値付き変数確保と違いはない。この定数値はFlash ROM上ではなく,RAM上に置かれる。RAM容量は少ないので,あまりこのような使い方はしない。

Page Top

レジスタ変数 anchor.png

register uint8_t regval asm("r2");

これで,AVRの汎用レジスタR2上に変数が確保される。

register uint16_t regval_w asm("r2");

このようにすると,R2:R3にワード変数を確保出来る。

Page Top

最適化 anchor.png

RAM上の変数を使う場合,AVRではまず,ld/ldd/lds命令で変数を汎用レジスタに持って来て,処理を行った後,st/std/sts命令でRAMに戻すというような動作をする。
avrgccは最適化機能を持っているため,ある変数に対する処理が連続して行われる場合は,一度汎用レジスタに持ってきたデータをいちいちRAMに返さずに,レジスタ上に置いたまま操作して,最後にRAMに保存するようなコードを作れるようだ。

ローカル変数は,スタックポインタ位置からld/stなどで参照できるため,lds/sts命令で参照されるグローバル変数より,多少コードサイズ,実行速度共に有利になるみたい。


新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 633, today: 1, yesterday: 0
最終更新: 2020-12-26 (土) 16:07:35 (JST) (1210d) by yuji