Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Разбираемся с IAR


Автор: jimmi 15.7.2005, 21:09
smile

Автор: PILOT 17.7.2005, 15:08
У тебя что=то не так.
Вот во что у меня твой код дизассемблировался:
Код

@0000002A: delay
---- e:\work\Ýëåêòðîíèêà\Ïðîåêòû\tmp_prj\main.c ---------------------------------------------------
4:        for (unsigned char i = 0xff; i != 0; i--);
+0000002A:   EF0F        SER     R16              Set Register
+0000002B:   C001        RJMP    PC+0x0002        Relative jump
4:        for (unsigned char i = 0xff; i != 0; i--);
+0000002C:   950A        DEC     R16              Decrement
4:        for (unsigned char i = 0xff; i != 0; i--);
+0000002D:   2300        TST     R16              Test for Zero or Minus
+0000002E:   F7E9        BRNE    PC-0x02          Branch if not equal
5:        }
+0000002F:   9508        RET                      Subroutine return

Автор: Guest 19.7.2005, 17:33
А у меня так дизассемблируется.
АврСтудия последняя. IAR 411a, 30 дней еще не прошло.
Формат hex intel standart. Вместо процедуры задержки один return.
Прикольно.

@00000000: _..X_HUGE_HEAP_SIZE
+00000000: 940C0035 JMP 0x00000035 Jump
+00000002: 9518 RETI Interrupt return
+00000003: 9518 RETI Interrupt return
+00000004: 9518 RETI Interrupt return
+00000005: 9518 RETI Interrupt return
+00000006: 9518 RETI Interrupt return
+00000007: 9518 RETI Interrupt return
@00000008: _..X_HEAP_SIZE
+00000008: 9518 RETI Interrupt return
+00000009: 9518 RETI Interrupt return
+0000000A: 9518 RETI Interrupt return
+0000000B: 9518 RETI Interrupt return
+0000000C: 9518 RETI Interrupt return
+0000000D: 9518 RETI Interrupt return
+0000000E: 9518 RETI Interrupt return
+0000000F: 9518 RETI Interrupt return
@00000010: _..X_RSTACK_SIZE
+00000010: 9518 RETI Interrupt return
+00000011: 9518 RETI Interrupt return
+00000012: 9518 RETI Interrupt return
+00000013: 9518 RETI Interrupt return
+00000014: 9518 RETI Interrupt return
+00000015: 9518 RETI Interrupt return
+00000016: 9518 RETI Interrupt return
+00000017: 9518 RETI Interrupt return
+00000018: 9518 RETI Interrupt return
+00000019: 9518 RETI Interrupt return
+0000001A: 9518 RETI Interrupt return
+0000001B: 9518 RETI Interrupt return
+0000001C: 9518 RETI Interrupt return
+0000001D: 9518 RETI Interrupt return
+0000001E: 9518 RETI Interrupt return
+0000001F: 9518 RETI Interrupt return
+00000020: 9518 RETI Interrupt return
+00000021: 9518 RETI Interrupt return
+00000022: 9518 RETI Interrupt return
+00000023: 9518 RETI Interrupt return
+00000024: 9518 RETI Interrupt return
+00000025: 9518 RETI Interrupt return
+00000026: 9518 RETI Interrupt return
+00000027: 9518 RETI Interrupt return
+00000028: 9518 RETI Interrupt return
+00000029: 9518 RETI Interrupt return
@0000002A: _..X_FLASH_BASE
---- d:\temp\prj\main.c -----------------------------------------------------------------
8: }
+0000002A: 9508 RET Subroutine return
@0000002B: main
11: DDRA = 0x01;
+0000002B: E001 LDI R16,0x01 Load immediate
+0000002C: BB0A OUT 0x1A,R16 Out to I/O location
14: PORTA|= (1<<0); // 1 на PA.0
+0000002D: 9AD8 SBI 0x1B,0 Set bit in I/O register
15: delay();
+0000002E: DFFB RCALL PC-0x0004 Relative call subroutine
16: PORTA&=~(1<<0); // 0 на PA.0
+0000002F: 98D8 CBI 0x1B,0 Clear bit in I/O register
@00000030: _..X_RSTACK_BASE
17: delay();
+00000030: DFF9 RCALL PC-0x0006 Relative call subroutine
+00000031: CFFB RJMP PC-0x0004 Relative jump
@00000032: ?C_FUNCALL
---- No Source ------------------------------------------------------------------------------------
+00000032: 0000 NOP No operation
@00000033: __exit
+00000033: 9588 SLEEP Sleep
+00000034: CFFE RJMP PC-0x0001 Relative jump
@00000035: ?C_STARTUP
+00000035: E90F LDI R16,0x9F Load immediate
+00000036: BF0D OUT 0x3D,R16 Out to I/O location
+00000037: E000 LDI R16,0x00 Load immediate
+00000038: BF0E OUT 0x3E,R16 Out to I/O location
+00000039: E8C0 LDI R28,0x80 Load immediate
+0000003A: E0D0 LDI R29,0x00 Load immediate
@0000003B: ?call_low_level_init
+0000003B: 940E0043 CALL 0x00000043 Call subroutine
@0000003D: ?cstartup_call_main
+0000003D: 940E002B CALL 0x0000002B Call subroutine
+0000003F: 940E0000 CALL 0x00000000 Call subroutine
+00000041: 940C0032 JMP 0x00000032 Jump
@00000043: __low_level_init
+00000043: E001 LDI R16,0x01 Load immediate
+00000044: 9508 RET

