Страница 20 из 421

Добавлено: Ср сен 24, 2008 19:02:49
ARV
tych, вы меня огорчаете... много эмоций, но мало восприятия сказанного мною.
я разбираюсь в ассемблере, но вы думаете, это мне прибавляет энтузиазма для ковыряния в листинге из-под WinAVR? однако, вы меня вынудили это сделать...

Код: Выделить всё

00000048 <__do_clear_bss>:
  48:	10 e0       	ldi	r17, 0x00	; 0
  4a:	a2 e6       	ldi	r26, 0x62	; 98
  4c:	b0 e0       	ldi	r27, 0x00	; 0
  4e:	01 c0       	rjmp	.+2      	; 0x52 <do_clear_bss_start>

00000050 <do_clear_bss_loop>:
  50:	1d 92       	st	X+, r1

00000052 <do_clear_bss_start>:
  52:	a4 36       	cpi	r26, 0x64	; 100
  54:	b1 07       	cpc	r27, r17
  56:	e1 f7       	brne	.-8      	; 0x50 <do_clear_bss_loop>
  58:	02 d0       	rcall	.+4      	; 0x5e <main>
  5a:	0b c0       	rjmp	.+22     	; 0x72 <_exit>
вот этот участок инициализирует нулями все переменные, которые объявлены, но им явно не указаны значения. даже по имени меток do_clear_bss_хххх вы можете догадаться, что речь идет об очистке памяти... .bss - это имя секции памяти WinAVR, отводимой для статических и глобальных переменных. Память тупо обнуляется, не взирая на размеры переменных.

теперь несколько слов в ответ на ваши эмоции.
Ваааааааааааще ОТЖИХХХХХ ! Корки отмачиваете не шуточные ! Откудаж в СИМУЛЯТОРЕ возьметься мусор в ячейках памяти ? Симулятор РОДИТ его чтоль ?
нет, его можно вручную намусорить в область ОЗУ - это не протеус, "виртуальная" память в студии доступна для редактирования. намусорьте туда сами - сколько хотите и куда хотите, потом проимитируйте сброс - и поглядите, что стало с переменными внутри main()...

В листинге CVAVR есть специальный макрос очищающий всю оперативн память - не знаю задействует ли он его в каждой проге или нет.
я не знаю тоже, но если CVAVR следует закону - то обязательно должен задействовать!
Так оно и есть на самом деле - программа на Си начинает выполняться с мэйн обычно.
с точки зрения программиста - да, так и есть. но реально микроконтроллер выполняет еще немало предварительных действий, так называемый "пролог" или "инициализацию", и лишь потом вызывается main(). Если обраться к более крутым примерам - программам для Windows или даже DOS, то там объем предварительного кода (выполняемого до main()) может в разы превосходить код собственно main()!
WinAVR имдиЁт чтоль ? Он чтоль не видит что переменная не считвается в коде до записи в нее, нафигаж он будет писать в нее то что не требуется - ОПТИМИЗАЦИЯ то включена !
ну, во-первых, оптимизацию и выключить недолго, во-вторых, можно объявить переменную volatile - и тогда компилятор ее обязан будет проинициализировать... но и в первом, и во втором случае в листинге main() вы не увидите команд, делающих этого! все будет сделано до входа в главную функцию...

Добавлено: Ср сен 24, 2008 19:10:59
tych
ARV писал(а):tych, вы меня огорчаете... вы меня вынудили это сделать...

вот этот участок инициализирует нулями все переменные, которые объявлены, но им явно не указаны значения. Память тупо обнуляется, не взирая на размеры переменных.
Я этого ОБЪЯСНЕНИЯ и просил в верхнем посте ! Я ведь четко там (см наверх!) написал:

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

Я просто просил мне объяснить "где конкретно в асме" - форум для того и есть ведь !
ARV писал(а): можно вручную намусорить в область ОЗУ - это не протеус, "виртуальная" память в студии доступна для редактирования. намусорьте туда сами - сколько хотите и куда хотите, потом проимитируйте сброс - и поглядите, что стало с переменными внутри main()
Блин !!! Вы все УХОХАТЫВАЕТЕСЬ !!!???
Ну какой смысл это писать ПОСЛЕ того как вы наконец показали конкретный АСМ код очищающий всю память !!! при старте прграммы.

НО !!! Вы выше писали про обнуление ПЕРЕМЕННЫХ !!! а не просто всей памяти. Вот
ARV писал(а): там и происходит инициализация переменных, в том числе и обнуление по умолчанию.
т.е. обнуление это ни как ни связано с переменными с их размещением и со стандартом Си - это просто забота о нас со стороны компилятора.
ARV писал(а): можно объявить переменную volatile - и тогда компилятор ее обязан будет проинициализировать... но и в первом, и во втором случае в листинге main() вы не увидите команд, делающих этого! все будет сделано до входа в главную функцию...
Я и не требовал НИГДЕ ее нахождения в МЭЙН ! Че ей там делать если даже на Си она до мэйн появилась.

Кусок кодя я привел С ПОЯСНЕНИЕМ - что удивлен путаницей не большой в листинге WinAVR, котрой в CVAVR я не встречал.

