Этюды для начинающих: Память 2. Статические переменные.

Datak
Offline
Зарегистрирован: 09.10.2014

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

Пример:



int counter = 0;

void Foo(void) {
    int current = 321;
    static int voltage = 0;
    //...
}

..... Переменная же voltage – статическая. Она получит значение 0 один раз перед началом исполнения программы. .....

ЕвгенийП, весь холивар ниасилил, сдулся где-то на половине.

Поэтому извините, если повторюсь или выдам что-то не в тему.

У меня небольшая поправка. Насколько я знаю, строго говоря, статическая переменная инициализируется не перед началом исполнения программы, а при первом входе в блок/функцию, где эта переменная объявлена. Т.е., непосредственно перед первым использованием этой переменной.

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

один набор иерархии Serial чего стоит

Почему же Вы за год на форуме до сих не переписали его в оптимальном виде и выложили на GitHub?

 

ptr
Offline
Зарегистрирован: 28.05.2016

Datak пишет:

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

..... Переменная же voltage – статическая. Она получит значение 0 один раз перед началом исполнения программы. .....

статическая переменная инициализируется не перед началом исполнения программы, а при первом входе в блок/функцию, где эта переменная объявлена

Нет. На то она и статическая, что инициализирована еще в объектном файле до загрузки в МК

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

Я уже ничего на гитхаб не выкладываю. Незачем. у меня - всё работает как надо .. и свой wiring и RTOS и ИС "ДРАКОН" генерит Ардуино-код вполне сопоставимый с результатом Атмел-студии и Ардублок скоро будет иметь ту же самую возможность использования моих библиотек, а не от новичков сферического программирования. Думаю, к весне можно будет пересадить ребенка на свой "Ардублок" на базе ДРАКОН..

да, кстати .. надо будет выложить фото нашей Меги2560 со всеми 86-ю рабочими контактами .. помнится Пухлявый очень хотел посмотреть .. :)

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

Я уже ничего на гитхаб не выкладываю. Незачем. у меня - всё работает как надо

А вот эта фраза говорит совсем не в Вашу пользу и, лично у меня, вызывает отрицательные эмоции по отношению к Вам. Потому что на GitHub выкладывают именно то, что работает как надо. Непонятно, что проприетарщик вообще делает на этом форуме.

 

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

1. "не хватит стека". Аргументы простые: вызов функции с параметром, это а) подготовка параметра для укладки на стек - 1 команда с ПРЯМОЙ адресацией для загрузки регистра для байта, 2 команды для int и 4(ЧЕТЫРЕ) команды для long. Далее, имеем ЕЩЁ 1 команду для каждого байта для укладки параметра на стек. Итого для long имеем 8(восемь!) дополнительных команд.

Для, тех, кто хочет понять, в чем автор цитируемого текста совершенно не прав: http://www.atmel.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_reg_usage.html

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

И в чем конкретно я был "не прав" согласно цитированному тексту?

Там вполне четко указано что из 32 имеющихся байтовых регистров (16 слов или 8 дв. слов), пара регистров 0,1 - отдана под "текущие операции компилятора", регистры 18-31 отданы под оформление вызовов и передачи параметров .. из них исключаем (чего там не прописано) пары X(26,27),Y(28,29),Z(30,31) как указатели и особливо пару 30,31 как хранящую указатель this и он такой .. упс один на все "объекты" .. (вопрос его сохраннности промеж вызовов) .. да, ещё пара 24,25 и возможно 22,23 используется для возврата значения .. то бишь из этого набора реально для передачи параметров остается 18,19,20 и 21 .. 4 байта.

А пары 2..17,28,29 могут размещать локалы, но .. они обязательно требуют дополнительного кода сохранения/восстановления стека. И? что там остается для "локалов" функциональных апологетов? Да, ещё неплохо учесть наличие "внутренних локалов" для операций умножения даже целых чисел и прочих мест, где компилятор их создает помимо воли автора кода. :)