Автор: PILOT 19.7.2005, 17:51
Нетрудно заметить что код правильный и прыгает на STARTUP, а затем на main (35ый адрес).

СУВ.

Автор: jimmi 19.7.2005, 18:14
smile

Автор: PILOT 19.7.2005, 22:23
Всегда при отладке должен быть none, т.к. в противном случае компилятор начинает принимать такие решения, которых вы от него не требовали, а иногда работать нестабильно.
Я вообще стараюсь не использовать оптимизацию, а стараться написать с предсказанием того во что это откомпилируется.

СУВ.

Автор: jimmi 26.7.2005, 15:58
smile

Автор: cardinal 26.7.2005, 16:24
Цитата(jimmi @ 26.7.2005, 13:58)
Переписал так, теперь светодиод должен зажигаться на 10 сек и гаснуть тоже на 10 сек.

А он до сих пор не так работает как ты хочешь?

Автор: PILOT 26.7.2005, 17:18
Он работает.

СУВ.

Автор: cardinal 26.7.2005, 17:43
Ну тогда ясно. smile

Я задержку кстати через прерывания делал, а потом по простому
Код

void WaitXms(int iWait)
{
   for(iCtr1ms_g = iWait; iCtr1ms_g > 0;);


И не надо говорить, что это бесконечный цикл smile

Автор: Гость_Calypso 9.9.2005, 18:02
Ребята. IAR - это кака. Не хочу навязывать свое мнение, конечно.
Юзайте GNU, юзайте CodeVision.

Автор: PILOT 17.9.2005, 22:57
Обоснуй...


СУВ.

Автор: Pluto5C 19.9.2005, 12:03
Цитата(PILOT @ 17.9.2005, 22:57)
Обоснуй...


СУВ.

Обосновываю.

Столкнувшись с проблемой разработки ПО, так или иначе приходится выбирать - на чем писать.
Я работал с IAR для PIC и для AVR. Причем, версии пробовал разные и для AVR, и для PIC.
Что не понравилось, так это очень криво реализованная оптимизация. Так, даже при выключенной опт. программа функционировала некорректно. Доходило до того, что в отладчике я не находил ассемблерных инструкций, соответствующих конкретному оператору на C: то есть он просто самовольно выбрасывает куски кода и даже не на максимальном уровне оптимизации.
Если есть желание бороться с компилятором, а не заниматься написанием программы - выбирайте IAR. Тем не менее наш главный инженер пишет именно на IAR для AVR. Тратит уйму времени на отладку ПО, ибо JTAG не имеем.
Просто предлагаю начинающим использовать CodeVisionAVR. Из минусов можно отметить то, что "wizard" не заставляет людей еще неопытных думать. Все делает за них. В CodeVision я написал довольно много программ. Даже сравнивать не могу с IAR.

Очень хорошо зарекомендовала себя среда WinAVR. Настоятельно рекомендую. Все что основано на GNU - работает практически безупречно.

Что касается PIC-контроллеров. С IAR для PIC проблем гораздо меньше. Если не устроит, попробуйте HT-PIC. Отличный компилятор, хотя тоже имеет свои заморочки.
Ну а для MSP430 - выриантов не вижу - IAR )))

Есть еще один момент. Если вам приходится работать, к примеру, с AVR, PIC, MSP430, очень хорошо бы юзать одну среду разработки как IAR. Геморойно, но зато все одинаково.

Автор: ManiaK 19.9.2005, 13:04
Pluto5C спасибо за информацию!..

