|
|
  |
WinAVR криво собирает код... |
|
|
|
Apr 8 2009, 22:06
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Блин, у меня теперь еще интересней проблема ! На работе, где стоит старый 20070525 все работает как часы... А вот дома, притом и на "стационарном" компе и на "буке" 20090313... Решил новый "наганть" и поставить старый, дык он собака где-то прописался и старый (е) у меня их около 5 сортов разных лет - не хотят работать. Весь реестр вычистил, НУ ВСЕ высистил, что можно - балда ! Вещает : > "make.exe" all AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x3C0000, State 0x10000 C:\WinAVR-20070525\utils\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 487 AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x3C0000, State 0x10000 C:\WinAVR-20070525\utils\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 487 -------- begin -------- avr-gcc (GCC) 4.1.2 (WinAVR 20070525) Copyright © 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. AllocationBase 0x0, BaseAddress 0x71590000, RegionSize 0x3C0000, State 0x10000 C:\WinAVR-20070525\utils\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 487 make.exe: *** [sizebefore] Error 1 > Process Exit Code: 2 > Time Taken: 00:01 Блин ! Да что-же это такое !!! И на буке таже песня ! Новый ставишь - все работает. Любого из старичков - пишет (см. верх) . Раньше не было такого никогда. Может знает кто - где он помимо реестра следы остав- ляет ? Пытался искать в SYSTEM32 и прочих "отсеках" - куда там, у меня винда стоит 3-тий год, распухла до 12 гектар... сносить проблемматично. Че делать ?
Сообщение отредактировал manul78 - Apr 8 2009, 22:10
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Apr 9 2009, 05:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
по поводу увеличения размера кода "свежими" версиями - я тут создавал темку, где мне доступно объяснили, что есть масса ключей оптимизации, которые позволяют и свежей версией получить минимальный размер кода. в моем случае я довольно легко добился лучшего результата, чем при сборке старой версией. возможно, немножко обидно, что раньше маленький код получался сам, а теперь надо какие-то опции включать-выключать и т.п. - однако, никто не сравнивал "старый" и "новый" код по быстродействию, например? может, размер - не самое главное? тем более когда речь не о килобайтах, а о байтах разницы. раньше, например, когда писалось PORTB |= _BV(PB1); компилятор всегда генерировал код с обращением к ячейке памяти по соответствующему адресу, т.е. делал минимум 3 команды: LDS, ORI и STS. это было очень хорошо (с одной стороны), так как легко позволяло обращаться к порту по указателю, но по скорости SBI все-же гораздо лучше. и вот в последней версии заметил, что теперь генерируется именно SBI! причем при обращении через указатель получается "старый" вариант - ведь лучше же стало, а?!  хотя странности присутствуют все равно в коде
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Apr 9 2009, 07:29
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(ARV @ Apr 9 2009, 08:57)  раньше, например, когда писалось PORTB |= _BV(PB1); компилятор всегда генерировал код с обращением к ячейке памяти по соответствующему адресу, т.е. делал минимум 3 команды: LDS, ORI и STS. это было очень хорошо (с одной стороны), так как легко позволяло обращаться к порту по указателю, но по скорости SBI все-же гораздо лучше. и вот в последней версии заметил, что теперь генерируется именно SBI! Код #include <avr/io.h>
void foo() { PORTB |= 0x01; } WinAVR-20060421 (gcc 3.4.6) -Os -S -mmcu=atmega8 Код foo: sbi 56-0x20,0 ret Более древних на работе нет, но что-от мне вспоминается, что это только с gcc 2.95 такое было, а с перехода на 3.х я уже вместо макросов inb, outb, sbi да cbi стал писать обычное =, |= да &=~ Точнее, с момента полного перехода, кода 2.95 уже был снесён на всех компах.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 9 2009, 07:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(manul78 @ Apr 9 2009, 01:06)  C:\WinAVR-20070525\utils\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 487 Поиск в гугле по сообщению об ошибке очень помогает в таких случаях. В комплекте WinAVR идет какая-то очень древняя версия утилит из msys, которую очень любит Eric Weddington. И вместе с этим набором из версии в версию WinAVR кочуют и все болячки той версии msys. На мои призывы к автору обновить эти утилиты был дан ответ - "у них нет нормального инсталятора, мне лень". Сходите на сайт mingw32/msys и скачайте там самые свежие версии всех этих утилит. После чего используйте их со всеми версиями WinAVR, а идущие в комплекте забудьте как страшный сон.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 9 2009, 16:56
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Сергей Борщ @ Apr 9 2009, 11:41)  Поиск в гугле по сообщению об ошибке очень помогает в таких случаях. В комплекте WinAVR идет какая-то очень древняя версия утилит из msys, которую очень любит Eric Weddington. И вместе с этим набором из версии в версию WinAVR кочуют и все болячки той версии msys. На мои призывы к автору обновить эти утилиты был дан ответ - "у них нет нормального инсталятора, мне лень". Сходите на сайт mingw32/msys и скачайте там самые свежие версии всех этих утилит. После чего используйте их со всеми версиями WinAVR, а идущие в комплекте забудьте как страшный сон. Уважаемый Сергей ! Я даже не знаю как Вас благодарить... Самое интересное, что на "стационарном" компе и на "буке" были совершенно разные "занозы" !!! 1) Ноутбук я победил сам. Почти пол дня ковырялся ! Причиной "глюка" был Антивирус Касперского. почти всю ночь и пол дня я читал описание на WinAVR и понял суть проблемы, файл sh.exe из utils\bin работает с операционной системой, единственное, что могло этому обмену помешать, это "проактивн- ая защита Касперского". До его установки все было гуд. Я внес sh.exe в доверенную зону - и все за- работало !!! 2) С "стационарным" компом такие выкрутасы не прошли. Я затужил. Работа горит а главный мой комп что-то вроде "осьминога" напичкан всеми примочками для отладки "в железе". Он важнее чем "бук" Зашел по вашей ссылке, почитал и уже собирался вникать в Линукс и прочие дела, кстати про "палки в колеса со стороны антивирусов, там тоже есть". Хотел было уже качать 500 метровый GNU pack... Но заглянул на крошечную ссылку, http://www.madwizard.org/electronics/articles/winavrvista Я сначала пролетел, у меня то XP ! Там нашлось лекарство, и очень простое ! Качаем 300 сот килограммовый msys-rebased.zip и перезаписываем его в utils\bin , там это по мое- му единственная DLL-ка ms-1.0 dll И все ! Земля опять завертелась !!! Жму руку как ПРОФЕССИОНАЛУ, заходящему сюда не "флудить" а помогать словом и делом !!!
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Apr 9 2009, 18:45
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
А я столкнулся с таким глюком: есть бутлоадер с эмуляцией STK500. Пишу через него - пишется нормально. Читаю - бывают ошибки, по адресу 0x4000 ошибок нет. Читаю ISP программатором - тех ошибок что показывал бутлоадер нет, по адресу 0x4000 лежит слово FFFF. Вроде помогла такая штука: Было: Код n_bytes = ((*(rx_pntr + 1) * 256) + *(rx_pntr + 2)); // number of databytes to read from flash Стало: Код *(((unsigned char *)&n_bytes) + 1) = *(rx_pntr + 1); *(((unsigned char *)&n_bytes) + 0) = *(rx_pntr + 2); Пробовал каждый раз на разных файлах, поэтому "вроде"...
|
|
|
|
|
Apr 9 2009, 19:32
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Nick_Shl @ Apr 9 2009, 22:45)  А я столкнулся с таким глюком: Вот ЭТО написано человеком который поленился прочитать документацию: Код unsigned char readBits(unsigned int address) { asm volatile( "mov r31,r25 \n\t" "mov r30,r24 \n\t" "lds r24,%0 \n\t" "ori r24,0x09 \n\t" "sts %0,r24 \n\t" "lpm \n\t" "mov r24,r0 \n\t" : "=m" (SPMCSR) ); return address&0xFF; } Это баг не в комптляторе, это баг в коде. Анатолий.
Сообщение отредактировал aesok - Apr 9 2009, 19:54
|
|
|
|
|
Apr 9 2009, 20:06
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(aesok @ Apr 9 2009, 21:32)  Вот ЭТО написано человеком который поленился прочитать документацию: Код не мой. Return взят из какого-то файла скачанного из ветки в этом форуме. Но этот код к вышеописанной проблеме отношения не имеет.
|
|
|
|
|
Apr 9 2009, 20:38
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(aesok @ Apr 9 2009, 23:32)  Вот ЭТО написано человеком который поленился прочитать документацию: Код unsigned char readBits(unsigned int address) { asm volatile( "mov r31,r25 \n\t" "mov r30,r24 \n\t" "lds r24,%0 \n\t" "ori r24,0x09 \n\t" "sts %0,r24 \n\t" "lpm \n\t" "mov r24,r0 \n\t" : "=m" (SPMCSR) ); return address&0xFF; } Это баг не в комптляторе, это баг в коде. Если readBits вызывается как функция то проблем не возникнет, так как регистры r24, r25, r30 и r31 являются CALL_USED регистрами и в коде вызывающей функции предполагаться что они не содержат те значения, что были в них перед вызовом readBit. Когда же код этой функции инлайнится то могут возникнуть проблемы, так как регистры r24, r25, r30 и r31 искажаются в ассемблерной вставке, но компилятор об этом не предупрежден. Может генерироваться код записывающий информацию в эти регистры до ассемблерной вставки и использующий эту информацию после, не смотря на то что она искажена. Регистры r24, r25, r30 и r31 должны быть добавлены в clobber list. Анатолий.
|
|
|
|
|
Apr 9 2009, 21:17
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

