Этюды для начинающих: Память 1. Что и как не надо делать

Bald
Offline
Зарегистрирован: 17.03.2016

Ну компиляция прошла, но результат не тот. 

   u8g.print(station[i]);

что тогда в этой строке не то? выводятся либо кракозябы либо ничего. Но с i все нормально, потому что при 

const char* station[]={"Радио России","Ю","Радонеж","Business","Сити","Ретро","Юмор","Jazz","Мегаполис","Кекс","Авторадио","Relax","Эхо Москвы","Культура","Москва","Дача","Карнавал","Спорт","Коммерсант","Восток","Весна","RU","Rock","Звезда","Дорожное","Такси","Детское","Комсомольская правда","Вести","Chocolate","Рекорд","Romantica","Орфей","Финам","Серебряный дождь","Best","Classic","DFM","Наше","Monte Carlo","Comedy","Шансон","Маяк","Maximum","Energy","Радио 7","Moscow","Русское радио","Europa Plus","Love","Русская Служба Новостей","Hit FM","Милицейская Волна"};

все нормально, только памяти мало осталось

sirota
Offline
Зарегистрирован: 18.08.2015

Ну из https://www.arduino.cc/en/Reference/PROGMEM 

Объявляем так:м

// Then set up a table to refer to your strings.



const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

 

А обращаемся так:

 

for (int i = 0; i < 6; i++)

  {

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.

    Serial.println(buffer);

    delay( 500 );

  }

 

 

Т.е. не просто string_table[i], а загоняем ее во временную переменную и ее же пользуем в utf8rus

А что за поделка? Где-то ведешь блог?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

А у меня вопрос есть коварный... В х86, на который всю жизнь пишу, память (адресное пространство) общая и непрерывная на всё, нет деления на ФЛЭШ, ОЗУ (RAM) и РЕПЗУ (EEPROM). В меге исполнимый код лежит в ФЛЭШ (энергонезависимая), а инициализированные переменные в ОЗУ (которая теряется при выключении питания). Вопрос: как эти перменные инициализирутся при включении питания вновь, когда программа стартует? Каким способом? Или "они теряются"? Или оно не в ОЗУ лежат? Особенно мне это интересно с точки зрения писания на ассемблере...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Точно так же как на x86 при запуске exe, снова инициализируются все переменные, которые должны инициализироваться при старте. Именно этот случай не имеет значения, на x86 или на МК, здесь работают одинаково. Предлагаю, однако, что твой вопрос скорее всего не про это.

 

sirota
Offline
Зарегистрирован: 18.08.2015

НУ да. Я тоже так думаю, ибо вопрос в таком случае бессмысленен.

Скорее всего надо рассматрвиать так:

Весь код, в том числе скажем uint8_t i = 10;

Лежит изначально во flash. Процессор при начале выполнения программы инициализирует 1 байт в ячейке RAM для этой перемнной и присваивает ей значение 10 (ну в двоичной системе конечно). Ну и т.д. И Изначально получается все лежит во flash. А то что показывает компилятор - это всего лишь процентное заполнение и та же строка uint8_t i = 10; занимает как 1 байт в памяти RAM, там и определенное количество в памяти flash в исходном коде.

Вообще какой-то глупый вопрос...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

faeton пишет:

Вопрос: как эти перменные инициализирутся при включении питания вновь, когда программа стартует? 

Вот здесь немножко про это есть. Тема не прямо об этом, но там достаточно информации, чтобы провести осмысленный поиск по ключевым словам в документации на сайте атмела.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

kisoft пишет:

Точно так же как на x86 при запуске exe, снова инициализируются все переменные, которые должны инициализироваться при старте. Именно этот случай не имеет значения, на x86 или на МК, здесь работают одинаково. Предлагаю, однако, что твой вопрос скорее всего не про это.

 

Выполнимый файл в x86 запускается каждый раз и чтение его приводит к автоматической инициализации переменных (они просто расположены в начале сегмента данных как массив байт и хранятся в теле экзешника). Отключим питание "пропадёт памать", но и выполнимый файл файл вместе с ней из памяти сгинет и его потребуется заново читать. Т.е. образ начальных значений переменных хранится в exe. В АВР ведь не так: образ программы (он скорее com, а не exe) затаился в энергонезависимой памяти. При пропадании питания он не имеет иного экземпляра, как экзешник в х86 и, хотя и запускается программа сачала в АВРке, переменные из ОЗУ улетели, а, если они хранятся в энергонезависимой памяти, не приняли начальных значений, которые нужны при запуске сначала.

Мой вопрос: где, в каком типе памяти, располагаются переменные с начальным значением (int X = 10),  и какой механизм записи в них начальных значений при рестарте процессора по питанию?

Bald
Offline
Зарегистрирован: 17.03.2016

sirota пишет:

 

Т.е. не просто string_table[i], а загоняем ее во временную переменную и ее же пользуем в utf8rus

А что за поделка? Где-то ведешь блог?

Часы с радио и термометрами. Нет блогов, так тихушничаю..

sirota
Offline
Зарегистрирован: 18.08.2015
faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

