Массив bool в EEPROM

Тема в разделе "Arduino & Shields", создана пользователем postal2201, 16 янв 2017.

  1. Unixon

    Unixon Оракул Модератор

    Ну это заготовка для чего то. Пока не поймете зачем оно вам, можете убрать (закомментировать).

    С полным Wiring это вам не очень светит, но если уберете Serial, то может влезете. Опеределения пинов - переделать через макросы, инициализацию eeprom - переделать через копирование из flash (см. PROGMEM).
     
    Последнее редактирование: 19 янв 2017
  2. Unixon

    Unixon Оракул Модератор

    Вот пример обрезка библиотеки для ATtiny2313. Обратите внимание, как мало осталось от hwserial и timeutil.
     

    Вложения:

    Alex19 нравится это.
  3. postal2201

    postal2201 Нерд

    serial использую только для отладки, в рабочем коде его не будет.
    По поводу инициализации eeprom через flash так?
    Код (C++):
    PROGMEM unsigned char ByteSet[] = {0b01011001, 0b11001001, etc...};
    int addr = 0;
    for (char i=0;i<16;i++){
      EEPROM.put(addr+i, ByteSet[i]);
    А как в цикле динамически определять размер массива для записи?
    P.S. А вообще я немного запутался. Если мы создаем массив в progmem, то зачем нам его копировать в EEPROM? Ведь функцией readbit можно сразу считывать данные с этого массива и отключить либу eeprom.h кушающую память. Или я что-то упускаю?
     
    Последнее редактирование: 19 янв 2017
  4. postal2201

    postal2201 Нерд

    Вот чтение бит напрямую из PROGMEM
    Код (C++):
    void setup() {
    Serial.begin(9600);
    for (char i=0;i<16;i++){
      Serial.print(readBit(i));
    }

    }
    const unsigned char ByteSet[] PROGMEM = {0b01011001, 0b11001001};
    bool readBit(int index)
    {
      int byte_index = index >> 3;
      byte bits = pgm_read_byte(&(ByteSet[byte_index]));
      int bit_index = index & 0x7; // same as (index - byte_index<<3) or (index%8)
      byte mask = 1 << bit_index;
      return (0 != (bits & mask));
    }
    void loop() {
       
    }
     
  5. Unixon

    Unixon Оракул Модератор

    Да.

    А зачем? Он же не меняется. Задавайте размер константой.

    Ну, если вы его планируете менять в процессе работы и снова запоминать, тогда имеет смысл хранить в EEPROM и при первом запуске переносить из FLASH в EEPROM. А если эти данные вообще никогда не меняются, то EEPROM совершенно не нужен, можно читать напрямую из FLASH, как вы и сделали.
     
  6. Unixon

    Unixon Оракул Модератор

    Код (C++):

    const uint8_t IR_CMDS_SIZE = 2;
    const uint8_t IR_CMDS[IR_CMDS_SIZE] PROGMEM = {0b01011001, 0b11001001};
     
     
  7. Unixon

    Unixon Оракул Модератор

    Можно еще так попробовать
    Код (C++):

    bool pgm_read_bit(const prog_uint8_t *data, int index)
    {
      int byte_index = index >> 3;
      byte bits = pgm_read_byte(&data[byte_index]);
      int bit_index = index & 0x7; // same as (index - byte_index<<3) or (index%8)
      byte mask = 1 << bit_index;
      return (0 != (bits & mask));
    }

    void foo()
    {
      pgm_read_bit(&IR_CMDS, i);
    }
     
     
  8. postal2201

    postal2201 Нерд

    Про динамическое определение массива в цикле это я для себя на будущее спросил. Я наверное неправильно выразился, допустим arr[0b01011001, 0b11001001] у меня массив размерностью 2 байта, чтобы его перечитать побитно я завожу счетчик for (char i=0;i<16;i++) и далее функция побитного чтения. Но что если размер массива мне неизвестен, как завести сетчик чтобы ститать весь массив до конца?
    Данные меняться не будут, поэтому пришел к выводу что в данном проекте EEPROM мне без надобности. Только ByteSet[] сейчас у меня расположен в области глобальных переменных, а хотелось бы чтобы в каждой из 3х функций
    Код (C++):
    void inject_SCEE()
    void inject_SCEA()
    void inject_SCEI()
    был свой массив ByteSet[]. Но как тогда передавать нужный ByteSet[] в функцию readBit?
    Либо объявить в глобальных 3 разных массива, но опять же как из функции допустим, void inject_SCEA(), передать в readBit нужное имя массива.
    Unixon, извините за детские вопросы, только неделю занимаюсь изучением программирования, да и то в перерывах на работе. :) А дома жена, ребенок....только ночью можно в что-либо нормально почитать.
     
  9. mcureenab

    mcureenab Гуру

    Почитайте https://www.arduino.cc/en/Reference/BitRead
    >> как тогда передавать нужный ByteSet[] в функцию readBit?
    через параметр

    bool readBit(int index, const unsigned char *ByteSet){ ...

    }

    void inject_SCEE() {
    static const unsigned char ByteSet[] PROGMEM ={0b01011001, 0b11001001};
    readBit(1, ByteSet);

    }
     
  10. rkit

    rkit Гуру

    Да такого массива - никак. Есть массивы, которые заканчиваются нулем, но это не тот случай. Надо знать, или хранить число где-то рядом.
     
  11. Unixon

    Unixon Оракул Модератор

    Как он может быть вам неизвестен?
     
  12. postal2201

    postal2201 Нерд

    Я наверное неправильно задал вопрос. В JAVA есть свойство массива .length. Есть ли аналог этого свойства в C++?
    Спасибо, работает :)
    Друзья всем спасибо за помощь!
    Списался с разработчиком исходника(были вопросы по поводу неиспользуемых в прошивке функций), оказалось что он сам собрал его из нескольких кусков и в исходнике полно мусора. Еше у меня будет вопрос о вызове функции с помощью прерывания, но может стоит создать для этого отдельную тему? Здесь по битовым операциям уже все разжевали :)
     
  13. rkit

    rkit Гуру

    Если сделаете - то будет. Просто так в низкоуровневых языка память не расходуют.
     
  14. Unixon

    Unixon Оракул Модератор

    В Java массив - это объект, у которого есть какие-то свойства, а в C/C++ массив - это просто адрес первого элемента в памяти, никаких свойств кроме собственного значения у него нет. Вы можете в C++ сделать класс массива и хранить в нем длину в отдельном поле в дополнение к данным, тогда это будет аналог того, что есть в Java.
     
  15. mcureenab

    mcureenab Гуру

    Для C++ разработаны библиотеки шаблонов. Например STL или например BOOST. В этих библиотеках есть все чтобы создавать объекты более высокого уровня чем имеющиеся интегральные типы.