Но шильд же этого знать не может. Если он "оживает" значит на него пришло какое-то событие. Например пины 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" по даташиту - не дает никаких ответов. Поэтому ждать нечего !!!
теперь зависает еще раньше. и да. после добавления команд при заливке ругается на память " Скетч использует 8594 байт (26%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 1637 байт (79%) динамической памяти, оставляя 411 байт для локальных переменных. Максимум: 2048 байт. Недостаточно памяти, программа может работать нестабильно. " при этом скетч также работает
Хех. Нормально когда свободной динамической памяти больше 512 байт. Оно было свободным не густо - 499 байт Вы добавили к коду строчки - Serial. println (" xxxxxxxxxxxxx"). А каждое "xxxxxxxxxxxxxx" - кушает динамическую память, которой в AVR-ках мало. Как-то сократите тексты. Или используйте - Serial. println (F("xxxxxxxxxxxxx")). Этот Фокус заставляет компилятор по-другому размещать текстовые данные, освобождая динамическую (оперативную) память. ПС. Блин. Я не допер про память. Может в этом и есть заморочка, что памяти на УНО не хватает...
С чего бы вдруг? С микро процессором не перепутал? Всё клнстанты читаем из флеша, не перемещая их в ОЗУ. МК, в отличие от МП, это умеет. При вызове любой подпрограммы выделяется память на стеке, после её завершения она удаляется. Так что вызовов подпро грамм можешь добавлять ровно столько, сколько хватит флеш памяти. На ОЗУ это не влияет никак.
нет, это ты перепутал. Строковые константы хранятся во флэше, но при старте программы копируются в драгоценное ОЗУ и занимают там место. Это называется сегмент инициализированных данных. Чтоб этого не происходило, придумали директиву PROGMEM, тогда константа остается во флэше, но адресовать ее уже надо особым образом, аптамуш адресные пространства накладываются друг на друга.
у всех стандартных функций ввода-вывода в абдурине есть 2 варианта, работающие с ОЗУ и с FLASH, например puts() и puts_P(), sprintf() и sprintf_P() и т.д
Такой метод работы должен здорово тормозить. Поэтому часто используемые константы желательно сходу перемещать в ОЗУ. ПС. Привычка глянуть на результаты КАЖДОГО компилирования доходит до автоматизьма. Но вы, Паровоз, сами утверждаете, что Ардуину не любите. Поэтому вам и непонятно о чем идет речь. Без обид. ))))))
я ничего не перепутал. Микропроцессор и инструкции, и данные берёт исключительно из ОЗУ. По другому он не умеет. Микроконтроллер умеет выполнять инструкции и из флеша/фрам, и константы он умеет адресовать прямо из флеша/фрам. Если не стоит вопрос скорости (а в данном случае он не стоит), то зачем весь этот багаж копировать в ОЗУ???
Мы же обсуждаем ATMEGA? А не МК на FRAM. У ATMEGA флеш тактируется с той же частотой, что и весь кристалл. Про какие тормоза речь, если вся дурина - это один сплошной тормоз?
а адресные пространства пересекаются, и 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.
зачем мне твоя ссылка, если у меня перед глазами даташит на кристалл? Ты мне пытаешься доказать, что АЛУ МК AVR всё, что не является инструкцией, самостоятельно копирует в ОЗУ? Но это же вовсе не так. Нам достаточно взять адрес во флеше и по этому адресу прочитать содержимое. Для чего лишняя операция копирования в ОЗУ (pgm_read_byte() и её аналоги)?
Выше я приплюсовал два скрина к сообщению. Один и тот же код. С использованием (всего в одной строчке) инструкции (F("nnn")) и без. И сообщения компилятора. Че тут спорить-то ???
Ты забываешь, что кроме AVR с его инструкциями есть RTL библиотека gcc, именно она копирует в ОЗУ все инициализированные данные с глобальной областью видимости, в том числе строковые литералы. А еще она вызывает конструкторы глобальных обьектов, строит в ОЗУ VMT виртуальных обьектов, и прочее и прочее... Если пишешь сам на асме, то ничего этого автоматом делать не надо, ты сам решаешь что где храницца и что надо вызывать и что не надо. Но как только написал main() {} в своей программе, изволь играть по правилам С++ с его RTL. Ты дремучий как паравоз, я с тобой спорить не буду, сам читай или спроси у гугола.
ты забыл добавить - . У других МК Atmel и прочих производителей всё совсем не так. это к вашей дурине зачем-то прикрутили С++. У других производителей стеки написаны на Сях.
По всему вы спорите на пустом месте. Надо только представить себя на месте компилятора. По логике, если строковые данные типа "AT+CFUN=1\r\n" явно задекларированы как константы - он всунет их ПЗУ. В нашем же случае они появляются как черт из табакерки - безымянные. Поэтому компилятор сует их в ОЗУ. Он же не уверен что их не будут как-либо изменять. Директива "(F(" - меняет поведение компилятора. Присваивает втихаря данным тип - константа. Чтобы программер не морочился с декларированием. По-моему как-то так.
Ну это-то и ежу понятно. Фишка в том - какие служебные инструкции компилятор приплюсует к нашему коду. Сегмент инициализации - по словам деда Семёна. ПС. В компах IBM процессор после ресета совался сначала в самый конец адресуемого пространства (шага на 2-3 до "обрыва"))))). И исполнял стартовую встроенную инструкцию - считал-выполнил. Это аппаратно задано его конструкцией. А в этих адресах физически стояла микросхема ПЗУ, которая организовывала всю дальнейшую работу. Тоже своего рода сегмент инициализации.
это всё от того, что gcc написан под Неймана, а Atmel AtMega - Гарвард (ну или наоборот - постоянно путаю). Отсюда такие костыли. Кстати, а как там в IAR? Оно и сейчас также. У микропроцессоров всё общение с периферией происходит через ОЗУ - иначе они не умеют. А для того, чтобы среда исполнения (операционка или что там) знала по каким адресам какие устройства расположены, ей и нужна эта ПЗУ. Более привычное название - BIOS.