sirota пишет:

НУ да. Я тоже так думаю, ибо вопрос в таком случае бессмысленен.

Скорее всего надо рассматрвиать так:

Весь код, в том числе скажем uint8_t i = 10;

Лежит изначально во flash. Процессор при начале выполнения программы инициализирует 1 байт в ячейке RAM для этой перемнной и присваивает ей значение 10 (ну в двоичной системе конечно). Ну и т.д. И Изначально получается все лежит во flash. А то что показывает компилятор - это всего лишь процентное заполнение и та же строка uint8_t i = 10; занимает как 1 байт в памяти RAM, там и определенное количество в памяти flash в исходном коде.

Вообще какой-то глупый вопрос...

Вопрос глупый, если писать скетчи для дуни. :) Механизм копирования образа инициализированных переменных из флэшки в рам правдоподобный, но кто его делает? Для скетча это есть кому сделать, а для кода:

asm
   X1   db 0
   X2   dw 45
   Y    dw ?
end;

Кто будет X1 и X2 переписывать из флэш в рам на голом кристалле без загрузчика только с программой. Или в меге нет предустановленных переменных в ассемблере? Для меня очень актуальный вопрос, ибо взялся за мегу несколько дней назад, а писать придётся на асме под голый кристалл.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

ЕвгенийП пишет:

faeton пишет:

Вопрос: как эти перменные инициализирутся при включении питания вновь, когда программа стартует? 

Вот здесь немножко про это есть. Тема не прямо об этом, но там достаточно информации, чтобы провести осмысленный поиск по ключевым словам в документации на сайте атмела.

Мельком пробежался... Глупости там есть. :) Чтобы получить управление сразу после Reset, достаточно в таблицу прерываний, которая в самом начале флэш находится, в самую первую ячейку и таблицы, и вообще флэш написать переход на свой адрес. Проц начинает выполнение при старте с адреса НОЛЬ, а там как раз по этому адресу переход на загрузчик вколочен обычно по умолчанию. :)

Но, ребяты, моргать светодиодами, на экранчики писать и ещё чего-то там можно доверяя загрузчику, и даже библиотекам корявейшим дуни. Мне предстоит реалтам весьма наруженный делать для голого кристала.

sirota
Offline
Зарегистрирован: 18.08.2015

faeton пишет:

Вопрос глупый, если писать скетчи для дуни. :) Механизм копирования образа инициализированных переменных из флэшки в рам правдоподобный, но кто его делает? Для скетча это есть кому сделать, а для кода:

asm
   X1   db 0
   X2   dw 45
   Y    dw ?
end;

Кто будет X1 и X2 переписывать из флэш в рам на голом кристалле без загрузчика только с программой. Или в меге нет предустановленных переменных в ассемблере? Для меня очень актуальный вопрос, ибо взялся за мегу несколько дней назад, а писать придётся на асме под голый кристалл.

Тогда Вам не сюда. И Вам точно тогда не стоит смотреть в сторону Arduino IDE. Это Вам надо на сайты где люди работают с голыми AVR. А по факту какая разница  какой язык? КОмпилятор сам все расставит по полочкам, что надо вызовет, что не надо не вызовет (я про оптимизацию). Если Вы хотите делать просто вставки. Ну тут я хз. А зачем такие трудности? Зачем в век высоких технологий так опускаться? Если Вас не устраивают ардуиновские библиотеки, пишите на голом C. Ни кто не запрещает, описывайте все сами. В чем проблема?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Там нет ответа на мой вопрос.

Кстати, люди, даташит на мегу по ассеблеру никак не могу найти на сайте Атмела (корявенький сайт вообще). На кристалл 660 страничный даташит нарыл, но там набор команд не описан. Может быть, у кого есть?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

sirota пишет:

faeton пишет:

Вопрос глупый, если писать скетчи для дуни. :) Механизм копирования образа инициализированных переменных из флэшки в рам правдоподобный, но кто его делает? Для скетча это есть кому сделать, а для кода:

asm
   X1   db 0
   X2   dw 45
   Y    dw ?
end;

Кто будет X1 и X2 переписывать из флэш в рам на голом кристалле без загрузчика только с программой. Или в меге нет предустановленных переменных в ассемблере? Для меня очень актуальный вопрос, ибо взялся за мегу несколько дней назад, а писать придётся на асме под голый кристалл.

Тогда Вам не сюда. И Вам точно тогда не стоит смотреть в сторону Arduino IDE. Это Вам надо на сайты где люди работают с голыми AVR. А по факту какая разница  какой язык? КОмпилятор сам все расставит по полочкам, что надо вызовет, что не надо не вызовет (я про оптимизацию). Если Вы хотите делать просто вставки. Ну тут я хз. А зачем такие трудности? Зачем в век высоких технологий так опускаться? Если Вас не устраивают ардуиновские библиотеки, пишите на голом C. Ни кто не запрещает, описывайте все сами. В чем проблема?

Я несколько дней лишь занимаюсь мегой. Пока только сюда прибился. Думаю, тут найдутся не только скетчеписатели, но и знающие мат. часть. :)