Да и ещё .. не знаю как последние версии gcc (вроде авторы обещались исправиться) но локальные структуры .. шли сразу в память, чего было не очень удобно.

Прежде чем писать что "кто-то неправ" сильно советую посмотреть на результаты компиляций в ассемблер .. хотя бы того же delay() .. вроде "проще некуда". :)

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

Arhat109-2 пишет:

Я уже ничего на гитхаб не выкладываю. Незачем. у меня - всё работает как надо

А вот эта фраза говорит совсем не в Вашу пользу и, лично у меня, вызывает отрицательные эмоции по отношению к Вам. Потому что на GitHub выкладывают именно то, что работает как надо. Непонятно, что проприетарщик вообще делает на этом форуме.

Вам нравится какашки под кустиками собирать? Удачи! ))))))))))))

Нашли показатель... GitHub... сейчас умру от смеха! ))))))))))))))))))))))))))))))

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

Я - не являюсь "проприетарщиком" .. выкладывал. Теперь - не вижу надобности. Да и зачем оно вам? Оно же сплошь рассово-неверно, ибо на глобалах больше 50% кода, ибо большая часть обработок на прерываниях! И как вы будете адаптировать код к Ардуино, который юзает вовсю "wiring++", работающий на всех 86 ногах и БЕЗ их цифровой нумерации (то самое решение, которое тут от автора топика ждут уже с полгода, пожалуй)?

ssss
Offline
Зарегистрирован: 01.07.2016

Arhat109-2 пишет:

Прежде чем писать что "кто-то неправ" сильно советую посмотреть на результаты компиляций в ассемблер .. хотя бы того же delay() .. вроде "проще некуда". :)

У недоэмбэддэров от РС мозг развёрнут в другую сторону. Они в каждом МК видят крошечный РС, со всеми вытекающими.

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

И в чем конкретно я был "не прав" согласно цитированному тексту?

...

1. "не хватит стека".

...

регистры 18-31 отданы под оформление вызовов и передачи параметров

И где тут стек?

 

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

Ну скомпиляйте вы уже в ассемблер что-нибудь и обнаружьте "где там стек" .. что вы читаете ужатые портянки без детального объяснения что, куда и как использует компилятор? Есть развернутые описания .. лень снова искать. Где-то на микросине було..

ptr
Offline
Зарегистрирован: 28.05.2016

ssss пишет:

Нашли показатель... GitHub... сейчас умру от смеха! ))))))))))))))))))))))))))))))

Еще одни проприетарщик. Брысь с форума )

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

Да. И это тоже причина по котрой УЖЕ не выкладываю. Обнаружено и доказано, что проприетарщики шарятся по таким свалкам и патентуют код как свой собственный. Вы просто даже не догадываетесь сколько и каких ботов шарится по сети и "шерстят" такие вот форумы на предмет новых идей..

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

Ну скомпиляйте вы уже в ассемблер что-нибудь

Вы что, действительно думаете, что я не изучал ассемблерный код, формируемый GCC на AVR?

Сами сделайте и посмотрите. Если суммарный размер параметров меньше 24 байт, то они все будут переданы через регистры, без всякого стека.

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

Мне лень сейчас заново ставить avr-gcc. ибо он уже давно переселился на комп к ребенку и показывать вам результаты ассемблерных листингов компиляций. Но, судя по вашим брождениям по ссылкам и скорости появления ваших "детализирующих постов" - да, почти уверен что НЕ смотрели ни разу.

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

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

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

И это великолепно! Если размещать под GPLv2, то потом эти же проприетарщики, скрипя зубами и подвывая, выкладывают в общий доступ весь свой проприетарный код, перелицензируя его под GPL )

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

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

Самокритично! Поздравляю )

 

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

У меня нет ни желания ни времени разбираться с проприетарщиками и воровством в среде ИТ. Кому надо - тот взял и пользует. Сейчас вопросы распространения закрыты по причине того что занимаюсь другой стороной темы и есть идеи как это можно сделать "ишо лучше" .. но пока "не до этого". Какие-то куски в свое время отправлялись разработчикам Ардуино .. сочтут полезным - втыкнут в ИДЕ штатно и без меня.

