
■ BASCOM-AVR (DEMO) の使用方法 ■ |
メモリーの種類と使用方法 |
BASCOM-AVRでは、SRAM、XRAM、ERAMと言う名称で、3種類のメモリーを扱えます。
● SRAM
・内蔵SRAMが搭載されているデバイスで、汎用として使用できるメモリーです。
・変数や配列の格納と、フレーム領域、スタック領域に使用されます。
○ 変数と配列
・プログラム全体で使用される、グローバルな変数や配列が宣言されると、SRAMエリアの
若いアドレスから宣言された順に、メモリーが割り当てられて行きます。
・DIM命令を参照して下さい。
・宣言できる変数の数は、変数の型と、フレームやスタックの使用量、そしてデバイスの
SRAM容量によって変わります。
型 式 |
使用
メモリー |
扱える数値の範囲 |
備 考 |
Bit |
1/8 byte |
0 or 1 |
0または1だけを保持 |
Byte |
1 byte |
0 〜 255 |
符号無 8ビットの整数型 |
Word |
2 byte |
0 〜 65535 |
符号無 16ビットの整数型 |
Integer |
2 byte |
-32,768 〜 +32,767 |
符号付 16ビットの整数型 |
Dword |
4 byte |
0 〜 4,294,967,295 |
符号無 32ビットの整数型 |
Long |
4 byte |
-2,147,483,648 〜 2,147,483,647 |
符号付 32ビットの整数型 |
Single |
4 byte |
1.5×10の-45乗 〜 3.4×10の38乗 |
符号付 32ビット 浮動小数点型 |
Double |
8 byte |
5.0×10の-324乗 〜 1.7×10の308乗 |
符号付 64ビット 浮動小数点型 |
String |
Max
254byte |
1文字1バイトの文字列。
10文字の文字列は、終了コード00を付けて11バイト必要。
($BIGSTRINGS命令により、最大65535バイトまで使用可能) |
○ ハードウェア・スタック領域
・AVRのスタック ポインタ(SP)が使用するメモリー領域です。
・GOSUBまたはCALL命令を使用する場合に、戻りのアドレスを記憶するため、ハードウェア
スタック領域のメモリーを2バイト使用します。
・2つのGOSUB命令を入れ子にする場合は、2X2=4バイトを使用します。
・RETURN命令により、ハードウェア スタックは戻され、プログラムはもとのアドレスから継続して
処理を再開します。
・また、ほとんどの命令文でも、ハードウェア スタックが使われます。
・ハードウェア スタック領域は、$HWSTACK命令で設定する必要があります。
(初期値では、40バイトに設定されています)
・割り込み処理を使用する場合には、割り込み処理ルーチン用に最低32バイトを必要とします。
・よって、メインルーチン用と、割り込みルーチン用を合わせた64バイトを、最低限確保して
下さい。
○ ソフトウェア・スタック領域
・ソフトウェア スタック領域は、ローカル変数、および、サブ ルーチンに受け渡される変数が
格納されている、メモリーのアドレスを記憶するために使用されます。
・これらは、アドレスを記憶するために、変数ごとに2バイトのスタック領域を使用します。
・たとえば、サブ ルーチンに受け渡す変数が3つあり、新たにサブ ルーチン内でローカル変数を
5つ宣言した場合、(3X2)+(5X2)=16バイトのソフトウェア スタック領域を、$SWSTACK命令で
設定する必要があります。
(初期値では、16バイトに設定されています)
・さらに、安全策として、内部で使用されるローカル変数のために、もう4バイトを加えて下さい。
○ フレーム領域
・サブ ルーチンまたは関数内で使用される、一時的なローカル変数は、フレーム領域として
確保されたメモリーに格納されます。
(ローカルでは、Bit型変数と配列、ERAM、XRAMへの宣言はできません)
・たとえば、サブ ルーチン内で、インテジャー型変数が3つと、10文字の文字変数を宣言
した場合、(2X3)+(10+1)=17バイトのフレーム領域が必要となります。
・さらに、INPUT、STR(x)、VAL(x) などの命令を使用すると、内部の変換ルーチンが最大で
16バイトのフレームメモリーを使用します。
・よって、この場合は17+16=33バイトの領域を、$FRAMESIZE命令で設定する必要があります。
(初期値では、32バイトに設定されています)
・サブ ルーチンまたは関数プログラムが終了した時、フレーム領域のメモリーは解放されます。
|
メモリーマップ例 (ATmega8515)
アドレス |
用 途 |
0000 |
R0 |
レジスター
ファイル |
: |
: |
001F |
R31 |
0020 |
$00 |
I/O
レジスター |
: |
: |
005F |
$3F |
0060 |
↓ 変数・配列 |
内蔵
SRAM |
: |
: |
: |
: |
: |
↑ フレーム領域 |
: |
↑ ソフトウェア スタック領域 |
025F |
↑ ハードウェア スタック領域 |
0260 |
↓ XRAM |
オプション
外部メモリー |
: |
: |
|
※ フレームおよびスタック領域は、多めに確保することに越したことはありませんが、内蔵
SRAMも決して豊富な量ではありませんので、変数や配列の数とのバランスを考えて、
領域の値を決めて下さい。 |
※ フレームおよびスタック領域は、上記解説のように初期値が自動的に設定されますが、
各自のプログラム冒頭で、設定を記述する習慣を付けて下さい。
(例)
$hwstack = 64 'ハードウェア・スタックの容量を設定。
$swstack = 10 'ソフトウェア・スタックの容量を設定。
$framesize = 24 'フレーム領域の容量を設定。 |
● XRAM
・AVRデバイスによっては、I/Oポートをアドレスバスとデーターバスに利用して、簡単に
外部メモリー(XRAM)を接続することができます。
・32KB RAMを追加する場合は、メモリー自身のスタートアドレスは0000番地ですが、レジスターや
SRAMが使用するエリアは重複するため使用できません。
・レジスターやSRAMの最終番地以降のエリアが、XRAMとして使用されます。
(たとえばAVR8515では、SRAMの最終アドレスが025F番地なので0260番地からになります)
● ERAM
・ほとんどのAVRデバイスは、内部EEPROMを持っています。
・BASCOM-AVRでは、このEEPROMをERAMと呼びます。
・ERAMには、単純なデータの読み書きの他に、変数を割り当てることもできます。
・ただし、EEPROMには100.000回の書き換え制限がありますから、書き換えが頻発する
ループのような変数を割り当てることはしないで下さい。(EEPROMが使用できなくなります)
|
(例) |
|
Dim Edat1 As Eram Byte |
' EEPROMの先頭番地から順に割り当てられます。 |
Dim Edat2 As Eram Byte At $10 |
' EEPROMの$10番地に宣言されます。 |
|
|
|