Gprs-логгер для теплицы

Тема в разделе "Arduino & Shields", создана пользователем Сирин, 23 мар 2024.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Но шильд же этого знать не может. Если он "оживает" значит на него пришло какое-то событие. Например пины 2,3 Ардуины переходили в Z-состояние на время ресета. А один из них управляет питанием шильда. Происходила инициализация библиотек и тд.
    ПС.
    if (!sim900_check_with_cmd("AT+CFUN=1\r\n","OK\r\n",CMD))
    return false;

    Происходит вызов функции ниже-лежащей библиотеки SIM900.h. Функция так же состоит из нескольких действий - отправки аргумента и ожидания ответа. Я ни разу не программист, поэтому здесь для меня возникает загадка : Команда "AT+CFUN=1\r\n" по даташиту - не дает никаких ответов. Поэтому ждать нечего !!!
     
    Последнее редактирование: 4 апр 2024
  2. Сирин

    Сирин Нерд

    теперь зависает еще раньше.
    и да. после добавления команд при заливке ругается на память
    "
    Скетч использует 8594 байт (26%) памяти устройства. Всего доступно 32256 байт.
    Глобальные переменные используют 1637 байт (79%) динамической памяти, оставляя 411 байт для локальных переменных. Максимум: 2048 байт.
    Недостаточно памяти, программа может работать нестабильно.
    "
    при этом скетч также работает
     

    Вложения:

    Последнее редактирование: 4 апр 2024
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Хех. Нормально когда свободной динамической памяти больше 512 байт. Оно было свободным не густо - 499 байт Вы добавили к коду строчки -
    Serial. println (" xxxxxxxxxxxxx").
    А каждое "xxxxxxxxxxxxxx" - кушает динамическую память, которой в AVR-ках мало. Как-то сократите тексты.
    Или используйте -
    Serial. println (F("xxxxxxxxxxxxx")).
    Этот Фокус заставляет компилятор по-другому размещать текстовые данные, освобождая динамическую (оперативную) память.
    ПС. Блин. Я не допер про память. Может в этом и есть заморочка, что памяти на УНО не хватает...
     
    Последнее редактирование: 5 апр 2024
  4. parovoZZ

    parovoZZ Гуру

    А как же мк, у которых всего 512 байт или меньше?
     
  5. parovoZZ

    parovoZZ Гуру

    С чего бы вдруг? С микро процессором не перепутал?
    Всё клнстанты читаем из флеша, не перемещая их в ОЗУ. МК, в отличие от МП, это умеет. При вызове любой подпрограммы выделяется память на стеке, после её завершения она удаляется. Так что вызовов подпро грамм можешь добавлять ровно столько, сколько хватит флеш памяти. На ОЗУ это не влияет никак.
     
  6. DetSimen

    DetSimen Гуру

    нет, это ты перепутал. Строковые константы хранятся во флэше, но при старте программы копируются в драгоценное ОЗУ и занимают там место. Это называется сегмент инициализированных данных. Чтоб этого не происходило, придумали директиву PROGMEM, тогда константа остается во флэше, но адресовать ее уже надо особым образом, аптамуш адресные пространства накладываются друг на друга.
     
    Последнее редактирование: 5 апр 2024
    Ariadna-on-Line нравится это.
  7. DetSimen

    DetSimen Гуру

    у всех стандартных функций ввода-вывода в абдурине есть 2 варианта, работающие с ОЗУ и с FLASH, например puts() и puts_P(), sprintf() и sprintf_P() и т.д
     
    Ariadna-on-Line нравится это.
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Такой метод работы должен здорово тормозить. Поэтому часто используемые константы желательно сходу перемещать в ОЗУ.
    ПС. Привычка глянуть на результаты КАЖДОГО компилирования доходит до автоматизьма. Но вы, Паровоз, сами утверждаете, что Ардуину не любите. Поэтому вам и непонятно о чем идет речь. Без обид. ))))))
     

    Вложения:

    Последнее редактирование: 5 апр 2024
  9. parovoZZ

    parovoZZ Гуру

    я ничего не перепутал. Микропроцессор и инструкции, и данные берёт исключительно из ОЗУ. По другому он не умеет.
    Микроконтроллер умеет выполнять инструкции и из флеша/фрам, и константы он умеет адресовать прямо из флеша/фрам. Если не стоит вопрос скорости (а в данном случае он не стоит), то зачем весь этот багаж копировать в ОЗУ???
     
  10. parovoZZ

    parovoZZ Гуру

    Мы же обсуждаем ATMEGA? А не МК на FRAM. У ATMEGA флеш тактируется с той же частотой, что и весь кристалл. Про какие тормоза речь, если вся дурина - это один сплошной тормоз?
     
  11. parovoZZ

    parovoZZ Гуру

    Program memory и Data memory в ядре AVR разнесены физически
     
  12. DetSimen

    DetSimen Гуру

    а адресные пространства пересекаются, и FLASH начинается с 0х0000 и RAM начинается с 0х0000, поэтому, инструкции чтения разные. Соответственно и функции ввода вывода знают, откуда что читать, puts() читает из ОЗУ, а puts_P() тот же самый адрес читает из FLASH, тока другими командами процессора. Я ж тебе ссылку дал, тама всё написано.

    Format strings in flash ROM
    All the printf and scanf family functions come in two flavours: the standard name, where the format string is expected to be in SRAM, as well as a version with the suffix "_P" where the format string is expected to reside in the flash ROM. The macro PSTR (explained in <avr/pgmspace.h>: Program Space Utilities) becomes very handy for declaring these format strings.
     
  13. parovoZZ

    parovoZZ Гуру

    зачем мне твоя ссылка, если у меня перед глазами даташит на кристалл?
    Ты мне пытаешься доказать, что АЛУ МК AVR всё, что не является инструкцией, самостоятельно копирует в ОЗУ? Но это же вовсе не так. Нам достаточно взять адрес во флеше и по этому адресу прочитать содержимое. Для чего лишняя операция копирования в ОЗУ (pgm_read_byte() и её аналоги)?
     
  14. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Выше я приплюсовал два скрина к сообщению. Один и тот же код. С использованием (всего в одной строчке) инструкции (F("nnn")) и без. И сообщения компилятора. Че тут спорить-то ???
     
    Последнее редактирование: 5 апр 2024
  15. DetSimen

    DetSimen Гуру

    Ты забываешь, что кроме AVR с его инструкциями есть RTL библиотека gcc, именно она копирует в ОЗУ все инициализированные данные с глобальной областью видимости, в том числе строковые литералы. А еще она вызывает конструкторы глобальных обьектов, строит в ОЗУ VMT виртуальных обьектов, и прочее и прочее... Если пишешь сам на асме, то ничего этого автоматом делать не надо, ты сам решаешь что где храницца и что надо вызывать и что не надо. Но как только написал main() {} в своей программе, изволь играть по правилам С++ с его RTL. Ты дремучий как паравоз, я с тобой спорить не буду, сам читай или спроси у гугола. :)
     
    Последнее редактирование: 5 апр 2024
  16. parovoZZ

    parovoZZ Гуру

    ты забыл добавить -
    . У других МК Atmel и прочих производителей всё совсем не так.

    это к вашей дурине зачем-то прикрутили С++. У других производителей стеки написаны на Сях.
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    По всему вы спорите на пустом месте. Надо только представить себя на месте компилятора. По логике, если строковые данные типа "AT+CFUN=1\r\n" явно задекларированы как константы - он всунет их ПЗУ. В нашем же случае они появляются как черт из табакерки - безымянные. Поэтому компилятор сует их в ОЗУ. Он же не уверен что их не будут как-либо изменять. Директива "(F(" - меняет поведение компилятора. Присваивает втихаря данным тип - константа. Чтобы программер не морочился с декларированием. По-моему как-то так.
     
    Последнее редактирование: 5 апр 2024
  18. parovoZZ

    parovoZZ Гуру

    они всегда лежат в ПЗУ. Вперемешку с инструкциями. Другого места хранения попросту НЕТ.
     
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Ну это-то и ежу понятно. Фишка в том - какие служебные инструкции компилятор приплюсует к нашему коду. Сегмент инициализации - по словам деда Семёна.
    ПС. В компах IBM процессор после ресета совался сначала в самый конец адресуемого пространства (шага на 2-3 до "обрыва"))))). И исполнял стартовую встроенную инструкцию - считал-выполнил. Это аппаратно задано его конструкцией. А в этих адресах физически стояла микросхема ПЗУ, которая организовывала всю дальнейшую работу. Тоже своего рода сегмент инициализации.
     
    Последнее редактирование: 5 апр 2024
  20. parovoZZ

    parovoZZ Гуру

    это всё от того, что gcc написан под Неймана, а Atmel AtMega - Гарвард (ну или наоборот - постоянно путаю). Отсюда такие костыли.
    Кстати, а как там в IAR?

    Оно и сейчас также. У микропроцессоров всё общение с периферией происходит через ОЗУ - иначе они не умеют. А для того, чтобы среда исполнения (операционка или что там) знала по каким адресам какие устройства расположены, ей и нужна эта ПЗУ. Более привычное название - BIOS.