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

A way to access flash memory avoiding pgm_read (avr microcontrollers)

本文关键字:闪存 方法 avr 控制器 访问 一种 pgm read      更新时间:2023-10-16

当你想访问闪存时,你必须写这样的东西:

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

我该如何编写此类?

谢谢。

您可以使用

fmorgner 的 AVR++ 库中的flash_constant

之前(示例 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;
  }