Способ доступа к флеш-памяти без использования pgm_read (микроконтроллеры AVR) - PullRequest
0 голосов
/ 04 января 2019

Когда вы хотите получить доступ к флэш-памяти, вы должны написать что-то вроде этого:

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 голосов
/ 30 марта 2019

Вы можете использовать flash_constant из библиотеки fmorgner AVR ++ .

До (пример 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;
  }
...