ssss
Offline
Зарегистрирован: 01.07.2016

Arhat109-2 пишет:

Да. И это тоже причина по котрой УЖЕ не выкладываю. Обнаружено и доказано, что проприетарщики шарятся по таким свалкам и патентуют код как свой собственный. Вы просто даже не догадываетесь сколько и каких ботов шарится по сети и "шерстят" такие вот форумы на предмет новых идей..

Чушь! Идея первична, всё остальное вторично. Меня на форумах, например, и интересуют только идеи, а чужой код мне и нахрен не всрался. Но и свой я никогда не выкладывал, он практически весь коммерческий.

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

ваша попытка юродствовать "не канает". :) В данном конкретном случае, ваше "не рекомендую глобалы" и есть ГОВНОКОДИНГ. :)

Ибо методы управления экскаватором в корне отличаются от катания на самокате. Пока до вас этот простой факт не дойдет - ваша рекомендация - есть подталкивание к говнокодингу. И только.

ssss
Offline
Зарегистрирован: 01.07.2016

Arhat109-2 пишет:

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

Подход ардуины сплошной говнокодинг. Ну и как вы с этим боретесь? Или ваш говнокодинг говнокодистее?

ptr
Offline
Зарегистрирован: 28.05.2016

Про говнокод и глобальные переменные. Очень популярно и подробно: http://c2.com/cgi/wiki?GlobalVariablesAreBad

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

Ибо методы управления экскаватором в корне отличаются от катания на самокате.

Методы, да. Но ПДД едины и для самоката, и для экскаватора. В целях безопасности. Точно так же как и правила написания безошибочного кода едины и служат целям безопасности.

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

Про говнокод и глобальные переменные.

Да чушь собачья! Что хуже, что лучше может разобраться только профи, да и то в каждом, в каждом!, конкретном случае. А в общем и целом - это ни о чём.

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

ваша попытка юродствовать "не канает". :)

Почему же? Вы по полной облажались, утверждая, что передача параметров, вместо использования глобалов, будет расходовать стек. Итого, у Вас не нашлось ни одного аргумента, почему надо поощрять использование глобальных переменных у новичков. Я же предоставил множество таких аргументов. Умейте признавать свои ошибки.

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

Методы, да. Но ПДД едины и для самоката, и для экскаватора. В целях безопасности. Точно так же как и правила написания безошибочного кода едины и служат целям безопасности.

Бред! Вы хоть правила безопасности кода читали, хоть раз? Ардуина там и рядом не валялась! Ибо это не её и это ей и нахрен не нужно. У неё совсем другие задачи, -  дать первый успех для новичка, и только.

ptr
Offline
Зарегистрирован: 28.05.2016

ssss пишет:

Да чушь собачья!

Детка, извинись и больше не преходи на личности. Или прослывешь флеймером и демагогом.

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

Или прослывешь флеймером и демагогом.

Да пофигу! Лишь бы не таким ламером как ты!

ptr
Offline
Зарегистрирован: 28.05.2016

ssss пишет:

Бред! Вы хоть правила безопасности кода читали, хоть раз? Ардуина там и рядом не валялась! Ибо это не её и это ей и нахрен не нужно. У неё совсем другие задачи, -  дать первый успех для новичка, и только.

Мда, походу ЕвгенийП все же был прав...

Безопасность кода - это использование ресурсов компилятора, а не ресурсов CPU во время выполнения программы.

ptr
Offline
Зарегистрирован: 28.05.2016

ssss пишет:

Да пофигу! Лишь бы не таким ламером как ты!

Детка, хамло ты позорное и этим доказывешь, что ты ламер и есть )

 

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

Datak пишет:

У меня небольшая поправка. Насколько я знаю, строго говоря, статическая переменная инициализируется не перед началом исполнения программы, а при первом входе в блок/функцию, где эта переменная объявлена. Т.е., непосредственно перед первым использованием этой переменной.

Давйте проверим.

