|
現: 2020-12-26 (土) 15:07:35 yuji |
| + | 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
Counter: 641,
today: 1,
yesterday: 0
Copyright©2008 Yuji Ueno All Rights Reserved.