Разница в языке существенная как по скорости, так и качеству, и по объему кода. Если бы мне нужны были высокие технологии для написания двумя кликами мышки, а не суровый реалтам, я бы в винде писал. :))) Проблема в том, что я не нашёл пока описания ассемблера меги. :) Подозреваю, в нём нет предустановленных переменных, их создают компиляторы, как и ещё много чего вляпывают не по делу. :)

sirota
Offline
Зарегистрирован: 18.08.2015

faeton пишет:

Там нет ответа на мой вопрос.

Кстати, люди, даташит на мегу по ассеблеру никак не могу найти на сайте Атмела (корявенький сайт вообще). На кристалл 660 страничный даташит нарыл, но там набор команд не описан. Может быть, у кого есть?

Давайте договоримся так. Мы тут ламеры, ассемблер не упал, голый МК так же. Если Вас интересуют подобные вопросы, то Вам как минимум на форум где люди работают с голыми МК. Вот как пример: http://avr.ru/

Там Вы можете задать вопрос и там скорее всего Вам на него ответят.Даже если вы за основу бедерете ардуинку (собранное устройство и шьете туда голый код без использования ардуиновского загрузчика), то все равно Вам туда. Тут только blink, если в общих чертах...

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

sirota пишет:

Давайте договоримся так. Мы тут ламеры, ассемблер не упал, голый МК так же. Если Вас интересуют подобные вопросы, то Вам как минимум на форум где люди работают с голыми МК. Вот как пример: http://avr.ru/

Там Вы можете задать вопрос и там скорее всего Вам на него ответят.Даже если вы за основу бедерете ардуинку (собранное устройство и шьете туда голый код без использования ардуиновского загрузчика), то все равно Вам туда. Тут только blink, если в общих чертах...

Чего это Вы за всех так отвечаете? В любом случае, тут уже есть один чел, который грызём мегу асмом и через несколько дней на подобные вопросы запросто сможет ответить. :) К тому же, лю,ой друинщик рано или поздно поймёт, что из кубиков с картинками дом строят только по игрушечному. А понимание работы проца, коль уж он в реках, весьма полезно. :)

sirota
Offline
Зарегистрирован: 18.08.2015

faeton пишет:

Чего это Вы за всех так отвечаете? В любом случае, тут уже есть один чел, который грызём мегу асмом и через несколько дней на подобные вопросы запросто сможет ответить. :) К тому же, лю,ой друинщик рано или поздно поймёт, что из кубиков с картинками дом строят только по игрушечному. А понимание работы проца, коль уж он в реках, весьма полезно. :)

Я по специальность системный программист. В свое время в институте мы изучали ASM. И вот как-то закусили мы с преподователем на тему производительности и вообще необходимости изучения так досконально этого asm. В общем поставили задачу - расчет интеграла. ПРи чем функция вводится с клавиатуры, т.е. заранее не известна. В общем через 3 часа я предоставил готовую работу. Написана была на Borland Delphi 7. Использовано по факту - форма, 4 поля для ввода строковых значений (пределы, функция и результат) и 1 кнопка. Приложение весило где-то под 1 метр на дисковом пространстве. Какая-то выбранная из учебника по матанализу задача решалась на 800МГц процессоре кажется 0,5 секунд (надо было внедрить алгоритм подсчета). Т.е. с момента нажатия кнопки расчитать до отображения результата уходило 0,5 секунды.

Через 4 дня у меня стояла 5-ка на следующих семетр и зачет на этот по ASM, по путно 5-ка по какому-то прикладному программированию чего-то к чему-то и что-то там прикладывалось к физическим процессам была договоренность что уже у меня автомат 3-ка за такую чудную программу даже если я не хожу больше на этот предмет.

Так что у всего есть цена. Я за оптимизацию, но есть предел. Ведь опять же строительство дома... Вы же не будете сами идти добывать цемент? Вы купите его в мешке? А то и вовсем готовый раствор. Так и тут. Цемент - машинный код, раствор - асм, готовая плита или кирпичик - С, ну а ардуинка - это когда в плитах заранее подготовлены отверстия под скажем двери и окна, а ты просто собираешь.

bwn
Offline
Зарегистрирован: 25.08.2014

Здесь действительно в основе своей любители, с проектами для домоподелок, а в них ассемблер не очень востребован. Возможно кто то из профи и сможет помочь.
Стартовый адрес определяется предустановленными фузами.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

sirota пишет:

faeton пишет:

Чего это Вы за всех так отвечаете? В любом случае, тут уже есть один чел, который грызём мегу асмом и через несколько дней на подобные вопросы запросто сможет ответить. :) К тому же, лю,ой друинщик рано или поздно поймёт, что из кубиков с картинками дом строят только по игрушечному. А понимание работы проца, коль уж он в реках, весьма полезно. :)

