Sử dụng avr-gcc
có thể lưu trữ dữ liệu trên Bộ nhớ chương trình để tiết kiệm RAM. Điều này được hoàn thành bằng cách sử dụng PROGMEM attribute. AVR-libc cũng cung cấp một macro, PSTR(), có thể được sử dụng với các chuỗi ký tự.PSTR() trên __FUNCTION__
Bây giờ tôi đang cố gắng sử dụng PSTR()
với __func__
, __FUNCTION__
or __PRETTY_FUNCTION__
.
Các mã sau công trình như mong đợi,
display.message(__func__, 2);
display.message(__FUNCTION__, 2);
display.message(__PRETTY_FUNCTION__, 2);
, trong khi biên soạn của bất kỳ của những dòng này thất bại,
display.messageP(PSTR(__func__), 2);
display.messageP(PSTR(__FUNCTION__), 2);
display.messageP(PSTR(__PRETTY_FUNCTION__), 2);
, với lỗi sau:
initializer fails to determine size of '__c'
Định nghĩa của PSTR, từ WinAVR/avr/include/avr, giải thích các biến được giới thiệu trên các thông báo lỗi:
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
Đây không phải là một cái gì đó chung để macro, như __FILE__
biên dịch và hoạt động tốt:
display.messageP(PSTR(__FILE__), 2);
Bất kỳ ý tưởng nào về nguyên nhân gây ra lỗi này và nếu có thể sử dụng PSTR() để chèn tên hàm vào bộ nhớ chương trình?
Có vẻ như không thể đặt các chuỗi ký tự chuỗi đó vào không gian đó khi chúng yêu cầu các chức năng đặc biệt? để truy cập chúng. Thật ra, những cái tên này khá nhỏ bé nên tôi tự hỏi liệu có một lợi thế thực sự để di chuyển chúng ở đó hay không. Tôi nói điều này mà không có ý tưởng về số lượng RAM thực tế bạn có mặc dù. –
@MichaelDorgan avr-libc cung cấp các chức năng truy cập biến trong bộ nhớ chương trình; điều này được xác nhận bởi dòng cuối cùng của mã trên câu hỏi, mà hoạt động tốt. Tôi đồng ý rằng các chuỗi này là nhỏ, nhưng chúng rất quan trọng trong các hệ thống nhúng (chỉ với một vài Kbytes RAM). – mMontu