現: 2020-12-26 (土) 15:07:35 yuji ソース
Line 1: Line 1:
 +WinAVRで,特に属性を付けずに変数を定義すると,AVRのRAM空間上に置かれる。~
 +AVRはハーバードアーキテクチャーなんで,プログラムがあるFlash ROMとRAMは別のバスにつながれている。
 +よく使われる整数データの型は,<inttypes.h>にまとめられている。~
 +<avr/io.h>をインクルードすると,<avr/sfr-defs.h>経由で,<inttypes.h>が自動的にインクルードされる。
 +
 +定数は,"const"キーワードで定義する。
 +
 +**<inttypes.h>による定義済みの型 [#fa3fccc4]
 +|整数型名|変数サイズ|表現できる範囲|
 +|int8_t|1|-128~127|
 +|uint8_t|1|0~255|
 +|int16_t|2|-32768~32767|
 +|uint16_t|2|0~65535|
 +|int32_t|4|-2147483648~2147483647|
 +|uint32_t|4|0~4294967295|
 +|int64_t|8|-9.22*10^18~9.22*10^18|
 +|uint64_t|8|0~1.844*10^19|
 +
 +**宣言の仕方 [#m788e813]
 + uint_8 val;  // RAM上に変数を作成
 + val = 10;    // 10にする
 +
 +**RAM上定数の宣言 [#n902c095]
 + const uint8_t ver = 10;  // RAM上に定数を設定
 +定数宣言は,その後値を代入などで変更できないことを除けば,初期値付き変数確保と違いはない。この定数値はFlash ROM上ではなく,RAM上に置かれる。RAM容量は少ないので,あまりこのような使い方はしない。
 +
 +**レジスタ変数 [#sa43526d]
 + register uint8_t regval asm("r2");
 +これで,AVRの汎用レジスタR2上に変数が確保される。
 + register uint16_t regval_w asm("r2");
 +このようにすると,R2:R3にワード変数を確保出来る。
 +
 +**最適化 [#i17cfcf5]
 +RAM上の変数を使う場合,AVRではまず,ld/ldd/lds命令で変数を汎用レジスタに持って来て,処理を行った後,st/std/sts命令でRAMに戻すというような動作をする。~
 +avrgccは最適化機能を持っているため,ある変数に対する処理が連続して行われる場合は,一度汎用レジスタに持ってきたデータをいちいちRAMに返さずに,レジスタ上に置いたまま操作して,最後にRAMに保存するようなコードを作れるようだ。~
 +
 +ローカル変数は,スタックポインタ位置からld/stなどで参照できるため,lds/sts命令で参照されるグローバル変数より,多少コードサイズ,実行速度共に有利になるみたい。
  

  • 開発/AVR/RAM上の変数 のバックアップ差分(No. All)
    • 現: 2020-12-26 (土) 15:07:35 yuji

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 641, today: 1, yesterday: 0