AVR Studio リテラル文字列取扱注意 Part 2 | 組込みとともに

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を使ったことで幾分シンプルになりましたね。