использование строк в проекте и его размер

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

  1. parovoZZ

    parovoZZ Гуру

    а на ноги МК? Не?
    А что мешает опрашивать кнопки по таймеру? Автоматом получишь короткое нажатие и длинное.
     
    Сусемьбек нравится это.
  2. (эт снова я, из за компа выгнали)
    А что так можно?) Спасибо про ноги я даже и не подумал. Таймеры все заняты(. Даже экранчик подключен с таким секесом, что сам удивляюсь как работает. (Все впредь обещаю создавать отдельные темы)
     
  3. b707

    b707 Гуру

    простите, я правильно понял. что этот код у вас занимает 6% программной памяти и 9% оперативки??? Для про мини, у которой 16К флеша и 1 К ОЗУ - выходит этот код занимает 1кб флеша и 100 байт переменных?

    Вы серьезно?

    добавка - проверил - код занимает 492 байта флеша и 6 байт переменных, если выкинуть лишнее..
    Супер_вася, вы когда размер кода вычисляете - вы не забываете размер системных библиотек учитывать? Например, примерно 70% размера приведенного отрывка составляют две строки обращения к Сериалу. Выкиньте их и код сразу станет меньше почти вчетверо, размер переменных - в 10 раз!
     
    Последнее редактирование: 7 авг 2018
    CYITEP_BAC9I и Igor68 нравится это.
  4. Igor68

    Igor68 Гуру

    Да не то, что неудобно... думаю изменять и отлаживать даже приятно дистанционно имея GCC и т.п. Железка где-то на столбе... или в подвале, а контролировать и корректировать можно и рядом не залезая ни на столб ни в подвал. Сам так делал(ю): по wifi ноут соединён с устройством, а сам рядом с установкой без вибробункеров и пыли, но рядом с пультом управления.
     
  5. parovoZZ

    parovoZZ Гуру

    Если сериал софтовый, то влёгкую.
     
  6. b707

    b707 Гуру

    если железный - то же самое.
     
  7. parovoZZ

    parovoZZ Гуру

    Так я ещё и вачдог настроил на случай неудачного эксперимента. Вот только не понял - вачдог вроде аппаратный, а ресетит он программно... ну или я не разобрался. Проверял каким-то скриптом на питоне - он тупо вешает малинку, но SSH сессия не отваливается, а малинка через 15 секунд ресетится. Чудеса)))
     
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Спасибо. таки да сглупил. без сериала намного меньше. на нормальный антидребезг места хватит, но придется по частям код "отлаживать". )
    может и удаленные пункты меню, которые урезал получится вернуть. А исче я хочу не текстовое а графическое меню, но это уже другая тема и микроконтроллер:)
    Добавлено позднее:
    радости выше крыши, у меня еще место есть на Дуне! ураааа!!! Все так просто было
     
    Последнее редактирование: 7 авг 2018
  9. parovoZZ

    parovoZZ Гуру

    Блин, ты серьезно? Железный усарт настроить - четыре строчки кода без использования ОЗУ вообще. Откуда 100 байт нарасло)))? СТО байт, сцуко!!!
     
  10. Igor68

    Igor68 Гуру

    по второй "параллельной" SSH сессии проконтролируйте... процессы проконтролируйте.
    сессия 1 для запуска, сессия 2 для контроля (ps, top, free и т.п.)
     
  11. b707

    b707 Гуру

    ну вот видите - каждый в свою сторону смотрит.
    Я наоборот - выпилил из проекта меню вовсе, убрал все кнопки, кроме ресета :), управление сделал удаленным. Как уже писал выше - предпочитаю разделять функции по отдельным маленьким девайсам. Так оно значительно устойчивее получается, если одно сдохнет - остальные продолжат работать.
     
    CYITEP_BAC9I нравится это.
  12. b707

    b707 Гуру

    по умолчанию там буфер 64 байта... ну и еще по мелочи :)
     
    Последнее редактирование: 7 авг 2018
  13. b707

    b707 Гуру

    не забывайте еще строки во флеш перемещать - для меню очень актуально.
     
    CYITEP_BAC9I нравится это.
  14. parovoZZ

    parovoZZ Гуру

    Буфер на хера? Можно подумать, что на приём к усарту очередь из 64 АЛУ.
     
  15. SergeiL

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

    Только что проверил, пустой скетч типа:
    Код (C++):
    void setup() {
      // put your setup code here, to run once:

    }

    void loop() {
      // put your main code here, to run repeatedly:

    }
    Для Leonardo:
    Скетч использует 3618 байт (12%) памяти устройства. Всего доступно 28672 байт.
    Глобальные переменные используют 149 байт (5%) динамической памяти, оставляя 2411 байт для локальных переменных. Максимум: 2560 байт

    Код (C++):
    #define PIN_IN_0 4      // Left
    #define PIN_IN_1 5      // Right
    #define PIN_IN_2 6      // Forward
    #define PIN_IN_3 7      // Backward

    #define PIN_IN_NUMB 4  // количество используемых входов значение от 1 до 8.
                           // Если входов больше 8 ходов - меняем размер переменных участвующих в хранении результатов с byte на unsigned int или long

    uint8_t InputPins[PIN_IN_NUMB] = { PIN_IN_0,PIN_IN_1,PIN_IN_2,PIN_IN_3};  // заносим номера пинов в массив, для обработки через for

    #define PIN_READ_TO  10L             // 10 ms  периодичность проверки входов. Оптимальным является интервал 5-10мс. соответственно в результате сигнал о нажатии будет получен через 20-40мс  (в данном случае 40мс)

    //------------------ Чтение цифровых входов --------------------------------------
    uint8_t Input_Read(void)
    {
          uint8_t result = 0;                           // копим побитовое состояние входов
          uint8_t i,j;
          for (i=1,j=0; j < PIN_IN_NUMB; j++,i=i<<1)    // пробежимся по всем входам
          {                            
                                                        // Если при нажатии кнопки на входе появляется VCC - в if оставляем == HIGH.
              if ( digitalRead(InputPins[j]) == HIGH )  // Если при нажатии кнопки на входе появляется GND - заменить HIGH на LOW
                result |= i;                            // Дальше всегда будем считать, что если бит в 1 - это кнопка нажата или на входе ON.
          }                                             //                                             0 - это кнопка отпущена или на входе OFF.
                                                        // в result "1" взводится в соответствующем бите.
                                                        // например, если на входе 2 (считаем с 0, в define в самом верху определено, что это цифровой пин 6),
                                                        // присутсвует 1 - в result добавится "1"  в 2-ом от нуля бите.  00000100
          return(result);
    }

    //------------------ ФУНКЦИЯ УСТР. ДРЕБЕЗГА  для всех входов --------------------------------------
    uint8_t vc_debounce(uint8_t SWKEYS)        // Verical_Couners_debounce, вызывается каждые 10 мсек, можно из таймера
    {                                           // в SWKEYS состояние вводов

        static uint8_t SLATCH = 0;              // текущее устоявшееся значение входов после устранения дребезга
        static uint8_t VCBIT0 = 0;              // счетчик бит 0
        static uint8_t VCBIT1 = 0;              // счетчик бит 1
        uint8_t        vcmask = 0;              // Маска
        vcmask = SWKEYS ^ SLATCH;                    // скинем счетчики для установившихся и неактивных значений
        VCBIT0 &= vcmask;
        VCBIT1 &= vcmask;
        SLATCH ^= (vcmask & VCBIT0 & VCBIT1);       //  Каждая '1' в SLATCH представляет установившееся значение, каждый '0' установившееся нулевое значение          
        VCBIT1 ^= (vcmask & VCBIT0);                // инкрементируем счетчик.
        VCBIT0 ^= (vcmask);

      return (SLATCH);                              // текущее, устоявшееся значение входов
    }

    void setup()
    {
        byte j;
        for (j=0; j < PIN_IN_NUMB; j++)        // настроим  порты, ккотрым подключены кнопоки, как входы. Резистор подтяжки - внешний.
            pinMode(InputPins[j], INPUT);    

    }
    void loop()
    {
       static uint32_t    LastPinReadMs = 0 ;      // переменная для сохранения времени, когда были считаны значения с цифорвых входов
       static uint8_t     LastSendState=99;        // переменная для сохранения последнего отправленного состояния
       uint8_t            current_state;           // переменная для текущего состояние по кнопкам
     
       uint32_t           cur_millis = millis();            // переменная для сохранения текущего времени, дабы не вызывать millis() несколько раз

       if ((cur_millis - LastPinReadMs) > PIN_READ_TO)      // выполняется каждые 10мс (PIN_READ_TO)
       {
          current_state = Input_Read();                     //  1) прочитаем и загрузим в переменную значения входов: 0-й бит - первый вход, 1-й бит - второй вход, 2-й бит - третий вход, 3-й бит - четвертый вход.
          current_state=vc_debounce(current_state);         //  2) отбросим дребезг по всем входам, на основании предыдущих проверок (игнорируем состояния, держащиеся на входе менее 4 проверок подряд)
          LastPinReadMs = cur_millis;                       // запомним время опроса кнопок
          if (LastSendState != current_state )  // 3) если изменилось состояние кнопок
          {
            // Тут обработаем, что вновь нажато :-))
            LastSendState = current_state;                                                  //    запомним последнее состояние
          }
       }
    }
    Если вставить обработку дребезга на вертикальных счетчиках для четырех входов получаем:
    Скетч использует 4208 байт (14%) памяти устройства. Всего доступно 28672 байт.
    Глобальные переменные используют 160 байт (6%) динамической памяти, оставляя 2400 байт для локальных переменных. Максимум: 2560 байт.


    ИМХО короче и быстрее не получится.
     
    Последнее редактирование: 7 авг 2018
    Сусемьбек нравится это.
  16. parovoZZ

    parovoZZ Гуру

    Да шняга это все.

    Для леонарды буратино иде должна вставлять код работы с интерфейсом USB.
     
  17. parovoZZ

    parovoZZ Гуру

    Вот ему расскажи про это, а то он не в курсе

     
    Mitrandir и Сусемьбек нравится это.
  18. SergeiL

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

    Да, конечно....
    Вспоминается анекдот про девочек, которые не пукают, но постоянно пи**ят чтобы не разорвало.
     
  19. parovoZZ

    parovoZZ Гуру

    Сетупы и лупы для чего? Надо настроить таймер и в его прерывании опрашивать кнопки. Так кода на 200 байт флеша и чутка ОЗУ. А если в прерывании переменными не пользоваться, то и вообще 1 байт ОЗУ будет занят под это дело.
     
  20. Читер:)