|
Цитата(aesok @ Apr 9 2009, 22:38)  Если readBits вызывается как функция Она вообще не вызывается если не давать команды CMD_READ_FUSE_ISP или CMD_READ_LOCK_ISP. Чтение локов и фузов действительно не работает, но оно меня толком и не интересует.
|
|
|
|
|
Apr 9 2009, 22:48
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(_Pasha @ Apr 8 2009, 08:34)  О чем Вы поете? Оно ж пишет rjmp в байтах, а не в словах! Логично, логично. Лажа с моей стороны имеет место быть  Proteus, кажется (может я не нашел?), и правда битность PC не учитывает: CODE .text:1003E3F4 OPCODE_rcall_CALL proc near .text:1003E3F4 arg_0 = word ptr 4 .text:1003E3F4 .text:1003E3F4 push edi .text:1003E3F5 mov edi, ecx .text:1003E3F7 mov eax, [edi] .text:1003E3F9 mov ecx, edi .text:1003E3FB add dword ptr [edi+3080h], 1 .text:1003E402 call dword ptr [eax+34h] .text:1003E405 movzx eax, [esp+4+arg_0] .text:1003E40A mov edx, eax .text:1003E40C and edx, 0FFFh .text:1003E412 test eax, 800h .text:1003E417 jz short loc_1003E41F .text:1003E419 add edx, 0FFFFF000h .text:1003E41F .text:1003E41F loc_1003E41F: .text:1003E41F add [edi+3080h], edx .text:1003E425 pop edi .text:1003E426 retn 4
.text:1003E42A OPCODE_rjmp_CALL proc near .text:1003E42A arg_0 = word ptr 4 .text:1003E42A .text:1003E42A movzx edx, word ptr [esp+4] .text:1003E42F mov eax, edx .text:1003E431 and eax, 0FFFh .text:1003E436 test edx, 800h .text:1003E43C jz short loc_1003E443 .text:1003E43E add eax, 0FFFFF000h .text:1003E443 .text:1003E443 loc_1003E443: .text:1003E443 mov edx, [ecx+3080h] .text:1003E449 lea eax, [eax+edx+1] .text:1003E44D mov [ecx+3080h], eax .text:1003E453 retn 4 Как временное решение (ежели без Proteus'а вообще никак) - делать патч (маскировать лишние биты).
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|