Я по специальность системный программист. В свое время в институте мы изучали ASM. И вот как-то закусили мы с преподователем на тему производительности и вообще необходимости изучения так досконально этого asm. В общем поставили задачу - расчет интеграла. ПРи чем функция вводится с клавиатуры, т.е. заранее не известна. В общем через 3 часа я предоставил готовую работу. Написана была на Borland Delphi 7. Использовано по факту - форма, 4 поля для ввода строковых значений (пределы, функция и результат) и 1 кнопка. Приложение весило где-то под 1 метр на дисковом пространстве. Какая-то выбранная из учебника по матанализу задача решалась на 800МГц процессоре кажется 0,5 секунд (надо было внедрить алгоритм подсчета). Т.е. с момента нажатия кнопки расчитать до отображения результата уходило 0,5 секунды.

Через 4 дня у меня стояла 5-ка на следующих семетр и зачет на этот по ASM, по путно 5-ка по какому-то прикладному программированию чего-то к чему-то и что-то там прикладывалось к физическим процессам была договоренность что уже у меня автомат 3-ка за такую чудную программу даже если я не хожу больше на этот предмет.

Так что у всего есть цена. Я за оптимизацию, но есть предел. Ведь опять же строительство дома... Вы же не будете сами идти добывать цемент? Вы купите его в мешке? А то и вовсем готовый раствор. Так и тут. Цемент - машинный код, раствор - асм, готовая плита или кирпичик - С, ну а ардуинка - это когда в плитах заранее подготовлены отверстия под скажем двери и окна, а ты просто собираешь.

Споры о выборе языка, а ещё C vs Pascal совершенно бесполезны и лишь отвлекают от темы. Когда Вы сдавали задачи преподвателю на Delphi 7,  у меня уже был опыт программирования на низком уровне лет 30, наверное. У меня действительно задача чистешего и надёжнейшего реалтайма, мне нужен весь процессор. Компиляторы для AVR - нормальные, смотрел дизассемблер микроПаскаль и АВРСтудио неплохо, но лерят лишнее и в плане оптимизации, качества кода почему-то очень далеки как раз ТурбоПаскаля-Дельфи. В предложенных терминах, дунька - это такая шанхайская деревня, кривая, косая, еорявая, но жить можно и всё есть. :)))

Давайте не отвлекаться от вопроса по теме топика: где лежит браз первоначальных значений инициализированных переменных. Возможно, тут есть люди это знающие.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

bwn пишет:

Здесь действительно в основе своей любители, с проектами для домоподелок, а в них ассемблер не очень востребован. Возможно кто то из профи и сможет помочь.
Стартовый адрес определяется предустановленными фузами.

Каким? Я пока запомнил только фуз установки размера памяти для загрузчика. Таблица векторов прерываний лежит по фиксированному адресу, прерывание 0 от по резет = при старте вызывается переход на адрес 0. Или я не прав?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

faeton, у меня есть какой-то даташит на инструкции ассемблера, и наверное кое-что могу подсказать по вашим вопросам, но это сильно оффтоп. Найдите мое публичное мыло по основной части ника в сети и черканите куда выслать pdf-ку. Тут нет лички, от слова "вовсе".

Тут вам верно замечают, что это форум несколько иного уровня. Ну и конечно очень любопытно, что хотите сваять на голом МК .. хотя бы в "общих чертах" :)

По вашему вопросу "где лежит" .. в программе, то бишь во флеш конечно. Сборки и линковка программы происходит точно также как и на ваш любимый (и так нелюбимый мною) ix86. Разница в том, что по старту производится оптовая заливка (movs кажется у вашего 86-го) кучки байтиков из флеш в ОЗУ "куда требуется". Оптом, сразу все данные. Секция bss кажется.

Таблица векторов по 0 адресу .. лежит-то она, лежит .. только вот сам нулевой адрес МОЖЕТ быть разным: реальный 0 - старт программы и 0-й адрес в секции загрузчика. Какой из них пользуется - зависит от установки битов фуза или каких-то ишо .. точно не помню, надо смотреть даташит.

И более того! Куда отправляет адрес прерывания - тоже может отсчитываться от РАЗНОГО нуля: возможна ситуевина когда вектора в нижней части, но отправляют .. в загрузчик и наоборот. :) По крайней мере я так понял даташит, когда вникал в систему обработки прерываний.

И ещё: на удивление, но компилятор практически ничего не по делу - не вляпывает. У него есть свои заморочки, но вполне терпимые. В частности он не умеет верно считать длинноцелую арифметику. Можно экономнее и шустре в ряде случаев, он не понимает раскладку union и struct на регстры процессора, у него своеобразная раскладка регистров на переменные, не самая экономная, но терпимая ..

Есть только одна "проблема" - таблица векторов прерываний. Она прошита, где-то в сценарии линковщика и выковырять её оттудова - проблематично.

bwn
Offline
Зарегистрирован: 25.08.2014

faeton пишет:

bwn пишет:

Здесь действительно в основе своей любители, с проектами для домоподелок, а в них ассемблер не очень востребован. Возможно кто то из профи и сможет помочь.
Стартовый адрес определяется предустановленными фузами.

Каким? Я пока запомнил только фуз установки размера памяти для загрузчика. Таблица векторов прерываний лежит по фиксированному адресу, прерывание 0 от по резет = при старте вызывается переход на адрес 0. Или я не прав?

