AVR Studio リテラル文字列取扱注意 Part 2
前回の日記で扱ったリテラル文字列の処理は不完全でした。
http://ameblo.jp/elementor/entry-10192030215.html (←前回の日記)
ポイント1
リテラル文字列容易のROM配置指定のマクロがありました
『PSTR』
ポイント2
読込みにもprogram(ROM)領域を意識する必要があります
ポイント3
昨日の疑問なぜRAMにリテラルを配置するか分りました。
AVRではROM(program)領域とRAM(data)領域はアドレス空間自体が異なっています。
そのため通常変数として扱う場合はdata領域に配置していなければなりません。
program領域に配置した変数は特別な操作(*)をしないとデータを読み込めません。
CPUの構造による制約だったわけです。
*:LPM
そういうわけでコードを書き直すと次のようになります。
~定義部~
#include <avr/pgmspace.h>
#define ERRMSG_BAD_COMMAND PSTR("E1")
#define ERRMSG_BAD_PARAMETER PSTR("E2")
~関数内~
SendMsg_P(ERRMSG_BAD_COMMAND);
/* SendMsg実装 */
void SendMsg_P(PGM_P buf){
char c;
while((c = pgm_read_byte(buf)) != (char)0)
{
UART_write(c);
buf++;
}
UART_write('\r'); /* 改行コード */
UART_write('\n'); /* 改行コード */
}
/*----ここまで----*/
PSTRを使ったことで幾分シンプルになりましたね。