Для начала запустим вот такой скетч с целью узнать адрес локальной статической переменной.

template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

long * f(void) {
	static long lv = 123454321;
	return & lv;
}

void setup(void) {
	Serial.begin(115200);
	long * p = f();
	Serial << "p=" << (long)(p) << ";  *p=" << (*p) << '\n';
}

void loop(void) {
	digitalWrite(3, (int)f()); // пусть будет
}

Результат:

p=256;  *p=123454321

Теперь, когда мы знаем адрес, перепишем скетч вот в таком виде (изменена только строка 10!):

template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

long * f(void) {
	static long lv = 123454321;
	return & lv;
}

void setup(void) {
	Serial.begin(115200);
	long * p = (long *) 256;
	Serial << "p=" << (long)(p) << ";  *p=" << (*p) << '\n';
}

void loop(void) {
	digitalWrite(3, (int)f()); // это нужно, что f() не была выброшена при оптимизации
}

Результат

p=256;  *p=123454321

Как видите, локальная статическая переменная была инициализирована и ДО вызова функции.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Arhat109-2 пишет:

Я уже ничего на гитхаб не выкладываю. Незачем. у меня - всё работает как надо .. и свой wiring и RTOS и ИС "ДРАКОН" генерит Ардуино-код вполне сопоставимый с результатом Атмел-студии и Ардублок скоро будет иметь ту же самую возможность использования моих библиотек, а не от новичков сферического программирования. Думаю, к весне можно будет пересадить ребенка на свой "Ардублок" на базе ДРАКОН..

да, кстати .. надо будет выложить фото нашей Меги2560 со всеми 86-ю рабочими контактами .. помнится Пухлявый очень хотел посмотреть .. :)

сферический ребенок загружает сферическую библиотеку в сферический "Ардублок", на базе сферического ДРАКОНА

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

ptr, Вы ошибаетесь. ПДД существуют для экскаватора и отсутствуют для самокатов. Ибо им появляться на большой дороге - ЗАПРЕЩЕНО от слова "совсем". Также и с микроконтроллерами .. ну не канают методы управления экскаватором тут! Доходите .. медленно, постепенно .. "рассовоправильный догматизм" проходит. :)

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

Почему же? Вы по полной облажались, утверждая, что передача параметров, вместо использования глобалов, будет расходовать стек. Итого, у Вас не нашлось ни одного аргумента, почему надо поощрять использование глобальных переменных у новичков. Я же предоставил множество таких аргументов. Умейте признавать свои ошибки.

И долго вы будете нести подобную чушь? Впомнилось выступление "гуру" по поводу статик на котах. В итоге -  новичок натыкал их где попало, вместо уменьшения размера кода получил увеличение и по этому поводу потом долго ржали на двух форумах.

Где что лучше приходит только с опытом. А ваши общие понятия ни о чём. Никогда не видели, как сранный ЖЦЦ делает кодэ реордэринг с локальными переменными? Не?

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

ssss пишет:

Бред! Вы хоть правила безопасности кода читали, хоть раз? Ардуина там и рядом не валялась! Ибо это не её и это ей и нахрен не нужно. У неё совсем другие задачи, -  дать первый успех для новичка, и только.

Мда, походу ЕвгенийП все же был прав...

Безопасность кода - это использование ресурсов компилятора, а не ресурсов CPU во время выполнения программы.

Бред! Это и знание компилятора, и ресурсов CPU, и многое ещё чего. Многие ли новички, да и не только, опускаются до таких "мелочей"?

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

ptr, писал: "Почему же? Вы по полной облажались, утверждая, что передача параметров, вместо использования глобалов, будет расходовать стек."

Не передергивайте. Я не писал что "вместо" .. будет пытаться использовать регистры для передачи параметров, но и только. Среднее количество параметров заведомо превышает возможности попыток компилятора и даже в казалось бы простых ситуациях .. параметры таки лезут на стек. Часто как раз из-за call-saved registers по вашей ссылке.