Ни в коей мере не программист, могу ошибаться. Калькулятор. Секция "Переход к загрузчику после сброса ; [BOOTRST=0]". Предполагаю, что его неустановка отправит на 0 адрес, иначе на на начало загрузчика. Чистое ИМХО.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Arhat109-2 пишет:

faeton, у меня есть какой-то даташит на инструкции ассемблера, и наверное кое-что могу подсказать по вашим вопросам, но это сильно оффтоп. Найдите мое публичное мыло по основной части ника в сети и черканите куда выслать pdf-ку. Тут нет лички, от слова "вовсе".

Тут вам верно замечают, что это форум несколько иного уровня. Ну и конечно очень любопытно, что хотите сваять на голом МК .. хотя бы в "общих чертах" :)

По вашему вопросу "где лежит" .. в программе, то бишь во флеш конечно. Сборки и линковка программы происходит точно также как и на ваш любимый (и так нелюбимый мною) ix86. Разница в том, что по старту производится оптовая заливка (movs кажется у вашего 86-го) кучки байтиков из флеш в ОЗУ "куда требуется". Оптом, сразу все данные. Секция bss кажется.

 

Возможно и оффтоп..., хотя, памяти касается напрямую. Так вот кто на голом кристале делает movs из флэшки в ОЗУ начальных значений при старте проги, написанной на асм?

Делаю не особо интересный широкому кругу прибор, с большим количеством достаточно сложных вычислений налету при высокой скорости и без риска от кого-то получить неожиданность. На двух процессорах - второй для помощи первому в некоторых вопросах и вэб-интерфейса. Потому дуню и взял - пощупать TCP стек... Был бы не критичен реалтайм, я бы уже давно плату входов-выходов к USB прикрутил и рулил из проги, написанной на Дельфи. :) Но чем Вам х86 не понравился? Сегментные регистры мучили? Оставь ему 64кБ памяти и тот же AVR с точки зрения программирования на асм. :) Не был бы дико дорогим этот, как его - Галилео, я бы про АВР и вспомнил никогда. Да и Curit, если не ошибаюсь, дороговат. :)))

Мой емыл: faeton@ekursk.ru - пришлите, пожалуйста по асму файлик.

vk007
Offline
Зарегистрирован: 16.06.2015

faeton, вот тут человек постарался и собрал подборку литературы по AVR на великом и могучем. Посмотрите, наверняка найдете много полезного.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

попозже сегодня вышлю. Я сейчас далековастенько от него ..

на голом асме конечно будете делать самостоятельно. На С - делает секция init .. какая-то из них. :)

Для сложных вычислений Мега - неудачное решение, тем более "на лету". Посмотрите в сторону STM или сигнальных процов. Ниша Меги (и тут ей практически нет равных) - это управление периферией. Аппаратное. Быстро и просто, как "2 пальца об асфальт".

То что многие вместо того чтобы юзать верный кристалл Меги, гоняют урезанные дешевки - это от непонимания, что мега ориентирована на исключительно аппаратное управление периферией. Вот и пыжаться программно эмулировать то, что аппаратно делается одной командой. От бедности это всё, ИМХО. :)

P.S.

совсем офттоп. x86 не нравился с самого началу, из-за того, что это был по сути "2 шага назад". И он по большей части, похоронил кучу хороших и прогрессивных решений в области МК и ЦПУ заодно. Как сказал мой коллега: "дерьмо побеждает разум". :(

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Я почитал про компилаторы микроПаскаль и АВРСтудио обсуждения, где люди приводили куски дизассемблера... Вляпывает терпимо, согласен, но оптимизация не очень, ни по использованию регистров, коих море, ни по арифметике.  Когда изучу асм, смогу более определённо написать. Пока я даже не знаю бсуждаемого здесь решения по переменным, не знаю есть ли а мега команды деления и умножения целочисленные и т.п. Только вникаю...

А с прерываниям... Всё же очень просто, если мне никто не изменяет! Старт процессора начинается с 0 флэшки, туда же его толькает прерывание 0 от Reset, там уже лежит команда перехода куда надо, чаще всего на начало загрузчика, который, в свою очередь, на указанном a фузах расстоянии от конца флэшки начинается. Ак чему мы про прерывание то тут? Я же об этом в другой теме писол, вроде...

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Arhat109-2 пишет:

попозже сегодня вышлю. Я сейчас далековастенько от него ..

на голом асме конечно будете делать самостоятельно. На С - делает секция init .. какая-то из них. :)

Для сложных вычислений Мега - неудачное решение, тем более "на лету". Посмотрите в сторону STM или сигнальных процов. Ниша Меги (и тут ей практически нет равных) - это управление периферией. Аппаратное. Быстро и просто, как "2 пальца об асфальт".

То что многие вместо того чтобы юзать верный кристалл Меги, гоняют урезанные дешевки - это от непонимания, что мега ориентирована на исключительно аппаратное управление периферией. Вот и пыжаться программно эмулировать то, что аппаратно делается одной командой. От бедности это всё, ИМХО. :)

