большие массивы данных и 1 кб динамической памяти

Тема в разделе "Arduino & Shields", создана пользователем Unikolai, 12 мар 2018.

  1. Unikolai

    Unikolai Гик

    Всем доброго времени суток. Есть массивы данных, оч большие по меркам ардуины.
    byte massivt[] = {1,2,3....4000...);
    этот массив займет всю память...динамическую...как поместить его в основную память устройства?
    eeprom использовать для этого дела не буду, но было бы интересно, как с ней это работает
     
    Последнее редактирование: 12 мар 2018
  2. b707

    b707 Гуру

    если массив не должен меняться - используйте PROGMEM. Если в массиве переменные - то только внешние редства хранения, типа SD_карты
     
  3. Unikolai

    Unikolai Гик

    да, массив меняться не будет. А без использования доп библиотек нельзя обойтись?
     
  4. DetSimen

    DetSimen Гуру

    Если значение элемента массива можно вычислить по какому-нибуть лагаритму, то можно вапще его не хранить
     
  5. b707

    b707 Гуру

    PROGMEM - не "дополнительная библиотека". а часть "родного" кода работы с процессором. Если не хотите ее использовать - освойте работу с флеш-памятью сами.
     
  6. Unikolai

    Unikolai Гик

    не, массив буде задаваться изначально, генерировать его никак не получится)
     
  7. Unikolai

    Unikolai Гик

    ну в принципе коль такие дела, то будем использовать ее, спасибо)
     
  8. Unikolai

    Unikolai Гик

    Код (C++):
    int i = 0;
    #include <avr/pgmspace.h>
    const int r[] PROGMEM  = {6,5,3,1,15,28,6...n};
    void setup() {
      Serial.begin(9600);
      // put your setup code here, to run once:

    }

    void loop() {
      i = i + 1;
      int j = pgm_read_byte(&(r[i]));
      Serial.println(j);
      delay(500);
      // put your main code here, to run repeatedly:

    }
    подскажите еще, если сделать так(хотя вот эта строка pgm_read_byte(&(r)); меня так смущает, но я принял ее как данность) то предыдущее значение j будет постоянно обновляться и ram не будет наполняться с каждым новым значением?
     
  9. b707

    b707 Гуру

    pgm_read_byte тут не подходит, потому что у вас в массиве не байты, а целые. Вопроса "не будет ли наполнятся РАМ?" - честно говоря не понял
     
  10. Unikolai

    Unikolai Гик

    прошу прощения, int я поставил, чтобы просто проверить, что размер скетча увеличивается, по сравнению с типом byte. Будет byte(хотя и с int выводил значения правильные)ну я имею ввиду, что каждый раз я из массива на флеш памяти беру одно значение. Мне потом его нужно удалять из RAM программно или оно само удалится?
     
  11. b707

    b707 Гуру

    Каждый раз вы читаете значение из флеша в одну и ту же переменную - то есть в одну и ту же область памяти. Таким образом, в оперативке у вас занимается размер только на одно значение и ничего удалять не надо - каждое следующее чтение перезаписывает предыдущее.
     
  12. Unikolai

    Unikolai Гик

    я так и думал, на всякий уточнил, мне тепрь спокойнее, спасибо)
     
  13. Unikolai

    Unikolai Гик

    А вот естm еще один вопрос, можно ли PORTD( к примеру) задать какой-то переменной(не хочу использовать стандартные PD0-7), чтобы не писать PORTD = 0b00100000;А писать g = 0b00010000;
     
  14. DetSimen

    DetSimen Гуру

    #define g PORTD
     
  15. Unikolai

    Unikolai Гик

    о да, это работает, но получается, что g это у нас константа, другой порт переменной g я уже не смогу присвоить?
     
  16. b707

    b707 Гуру

    присваивание портов переменной имеет довольно мало смысла, так как порты PORTB PORTC PORTD не взаимозаменяемы - на одном висит РЕСЕТ, на другом кварцевый резонатор... Если вы хотите читать из массива байт и пихать в порт - лучше сделать три разных массива для каждого из портов - B C D
     
  17. mcureenab

    mcureenab Гуру

    Можно для этого ссылку использовать

    Код (C++):
    volatile uint8_t &g = PORTB;
     
    DetSimen нравится это.
  18. Unikolai

    Unikolai Гик

    нет, ну почему же, вполне имеет смысл, вполне можно написать функцию и тот же массив соответствия.
     
  19. Unikolai

    Unikolai Гик

    а подскажите, uint8_t можно заменить на другой тип данных? byte в интернете вроде как написано. И что значит "&g". После такой записи получится, что g будет ссылкой на "PORTB" ?
     
  20. DetSimen

    DetSimen Гуру

    &g будет ссылкой на то, что ему присвоить. PORTD или PORTB или вообще TIMSK, да что угодно, типа byte, у чего есть адрес.

    напиши
    using byte = uint_8t;
    и используй привычное название