Автор: PILOT 19.9.2005, 23:15
Pluto5C
Ну что тут скажешь...
Борьба с компилятором вместо разработки это грубовато, но компилятор меня устраивает полностью, он схватывает моменты которые другие компиляторы не могут нормально отработать (например наследование классовsmile ). Возможно классы это перебор, но была задачка которую в лоб было долго решать, вот и ...
И еще, компилятор весьма грамотный и не буде пихать не нужный код (например инициализацию переменных которым через 3 строчки после инициализации опять присваивают уже новые значения), этот пример я лично показывал одному из своих подчиненных который не мог понять куда делся ассемблерный кусок.
Скажу так: мне ИАР нравится даже больше, чем Кейл. smile И уж тем более ИАР АВР версии более 4, где наконец-то изменили интерфейс, который до этого был ооочень неудобным.
Оптимизацией не пользуюсь, стараюсь сразу все сделать грамотно (классы не в счет, как и говорил - лень было думать, зато крупный проект был сделан за считанные дни smile )

И кстати, ИАР для АВР поддерживает ЭМУЛЯТОР JTAG (правда пока только через COM порт, но этого вполне достаточно). А если возникают проблемы то всегда есть URBOF8 и AVR-Studio которая прекрасно отлаживает Си++ проекты как с симулятором, так и со всеми поддерживаемыми эмуляторами.

СУВ.

Автор: Pluto5C 26.9.2005, 23:44
2PILOT

Я, все-же, признаюсь, пристрастен по отношению к продуктам IAR.
Года 4 тому, я первый принес его (IAR for AVR) на фирму.
Мне записали болванку с этим компилером за одну бутылку пива. smile smile
Причем присадил своего тогдашнего начальника.
Я копал дальше и выбирал, а он так и сидит на IAR.

Sorry за оффтопик.

Автор: PILOT 27.9.2005, 22:06
IAR требует знаний и опыта, и много не делает автоматом (например глубину STACK CALLs) из-за чего поначалу выскакивают всякие непредсказуемые вещи, но разобравшись в настройках получаем очень гибкую систему разработки. Вы с ней глубоко не разбирались, т.к. не знали о возможности подключения JTAG эмулятора. А по сему судить о ней можете лишь поверхностно. И это вполне нормально... каждому свое. Кому-то нравятся машины с автоматом, кому-то механику подавай...

СУВ.

Автор: Pluto5C 28.9.2005, 00:41
Цитата(PILOT @ 27.9.2005, 22:06)
IAR требует знаний и опыта, и много не делает автоматом (например глубину STACK CALLs) из-за чего поначалу выскакивают всякие непредсказуемые вещи, но разобравшись в настройках получаем очень гибкую систему разработки. Вы с ней глубоко не разбирались, т.к. не знали о возможности подключения JTAG эмулятора. А по сему судить о ней можете лишь поверхностно. И это вполне нормально... каждому свое. Кому-то нравятся машины с автоматом, кому-то механику подавай...

СУВ.

Ну у вас и заключения smile
Все, что можно было покрутить (в т.ч. и глубину стека smile ), было покручено.
Чай ВМ80 и Z80 начинали.
А в остальном согласен - suum cuique.

Автор: PILOT 28.9.2005, 19:59
Короче, я уверен, что Ваш исходник можно было корректно откомпилить в IAR.

СУВ.

Автор: Pluto5C 28.9.2005, 23:28
Цитата(PILOT @ 28.9.2005, 19:59)
Короче, я уверен, что Ваш исходник можно было корректно откомпилить в IAR.

СУВ.

Можно и зайца курить научить ;)
Разговариваем уже ни о чем. Спасибо, было действительно приятно пообщаться.

Автор: PILOT 29.9.2005, 18:48
Не пробовал...

СУВ.

Автор: anafeg 18.9.2011, 19:52
Компилятор IAR C для микроконтроллеров AVR фирмы Atmel
чем можно заменить char s = '1asd23'; ?
char s = "1asd23"; и char s = 1asd23; не прокатывает
обязательно нужно сделать в одну строчку

Автор: xvr 18.9.2011, 20:39
Цитата(anafeg @  18.9.2011,  19:52 Найти цитируемый пост)
чем можно заменить char s = '1asd23'; ?

Ну чем нибудь синтаксически корректным  smile . Если же нужно сохранить семантику, то char s = '3'; 
Попробуйте на досуге ответить на вопрос - как засунуть 6ти байтовое значение в одно байтовую переменную?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)