Так мне же не с клавы брать данные для считать, а как раз с переферии, с датчиков. СТМ как-то не прижился ко мне историчеки, как и интеловская однокристалка. Я несколько лет назад делал на ATMega90U (кажется так называлась, с ножками - капельками) устройство и тогда мне мега понравилась. Могу прислать на то устройство описание.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

vk007 пишет:

faeton, вот тут человек постарался и собрал подборку литературы по AVR на великом и могучем. Посмотрите, наверняка найдете много полезного.

Большое спасибо! Бум курить мануалы! А тож в инете "единого слова ради мегабайты ерунды"... :)))

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Есть только целочисленное умножение. Деления нет, плавающей точки нет в помине. Регистров вовсе не "море" (more - следующий экран :) ) .. значительная их часть имеет конкретное назначение и всякие хитроумные способы адресации работают только с ними .. система команд в целом - крайне кривая (у STM ещё кривей, но тут не о нем). Если следовать букве, то никакого RISC тут нет и в помине, это вам не PDP-11. :)

Тем не менее, вполне можно писать на чистом С, практически как на АСМ.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

faeton, "Так мне же не с клавы брать данные для считать"

Гы. Я имел ввиду то, что если вам надо эти данные хорошо обрабатывать на лету, к примеру БПФ делать или как у головки самонаведения "гиперболические котангенсы" считать на сверхзвуковых скоростях сближения .. то это "не та машинка".. :)

Ну вот смотрите. Самокатная тележка по лабиринту. Вертим башкой с узв. датчиком и снимаем показания в углах +-45грд. на 30 отстетах. Серва SG90 вертит датчик за 8мсек на шаг, датчик снимает показания за 1-2мсек к примеру, для достоверности надо снять от 3-х показаний .. итого имеем на 1 отсчет около 20мсек. Казалось бы многа. Тележка едет со скоростью 30см/сек или 0,3мм/мсек. Надо иметь точность данных о стенах лабиринта в 3-5мм. То есть "прокрутить датчик" на ходу - нереально, а стало быть надо пересчитывать те значения, что известны "с последнего замеру" .. во float не успеете однозначно. :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Arhat109-2 пишет:

Есть только целочисленное умножение. Деления нет, плавающей точки нет в помине. Регистров вовсе не "море" (more - следующий экран :) ) .. значительная их часть имеет конкретное назначение и всякие хитроумные способы адресации работают только с ними .. система команд в целом - крайне кривая (у STM ещё кривей, но тут не о нем). Если следовать букве, то никакого RISC тут нет и в помине, это вам не PDP-11. :)

Тем не менее, вполне можно писать на чистом С, практически как на АСМ.

32 РОН по сравнению с 4-мя в x86 - это море, поверьте! :) Про деления я подозревал, потому уже думаю над оптимизацией этого безобразия на сдвигах... :) А RISK оно или нет... Да я уже не помню что такое RISK, кроме кучи РОН и одно-двухтакного исполнения команд. Це для меня не родной язык, я к микроПаскалю подкатываюсь плавно, но делиь буду сам!. Система команд по увиденным примерам на асме в даташите на мегу вполне нормальная, от других процессоров отличается, разве что, иными немного именами. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

faeton пишет:

Чтобы получить управление сразу после Reset, достаточно в таблицу прерываний, которая в самом начале флэш находится, в самую первую ячейку и таблицы, и вообще флэш написать переход на свой адрес. Проц начинает выполнение при старте с адреса НОЛЬ, а там как раз по этому адресу переход на загрузчик вколочен обычно по умолчанию. :)

Вообще-то это форум об ардуино, а то что Вы пишете. это несколько про другое.

faeton пишет:

Но, ребяты, моргать светодиодами, на экранчики писать и ещё чего-то там можно доверяя загрузчику, и даже библиотекам корявейшим дуни. Мне предстоит реалтам весьма наруженный делать для голого кристала.

Если Вы профи, то почему задаёте дилетантские вопросы? Если дилетант, то ... успехов!

faeton пишет:

Я несколько дней лишь занимаюсь мегой. 

Это заметно.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Arhat109-2 пишет:

faeton, "Так мне же не с клавы брать данные для считать"

Гы. Я имел ввиду то, что если вам надо эти данные хорошо обрабатывать на лету, к примеру БПФ делать или как у головки самонаведения "гиперболические котангенсы" считать на сверхзвуковых скоростях сближения .. то это "не та машинка".. :)

Ну вот смотрите. Самокатная тележка по лабиринту. Вертим башкой с узв. датчиком и снимаем показания в углах +-45грд. на 30 отстетах. Серва SG90 вертит датчик за 8мсек на шаг, датчик снимает показания за 1-2мсек к примеру, для достоверности надо снять от 3-х показаний .. итого имеем на 1 отсчет около 20мсек. Казалось бы многа. Тележка едет со скоростью 30см/сек или 0,3мм/мсек. Надо иметь точность данных о стенах лабиринта в 3-5мм. То есть "прокрутить датчик" на ходу - нереально, а стало быть надо пересчитывать те значения, что известны "с последнего замеру" .. во float не успеете однозначно. :)

