要访问闪存时,您必须编写如下内容:
constexpr uint8_t n PROGMEM = 10;
auto x = pgm_read_byte(&n);
我不喜欢这种方式访问内存。我想以相同的方式访问每种类型的内存(RAM,闪存,EEPROM ...)。我想更好地写这样的东西:
constexpr uint8_t n = 10; // constexpr tells the compiler:
// eh! I'm not planning to write in this variable
// so you can put it in flash memory
auto x = n; // copy n into x (but x is uint8_t, not constexpr)
我天真地尝试像这样实现:
namespace Progmem{
class uint8_t{
constexpr uint8_t(::uint8_t x):v{x}{}
// TODO: operator uint8_t() const {return pgm_read_byte(&v);}
// private:
::uint8_t v PROGMEM;
};
}
并以此方式进行测试:
constexpr Progmem::uint8_t n = 10;
auto x = pgm_read_byte(&(n.v));
它可以编译,但是x中的数字存储不正确。
我怎么写这个课?
谢谢。
答案 0 :(得分:0)
您可以使用flash_constant
中的fmorgner's AVR++ library。
之前(例如demo_progmem.c):
#include <avr/pgmspace.h>
#include <stdint.h>
int const demo PROGMEM = 1;
int main()
{
return pgm_read_word(&demo);
}
之后(例如demo_progmem.cpp):
#include <avr/flash_constant.hpp>
#include <avr/cstdint.hpp>
auto const demo = avr::flash_constant{1};
int main()
{
return demo;
}