一种避免pgm_read的访问闪存的方法(AVR微控制器)

时间:2019-01-04 18:23:57

标签: c++ avr progmem

要访问闪存时,您必须编写如下内容:

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中的数字存储不正确。

我怎么写这个课?

谢谢。

1 个答案:

答案 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;
  }