Я уже потестировал на дуне... Успеем, если хоррошо написать. Не боеголовка - там бы кристальчик взял сильнее и дороже (наша оборонка из целого куска золота что угодно выпилить может). Вопрос цены устройства критичен. Я из древних программистов, которые не имели роскоши заюзать Аякс, чтобы на экран эксплорера написать "Hello, world!" и не парится, что для этого сто тонный самосвал заказать надо. По поводу вещественных чисел, я уже не говорю о комплексных - так летали же в космос с компами\автоматами без них раньше, и барбариан работал на 64кБ памяти, и зряплата завода считалась на ЕС-1022 с 128кБ памяти, и курсовую по астрофизике на БСМ-6 считали... :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

ЕвгенийП пишет:

faeton пишет:

Чтобы получить управление сразу после Reset, достаточно в таблицу прерываний, которая в самом начале флэш находится, в самую первую ячейку и таблицы, и вообще флэш написать переход на свой адрес. Проц начинает выполнение при старте с адреса НОЛЬ, а там как раз по этому адресу переход на загрузчик вколочен обычно по умолчанию. :)

Вообще-то это форум об ардуино, а то что Вы пишете. это несколько про другое.

faeton пишет:

Но, ребяты, моргать светодиодами, на экранчики писать и ещё чего-то там можно доверяя загрузчику, и даже библиотекам корявейшим дуни. Мне предстоит реалтам весьма наруженный делать для голого кристала.

Если Вы профи, то почему задаёте дилетантские вопросы? Если дилетант, то ... успехов!

faeton пишет:

Я несколько дней лишь занимаюсь мегой. 

Это заметно.

Ну, дунька - это не только корявое IDE на яве с корявой библиотекой. Прежде всего, это неплохая аппаратная платформа для которой писать на асме и знать всю аппаратную часть даже с точки зрения развития полезно в т.ч. и начинающим. Откуда беруться переменные можно не понимать на той самой яве и "программировать" мышкой... Дуня, по моему мнению, как раз сближает с железом, толкает в сторону низкоуровневого программирования ручками.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

faeton, "Дуня, по моему мнению, как раз сближает с железом, толкает в сторону низкоуровневого программирования ручками."

Вах, замечательные слова. Именно поэтому своему, почти 10-и летнему отпрыску и купил дуньку, а не Лего майндшторм .. из сегодняшнего утреннего занятия по языку (учим стандарт С):

Я: -"массив это такая вот фигня из кучки переменных .."

Он: - "а, ну так это просто. имя массива - это базовый адрес, а номер элемента это сколько к нему прибавить надо".

Мелочь, а приятно. :)

sirota
Offline
Зарегистрирован: 18.08.2015

Arhat109-2 пишет:

 

Он: - "а, ну так это просто. имя массива - это базовый адрес, а номер элемента это сколько к нему прибавить надо".

Мелочь, а приятно. :)

 

А как же динамические массивы? А как же массив массивов в динамике? Да по определению " тип или структура данных в виде набора компонентов (элементов массива), расположенных в памяти непосредственно друг за другом", но это только для массивов с фиксированной размерностью.

P.S. А сколько ребенку?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Скоро будет 10. Не всё сразу .. постепенно, по-немногу, от "вот тут можешь поправить вот это - получится так". Через "этот кирпичик зовется функцией(процедурой, методом), он делает это .. а можно вот так, то это". И далее, к "это - конечный автомат. У него есть состояния .. прописыфваются вот так и вот тут.. можешь поправить уже и сам" ..

и вот после того как ребенок заметил, что правя ему кусок мозгов робота - наш главный КА doBrain() всех скетчей, я поправил ему одну ветку и забыл поправить другую .. и было решено учить стандарту, начиная с синт. диаграмм языка. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sirota пишет:

А как же динамические массивы? А как же массив массивов в динамике? 

"Неприличными словами не выражацца!!!"

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да ну их нафиг эти динамические массивы

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Arhat109-2 пишет:

faeton, "Дуня, по моему мнению, как раз сближает с железом, толкает в сторону низкоуровневого программирования ручками."

Вах, замечательные слова. Именно поэтому своему, почти 10-и летнему отпрыску и купил дуньку, а не Лего майндшторм .. из сегодняшнего утреннего занятия по языку (учим стандарт С):

Я: -"массив это такая вот фигня из кучки переменных .."

Он: - "а, ну так это просто. имя массива - это базовый адрес, а номер элемента это сколько к нему прибавить надо".

Мелочь, а приятно. :)

