Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Разбираемся с IAR |
Автор: jimmi 15.7.2005, 21:09 |
![]() |
Автор: PILOT 17.7.2005, 15:08 | ||
У тебя что=то не так. Вот во что у меня твой код дизассемблировался:
|
Автор: 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 |
![]() |
Автор: PILOT 19.7.2005, 22:23 |
Всегда при отладке должен быть none, т.к. в противном случае компилятор начинает принимать такие решения, которых вы от него не требовали, а иногда работать нестабильно. Я вообще стараюсь не использовать оптимизацию, а стараться написать с предсказанием того во что это откомпилируется. СУВ. |
Автор: jimmi 26.7.2005, 15:58 |
![]() |
Автор: cardinal 26.7.2005, 16:24 | ||
А он до сих пор не так работает как ты хочешь? |
Автор: PILOT 26.7.2005, 17:18 |
Он работает. СУВ. |
Автор: cardinal 26.7.2005, 17:43 | ||
Ну тогда ясно. ![]() Я задержку кстати через прерывания делал, а потом по простому
И не надо говорить, что это бесконечный цикл ![]() |
Автор: Гость_Calypso 9.9.2005, 18:02 |
Ребята. IAR - это кака. Не хочу навязывать свое мнение, конечно. Юзайте GNU, юзайте CodeVision. |
Автор: PILOT 17.9.2005, 22:57 |
Обоснуй... СУВ. |
Автор: Pluto5C 19.9.2005, 12:03 | ||
Обосновываю. Столкнувшись с проблемой разработки ПО, так или иначе приходится выбирать - на чем писать. Я работал с 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 Ну что тут скажешь... Борьба с компилятором вместо разработки это грубовато, но компилятор меня устраивает полностью, он схватывает моменты которые другие компиляторы не могут нормально отработать (например наследование классов ![]() И еще, компилятор весьма грамотный и не буде пихать не нужный код (например инициализацию переменных которым через 3 строчки после инициализации опять присваивают уже новые значения), этот пример я лично показывал одному из своих подчиненных который не мог понять куда делся ассемблерный кусок. Скажу так: мне ИАР нравится даже больше, чем Кейл. ![]() Оптимизацией не пользуюсь, стараюсь сразу все сделать грамотно (классы не в счет, как и говорил - лень было думать, зато крупный проект был сделан за считанные дни ![]() И кстати, ИАР для АВР поддерживает ЭМУЛЯТОР JTAG (правда пока только через COM порт, но этого вполне достаточно). А если возникают проблемы то всегда есть URBOF8 и AVR-Studio которая прекрасно отлаживает Си++ проекты как с симулятором, так и со всеми поддерживаемыми эмуляторами. СУВ. |
Автор: Pluto5C 26.9.2005, 23:44 |
2PILOT Я, все-же, признаюсь, пристрастен по отношению к продуктам IAR. Года 4 тому, я первый принес его (IAR for AVR) на фирму. Мне записали болванку с этим компилером за одну бутылку пива. ![]() ![]() Причем присадил своего тогдашнего начальника. Я копал дальше и выбирал, а он так и сидит на IAR. Sorry за оффтопик. |
Автор: PILOT 27.9.2005, 22:06 |
IAR требует знаний и опыта, и много не делает автоматом (например глубину STACK CALLs) из-за чего поначалу выскакивают всякие непредсказуемые вещи, но разобравшись в настройках получаем очень гибкую систему разработки. Вы с ней глубоко не разбирались, т.к. не знали о возможности подключения JTAG эмулятора. А по сему судить о ней можете лишь поверхностно. И это вполне нормально... каждому свое. Кому-то нравятся машины с автоматом, кому-то механику подавай... СУВ. |
Автор: Pluto5C 28.9.2005, 00:41 | ||
Ну у вас и заключения ![]() Все, что можно было покрутить (в т.ч. и глубину стека ![]() Чай ВМ80 и Z80 начинали. А в остальном согласен - suum cuique. |
Автор: PILOT 28.9.2005, 19:59 |
Короче, я уверен, что Ваш исходник можно было корректно откомпилить в IAR. СУВ. |
Автор: Pluto5C 28.9.2005, 23:28 | ||
Можно и зайца курить научить ;) Разговариваем уже ни о чем. Спасибо, было действительно приятно пообщаться. |
Автор: 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 |
Ну чем нибудь синтаксически корректным ![]() Попробуйте на досуге ответить на вопрос - как засунуть 6ти байтовое значение в одно байтовую переменную? |