Добавлено: Ср сен 24, 2008 19:19:18
ARV
я даже теперь опасаюсь...
если мое объяснение вас удовлетворило - значит ли это, что я "более опытный"?! и тем более, "товарищ" ли я?!
:)))
а на счет просьбы - вы же понимаете, что просьба просьбой, а лень ленью :)

Добавлено: Ср сен 24, 2008 19:38:47
tych
ARV писал(а):я даже теперь опасаюсь...
если мое объяснение вас удовлетворило - значит ли это, что я "более опытный"?!
Ну естетсвенно вы более опытный, вы ж делаете всякие разработки, устройства - а я больше теоретизирую, симулирую, помогать пытаюсь словом. И в АСМ листинги я только изредка заглядываю.

И в заголовке домашней странички у меня
КРУПНО-красно написано: "... от ЧАЙНИКА".
ARV писал(а): и тем более, "товарищ" ли я?! :)))
Вы полагаете что я гусь ? :lol:

Добавлено: Ср сен 24, 2008 19:49:58
Telek
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, и оставил чистку.

Добавлено: Ср сен 24, 2008 20:01:44
ARV
tych писал(а):Вы полагаете что я гусь ? :lol:
гм... поговорка "гусь свинье не товарищ"... ежели вы гусь, то я, по-вашему, свинья?! :shock:

Telek, странно то, что оптимизатор вообще что-то оставил - программа, которая ничего никуда не выводит, не работает с периферийными устройствами и volatile-переменными - с точки зрения оптимизатора абсолютно бессмысленная! в моих тестах такая функция main() компилировалась в следующий код: :)))

Добавлено: Ср сен 24, 2008 20:08:47
tych
ARV писал(а): ежели вы гусь, то я
я там смайлик поставил.

Добавлено: Ср сен 24, 2008 20:23:54
Lepehin Evgeniy
tych, если Вы хотите что-то узнать, то(я по крайней мере так стараюсь делать), надо искать книги, материалы в сети, помогающие прояснить вопрос. Почитать про секции WinAVR, про startup код. Самому. И внимательно слушать и анализировать услышанное. А "наезжать" на человека, который пытается Вам объяснить то, что Вы спросили в Вашей форме изложения некрасиво. В многих системах симулирования, компиляторах и, особенно при их взаимодействии присутствуют разнообразные глюки. Как справедливо заметил ARV после установки оптимизации СИ кода возникает абракадабра. И не только в листинге. В протеусе и Codevision и WinAVR дают в этом случае не "удободебугируемый" код.
Нужно учитывать и неразбериху с отладочными форматами, например. Иногда лучше отлаживать не ELF, а EXTCOFF. С версиями компиляторов, в которых "убраны старые ошибки и добавлены новые" и отладчиках. Надо знать сильные и слабые стороны своего инструментария. И не надо кипятиться. Удачи и терпения!

Добавлено: Ср сен 24, 2008 20:25:57
ARV
tych писал(а):
ARV писал(а): ежели вы гусь, то я
я там смайлик поставил.
да понял я ваш юмор :)

Добавлено: Ср сен 24, 2008 20:34:05
tych
Lepehin Evgeniy писал(а):tych, Удачи и терпения!
И вам !

Добавлено: Ср сен 24, 2008 20:41:55
ARV
self-censored

Добавлено: Ср сен 24, 2008 20:50:52
tych
ARV писал(а):tych, чем тут флудить, лучше ответьте про семплы... я опять в тупике :(
по времени сообщений позырь - я уж ДАВНО ответил ! в том топике.

Добавлено: Ср сен 24, 2008 20:52:56
ARV
self-censored

Добавлено: Пт сен 26, 2008 23:22:12
KIP
В программе не получается прогнать байт по битам от младшего к старшему.
Для понимания проблеммы прокомпилировал этот кусок отдельно:

#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 .Подскажите в чём проблемма?

Добавлено: Сб сен 27, 2008 08:28:06
tych
блин .... ну архив то с проектом ПРИЛОЖИ !

Добавлено: Сб сен 27, 2008 09:28:44
KIP
Файлы проекта-выдача на 5 ножке порта В сигналов соответствующих содержимому переменной b от младшего к старшему.

Добавлено: Сб сен 27, 2008 10:02:15
tych
a = b; - здесь b воспринималось как то что должен хранить ФЛАГ - "истино" - не ноль или "ложно" - ноль.

И пока не b была нулем она (целиком) считалась истиной.

я вместо 8 написал 11 и когда b обнулялось на PB5 выводился 0.

Изображение

После замены строчки на:

Код: Выделить всё

a = b & 1; // записать в а  бит0 из b 
Прога заработала чудесно !

Изображение

Файлы в прицепе !

Добавлено: Сб сен 27, 2008 11:17:48
KIP
Спасиба, всё понятно.

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

Как пишут тут, правда в случае PIC, это именно так:
http://kazus.ru/faq/15/251.html

Добавлено: Сб сен 27, 2008 11:44:16
tych
Дело не в PIC или AVR, а в языке Си и в конкретном компиляторе.

Добавлено: Вс сен 28, 2008 19:28:29
tych
CVAVR 2.03.4 без коклюша и ветрянки !

http://kazus.ru/forum/topic_11456-160.html