tych, вы меня огорчаете... много эмоций, но мало восприятия сказанного мною.
я разбираюсь в ассемблере, но вы думаете, это мне прибавляет энтузиазма для ковыряния в листинге из-под WinAVR? однако, вы меня вынудили это сделать...
вот этот участок инициализирует нулями все переменные, которые объявлены, но им явно не указаны значения. даже по имени меток do_clear_bss_хххх вы можете догадаться, что речь идет об очистке памяти... .bss - это имя секции памяти WinAVR, отводимой для статических и глобальных переменных. Память тупо обнуляется, не взирая на размеры переменных.
теперь несколько слов в ответ на ваши эмоции.
Цитата:
Ваааааааааааще ОТЖИХХХХХ ! Корки отмачиваете не шуточные ! Откудаж в СИМУЛЯТОРЕ возьметься мусор в ячейках памяти ? Симулятор РОДИТ его чтоль ?
нет, его можно вручную намусорить в область ОЗУ - это не протеус, "виртуальная" память в студии доступна для редактирования. намусорьте туда сами - сколько хотите и куда хотите, потом проимитируйте сброс - и поглядите, что стало с переменными внутри main()...
Цитата:
В листинге CVAVR есть специальный макрос очищающий всю оперативн память - не знаю задействует ли он его в каждой проге или нет.
я не знаю тоже, но если CVAVR следует закону - то обязательно должен задействовать!
Цитата:
Так оно и есть на самом деле - программа на Си начинает выполняться с мэйн обычно.
с точки зрения программиста - да, так и есть. но реально микроконтроллер выполняет еще немало предварительных действий, так называемый "пролог" или "инициализацию", и лишь потом вызывается main(). Если обраться к более крутым примерам - программам для Windows или даже DOS, то там объем предварительного кода (выполняемого до main()) может в разы превосходить код собственно main()!
Цитата:
WinAVR имдиЁт чтоль ? Он чтоль не видит что переменная не считвается в коде до записи в нее, нафигаж он будет писать в нее то что не требуется - ОПТИМИЗАЦИЯ то включена !
ну, во-первых, оптимизацию и выключить недолго, во-вторых, можно объявить переменную volatile - и тогда компилятор ее обязан будет проинициализировать... но и в первом, и во втором случае в листинге main() вы не увидите команд, делающих этого! все будет сделано до входа в главную функцию...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
tych, вы меня огорчаете... вы меня вынудили это сделать...
вот этот участок инициализирует нулями все переменные, которые объявлены, но им явно не указаны значения. Память тупо обнуляется, не взирая на размеры переменных.
Я этого ОБЪЯСНЕНИЯ и просил в верхнем посте ! Я ведь четко там (см наверх!) написал:
Я не утверждаю что там нет обнуления, просто прошу более опытных товарищей указать где оно.
Я просто просил мне объяснить "где конкретно в асме" - форум для того и есть ведь !
ARV писал(а):
можно вручную намусорить в область ОЗУ - это не протеус, "виртуальная" память в студии доступна для редактирования. намусорьте туда сами - сколько хотите и куда хотите, потом проимитируйте сброс - и поглядите, что стало с переменными внутри main()
Блин !!! Вы все УХОХАТЫВАЕТЕСЬ !!!??? Ну какой смысл это писать ПОСЛЕ того как вы наконец показали конкретный АСМ код очищающий всю память !!! при старте прграммы.
НО !!! Вы выше писали про обнуление ПЕРЕМЕННЫХ !!! а не просто всей памяти. Вот
ARV писал(а):
там и происходит инициализация переменных, в том числе и обнуление по умолчанию.
т.е. обнуление это ни как ни связано с переменными с их размещением и со стандартом Си - это просто забота о нас со стороны компилятора.
ARV писал(а):
можно объявить переменную volatile - и тогда компилятор ее обязан будет проинициализировать... но и в первом, и во втором случае в листинге main() вы не увидите команд, делающих этого! все будет сделано до входа в главную функцию...
Я и не требовал НИГДЕ ее нахождения в МЭЙН ! Че ей там делать если даже на Си она до мэйн появилась.
Кусок кодя я привел С ПОЯСНЕНИЕМ - что удивлен путаницей не большой в листинге WinAVR, котрой в CVAVR я не встречал.
_________________ Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Последний раз редактировалось tych Ср сен 24, 2008 19:22:29, всего редактировалось 1 раз.
я даже теперь опасаюсь...
если мое объяснение вас удовлетворило - значит ли это, что я "более опытный"?! и тем более, "товарищ" ли я?!
а на счет просьбы - вы же понимаете, что просьба просьбой, а лень ленью
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
я даже теперь опасаюсь... если мое объяснение вас удовлетворило - значит ли это, что я "более опытный"?!
Ну естетсвенно вы более опытный, вы ж делаете всякие разработки, устройства - а я больше теоретизирую, симулирую, помогать пытаюсь словом. И в АСМ листинги я только изредка заглядываю.
И в заголовке домашней странички у меня КРУПНО-красно написано: "... от ЧАЙНИКА".
ARV писал(а):
и тем более, "товарищ" ли я?!
Вы полагаете что я гусь ?
_________________ Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Зарегистрирован: Пт май 23, 2008 23:59:37 Сообщений: 115 Откуда: Москва
Рейтинг сообщения:0
tych писал(а):
Скачал и поставил WinAVR, сделал проектик - по АСМ листингу переменные размещены по адресам 62h 63h 60h - но в листинге я не вижу (я не спец по АСМу) где эти адреса обнуляются как грозился ARV. Я не утверждаю что там нет обнуления, просто прошу более опытных товарищей указать где оно.
там нет ни обнуления ни выставления -4
Код:
char aba, top, mikki = - 4;
void main(void) {
aba = 3; top = 5; mikki = 7;
этот пример не особо показательный. Точнее совсем не показательный. По ассемблеру видно, что там даже нет начальной инициализации переменных в -4. Этот пример показывает, что оптимизатор работает хорошо, ибо начальная инициализация в -4 не нужна, т.к. следом(без совершения других операций над переменными) происходит повторная инициализация значениями 3 5 7...
Для проверки производится ли инициализация необходим пример типа:
Код:
char x,y,z;
x=y-3;
if (z==5) z++;
т.е. нужно выполнить какиенить действия без начального присвоения значений. Кстати, если компилятор с оптимизатором знают про необходимость начальной инициализации нулем, они могли бы заменить код x=y-3; на x=-3; что тоже будет подтверждением что про ноль знают... а if (z==5) z++; вообще пропустить, если с z больше никаких действий не производится...
Add. Упс. Про обнуление погорячился... но в -4 не инициализирует, я по хорошему обнуление в этом примере не нужно. Странно что оптимизатор снес =-4, и оставил чистку.
гм... поговорка "гусь свинье не товарищ"... ежели вы гусь, то я, по-вашему, свинья?!
Telek, странно то, что оптимизатор вообще что-то оставил - программа, которая ничего никуда не выводит, не работает с периферийными устройствами и volatile-переменными - с точки зрения оптимизатора абсолютно бессмысленная! в моих тестах такая функция main() компилировалась в следующий код:
Код:
rjmp PC
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Вс сен 07, 2008 13:17:31 Сообщений: 72 Откуда: Город Невест
Рейтинг сообщения:0
tych, если Вы хотите что-то узнать, то(я по крайней мере так стараюсь делать), надо искать книги, материалы в сети, помогающие прояснить вопрос. Почитать про секции WinAVR, про startup код. Самому. И внимательно слушать и анализировать услышанное. А "наезжать" на человека, который пытается Вам объяснить то, что Вы спросили в Вашей форме изложения некрасиво. В многих системах симулирования, компиляторах и, особенно при их взаимодействии присутствуют разнообразные глюки. Как справедливо заметил ARV после установки оптимизации СИ кода возникает абракадабра. И не только в листинге. В протеусе и Codevision и WinAVR дают в этом случае не "удободебугируемый" код.
Нужно учитывать и неразбериху с отладочными форматами, например. Иногда лучше отлаживать не ELF, а EXTCOFF. С версиями компиляторов, в которых "убраны старые ошибки и добавлены новые" и отладчиках. Надо знать сильные и слабые стороны своего инструментария. И не надо кипятиться. Удачи и терпения!
В программе не получается прогнать байт по битам от младшего к старшему.
Для понимания проблеммы прокомпилировал этот кусок отдельно:
#include <m8_128>
bit a;
unsigned char b;
unsigned char i;
void main (void){
b = b_1010_1010;
for(i=8;i>0;i--)
{
a = b;
b>>=1;
};
}
По моему за каждый проход цикла в битовую переменную должен записываться младший бит из переменной b. Это не работает-в первом цикле в а пишеться 1 и всё!. Смотрел в VMLAB .Подскажите в чём проблемма?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения