Шаговые моторы проблема со скоростью

Тема в разделе "Arduino & Shields", создана пользователем sanik, 7 янв 2020.

Метки:
  1. Daniil

    Daniil Гуру

    мне кажется, что нет(
    Вы используете ST.last_time[0] и ST.last_time[1]?
    Мне кажется, что нет это и есть те зарезервированные места в грузовиках, которые никогда не используются.

    В самом начале у вас есть куча, именно так и звучит термин — некоторый объём памяти, предназначенный для переменных.
    upload_2020-1-23_1-18-51.png
    Когда вы объявляете переменные:
    Код (C++):
    uint8_t x = 150;
    uint16_t y = 17533;
    то компилятор выделяет 1 байт под переменную "х", а под переменную "y" 2 байта.
    Не будем обсуждать в каком порядке следуют байты в памяти — условимся, что старший байт переменной хранится по младшему адресу (big-endian) Можно почитать тут, а проблемы тут.
    И не будем говорить где именно он выделяет память, т. е. по какому адресу. Будем думать что наверняка где-то в куче — для нашей задачи это не важно.
    upload_2020-1-23_1-21-9.png
    Значения битов нас мало интересуют, поэтому далее я эту колонку приводить не буду. (Рекомендую этот калькулятор и ещё вот эту статью про числа с плавающей точкой, у них же есть калькулятор для IEEE754)
    Создадим структуры (для простоты я уменьшил их объём, убрал uint32_t и т. п. и выкинул ненужные для примера поля структуры):
    Код (C++):
    //Объявляем тип структуры таймера
    struct timer_t {
      uint8_t period_ms;
      uint16_t last_time[2];//
      uint8_t step_time;
    };
    //Объявляем тип структуры пина
    struct pin_t {
      uint8_t Name; // номер пина
      timer_t PWM;
      timer_t ST;
    };
    В памяти ничего не изменяется, т. к. переменные ещё не созданы.
    Далее, объявляем переменную (для простоты 1шт., а не массив)
    Код (C++):
    pin_t pins;
    Тогда компилятор выделит в памяти некий объём для них:
    upload_2020-1-23_1-22-27.png
    Судя по тому, что когда вы инициализируете вашу структуру, где вы не иницализируете pin.ST.last_time[0] и pin.ST.last_time[1], я предполагаю, что вы и не хотели их использовать. В вашем случае память будет выделена, но использоваться не будет. Это не плохо, до тех пор пока код не начнут оптимизировать по памяти. (ещё есть нюансы со временем доступа, но я тут не подскажу).


    Поэтому я и предлагал использовать такую структуру таймера, вынести step_time из структуры timer_t в структуру pin_t и убрать массивы у last_time:
    Код (C++):
    struct timer_t {
      uint8_t period_ms;
      uint16_t last_time;
    };
    //Объявляем тип структуры пина
    struct pin_t {
      uint8_t Name; // номер пина
      uint8_t step_time;
      timer_t PWM;
      timer_t ST;
    };
    Тогда распределение памяти будет таким как показано справа, слева приведено распределение предыдущего варианта:
    upload_2020-1-23_1-23-11.png
    В таком случае, очевидно, объём выделенной памяти будет меньше и программист, мне кажется, будет более осведомлён о назначении той или иной переменной. Он будет понимать, что в pin.ST.last_time записано время последнего срабатывания ST, а в переменной pin.PWM.last_time время последнего срабатывания изменения пина, для period_ms аналогично.
    Дада. Либо нумеровать ячейки памяти надо с нуля, либо последняя ячейка 65536.
    Ещё на некоторых картинках косяк с точками, ну это уже мелочи
     
    Последнее редактирование: 23 янв 2020
    DetSimen нравится это.