1. 程式人生 > >gcc中printf/scanf、printf_P/scanf_P的區別與用法

gcc中printf/scanf、printf_P/scanf_P的區別與用法

 

 從字面意思來看
printf/scanf是對RAM的操作,即把記憶體資料輸出/輸入到RAM。
printf_P/scanf_P是對ROM的操作,即把ROM資料輸出/輸入到ROM

#include <avr/pgmspace.h> 這個標頭檔案用來訪問flash ROM的資料,訪問flash ROM的資料
必須用特定的指令LPM實現,而一般的函式或賦值語句gcc不能產生LPM指令,因此avr-libc
用特定的函式或巨集實現對flash ROM的資料的訪問。

PSTR是pgmspace.h預定義的巨集,它返回指向flash ROM區的靜態字元指標,只能用在函式體內的賦值語句和函式引數表中。如:
要定義一個指向存在flash ROM的字串"hello"的全域性指標str:
const char *str =PSTR("hello");//錯
正確用法:
const char *str ;
main(void)
{
 str=PSTR("hello");
}

printf("str")           //字串在RAM裡
printf_P(PSTR("str"))   //字串在FLASH裡

兩者區別只是傳遞的字串指標,一個指向RAM,一個指向FLASH