Затраты на вызов функции с параметрами я вам прикинул. Они в среднем ТАКИЕ. И это хорошо было показано тут где-то Евгением с его попытками моргать блинком разными способами. Скорострельность дуньки при вызовах даже простой функции резко падала на ПОРЯДОК .. об этом и был мой текст. Перечитайте.

Можете взять тот самый пример из этого топика, на который ссылался Евгений в начале темы .. и объяснения своим опусам ТАК И НЕ ПРИВЕЛ .. слился. Там есть ссылка на код. он есть в параметрах и глобалах .. как раз вам "для сравнений". :)

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

ptr, Вы ошибаетесь. ПДД существуют для экскаватора и отсутствуют для самокатов. Ибо им появляться на большой дороге - ЗАПРЕЩЕНО от слова "совсем".

Прошу прощения, а где запрещено? Не в ПДД случайно? )

 

ptr
Offline
Зарегистрирован: 28.05.2016

ssss пишет:

ptr пишет:

Почему же? Вы по полной облажались

И долго вы будете нести подобную чушь?

Буду считать это признанием полного поражения. Так как вместо хоть каких-то аргументов пошла демагогия с переходом на личности )

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

Конечно в ПДД! Но как раз в МОЕЙ ЧАСТИ ПДД: "нельзя лезть с рассовоправильными подходами в программирование микроконтроллеров" .. это и есть тот самый запрет, а вовсе не ваше "не используйте глобалы" .. :)

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

Среднее количество параметров заведомо превышает возможности попыток компилятора

В говнокоде - да. В нормальном коде - 1-3, обычно. Я так уже при добавлении четвертого задумываюсь о переходе к указателю на структуру.

Цитата:

Затраты на вызов функции с параметрами я вам прикинул.

Для говнокода, когда не умеют работать с указателями на структуру.

 

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

Мужики, может вы отделльныю тему создадите?

А то вот Datak сделал замечание по теме, я ему ответил, но боюсь, что за вашим срачем он этого ответа не заметит!

ssss
Offline
Зарегистрирован: 01.07.2016

ptr пишет:

ssss пишет:

ptr пишет:

Почему же? Вы по полной облажались

И долго вы будете нести подобную чушь?

Буду считать это признанием полного поражения.

Вашего поражения! Засчитано! ))))))))))))

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

Ну так мы тут за кого речь ведем?!? "Этюды для НАЧИНАЮЩИХ" .. что вы все это одеяло на себя примерять пробуете? .. конечно, нормальный прогер с опытом способен оценить ожидаемый код функции и набор её параметров и организовать верную передачу ЗАРАНЕЕ, до написания кода .. но тогда и речи ни о чем нет .. тут "э-т-ю-д-ы..". И пока только за "сферическое ПДД в вакууме", ибо к самокатам - оно НЕ ПОДХОДИТ. :)

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

Если у чела не хватает терпежу прочитать каких-то 150-200 постов по теме .. оно ему точно "надо"? Собственно как и всю тему давно надо снести в соответствующий раздел за отсутсвием пользы и наличием явного вреда.

ptr
Offline
Зарегистрирован: 28.05.2016

Arhat109-2 пишет:

Конечно в ПДД!

И опять облажались, так как до этого писали:

Arhat109-2 пишет:

ПДД ... отсутствуют для самокатов

Более того, ПДД приравнивает самокаты к пешеходам и требует от них соблюдения ПДД:

http://letskick.ru/samokat-i-pdd/

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

Да пофиг. Важно что ПДД пешеходов и самокатчиков за экскаваторы не принимает .. :)

ptr
Offline
Зарегистрирован: 28.05.2016

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

Мужики, может вы отделльныю тему создадите?

Ушел. И Arhat109-2 и ssss уже свалились в откровенную демагогию, а значит признали свою полную некомпетентность в обсуждаемом вопросе. ЧТД.

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

Да, тоже предлагаю уйти в силу вашей полной некомпетентности и незнания AVR архитектуры.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

какое-то невъебенное бурление говн умудряется ТС в своих темах зарождать - сцуко, талант не пропьёшь.