Я бы рекомендовал не идти американским эмпирическим путём, показывая на яблоке пример строения земли, а приучать ребёнка сразу к научному пониманию с соотвествующими грамотными определениями, ибо упрощение до образца приучает к пониманию с помощью визуального образа, ассоциации. И такое понимание ограничивает человека до простых вещей, атомарных ситуаций. В дальнейшем, не найдя тела предмета, на котором можно понять-пощупать, человек и не понимает многие вещи. А в жизни, существующей далее офисного клерка купи-продай-нае*%$#, очень много умозрительных, весьма сложных вещей, с которыми придётся столкнуться. Яркий пример тому математика. Давным давно, учась в институте, не долюбливал вышку, игра символики - думал. А оно оказвается ого-го как прикладное всё: интегральные исчисления, ряды (Фурье тут все знают), матрицы и определители... Вот привыкнет ребёнок к упрощённо-образному понимаю, и как он потом сообразит как написать распознование лиц или, хотя бы, речи? А зная матрицы и определители, которые никак на палочках не объяснить, задача окажется весьма простой. :)

Тем не менее, в 10 лет говорить о массивах - это уже хорошо! Только без фанатизма, чтобы о девочках не забывал тоже... :)))

sirota
Offline
Зарегистрирован: 18.08.2015

Ну не стоитл лезть в дебри. Мои учебником по программированию первым была инструкцию к "СЮБОР". От туда я понял что такое блок схемы - это как бы основа и от туда начал изучать basic. Да он тупой, да он простой и т.д., но основы. Вот и тут ребенку в таком возрасте главное что привить? ЛОГИКУ! А остальное... когда научишься логически мыслить, расставлять решение задачи на полочки, там уже язык программирования считай и не важен. Тут уже будет либо свои желания, либо требования заказчика и/или ситуации. А вообще как по мне С, трудноват как первый язык.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

sirota пишет:

Ну не стоитл лезть в дебри. Мои учебником по программированию первым была инструкцию к "СЮБОР". От туда я понял что такое блок схемы - это как бы основа и от туда начал изучать basic. Да он тупой, да он простой и т.д., но основы. Вот и тут ребенку в таком возрасте главное что привить? ЛОГИКУ! А остальное... когда научишься логически мыслить, расставлять решение задачи на полочки, там уже язык программирования считай и не важен. Тут уже будет либо свои желания, либо требования заказчика и/или ситуации. А вообще как по мне С, трудноват как первый язык.

C, Basic, Pascal, как и любые классические языки программирования, совершенно идентичны. Разница лишь в произношении. А вот сколько к этому языку прикручено и как выглядит - уже да. Наиболее человечный и близкий к логике мышления, на мой взгляд, Pascal. Но жизнь загонит в С по любому. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

faeton пишет:

C, Basic, Pascal, как и любые классические языки программирования, совершенно идентичны. 

Слово "классические" я выбрасываю, в силу отсутствия определения "классическости" (я бы например, не назвал классическим ни один из этих языков), а насчёт их совершенной идентичности - весьма смелое заявление.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

ЕвгенийП пишет:

faeton пишет:

C, Basic, Pascal, как и любые классические языки программирования, совершенно идентичны. 

Слово "классические" я выбрасываю, в силу отсутствия определения "классическости" (я бы например, не назвал классическим ни один из этих языков), а насчёт их совершенной идентичности - весьма смелое заявление.

Классический - разработанный научным сообществом (умными людьми с хорошим образованием) и проверенный годами. :) А не какой-нибудь Perl, PHP, Java сделанный на коленках чудиками, вроде бы, из нормально С, но испахабивших всю стройность и строгость языка в угоду современной теории "налепить и продать", когда качество ничего не стоит. :) Впрочем, опять флуд не в тему...

Viktor1802
Offline
Зарегистрирован: 18.01.2018

Всем всего доброго!

Извинете, но мучает один вопрос, на который не нашел ответ. В описании тригера есть слова (на время выполнения одного цикла программы) и я не могу понять о каком цикле идет речь - о главном цикле, в котором работает Ардуино? Т.Е. если код программы закончился и Ардуино начинает выполнять код с первой строки? И когда выполнение программы снова дойдет до этого триггера - то его состояний сбросится в начальное?

Спасибо за ответы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

"выполнения одного цикла программы" == "выполнение функции loop и того, что делает среда между вызовами loop"

Viktor1802
Offline
Зарегистрирован: 18.01.2018

OK Спасибо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если в loop() ничо не вставлять, вызывается он примерно 50 тысяч раз в секунду. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Arhat109-2 пишет:

Для программирующих с использованием Wiring - регистров, как таковых нет

А вы сами сравните откомпилированый код в котором в одном случае определите переменную как :

byte i=0;

А во втором как:

register byte i=0;

Может передумаете :)

Работает только с локальными переменными.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Кстати, я почему то не нашел объяснения для чего нужны константы. Коллизия, объявлена как константа а храниться в ОЗУ. Хотя можем принудительно пихнуть ее во флешь, но тогда работать с ней придется с подвывертом (понимая, что это и почему). 

Лично я подозреваю, что константы находятся в озу для того, что бы с ними можно было работать быстро и использовать из нескольких мест программы. Однако, для себя при работе с константами небольших форматов (byte, word, dword), в приложении к ардуино, предпочитаю не объявлять константы, а заменять их дефайнами. Это, в большинстве своем экономит память и как бы... гигиеничнее :)

Можно так:

const byte pin=10;
digitalRead(pin);

Но я предпочитаю так :

#define PIN 10
digitalRead(PIN);