Перейти к содержанию
    

WinAVR криво собирает код...

абстрактному среднему писателю GCC лишь-бы непрерывно монстреющий Linux собирался и более ничего особо не надо

 

Плюс дофига. Меня тут уже тыкали носом в "жрите что дают" :(

 

Желание пользовать гнуся от этого совсем не прибавилось. Разочарования - добавилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, у меня теперь еще интересней проблема !

 

На работе, где стоит старый 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 гектар... сносить проблемматично. Че делать ? :smile3046:

Изменено пользователем manul78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и вот в последней версии заметил, что теперь генерируется именно SBI!

Первый WinAVR, с которым я начал серьезно работать - 20071221 уже без проблем делал sbi/cbi/sbic

Вы какой именно "старый" имеете ввиду - GCC 3 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

раньше, например, когда писалось 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 уже был снесён на всех компах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, а идущие в комплекте забудьте как страшный сон.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"старый" - это какой-то старый :) я всегда инсталлирую новые версии в одну и ту же папку WinAVR - так что память о версии старых стерта вместе с версиями :) но ведь это и не принципиально. стало лучше - это главное. хотя финты с тасовкой регистров порой изумляют :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и все-таки, почему никто из гуру не ответит на вопрос: как заставить работать опцию -mno-wrap? она не опознается как "родная", если передавать ее просто в командной строке avr-gcc и не производит никакого эффекта, если передать ее ассемблеру! а очень нужно избавиться от rjmp в проекте на atmega32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поиск в гугле по сообщению об ошибке очень помогает в таких случаях.

 

В комплекте WinAVR идет какая-то очень древняя версия утилит из msys, которую очень любит Eric Weddington. И вместе с этим набором из версии в версию WinAVR кочуют и все болячки той версии msys. На мои призывы к автору обновить эти утилиты был дан ответ - "у них нет нормального инсталятора, мне лень".

 

 

 

Сходите на сайт mingw32/msys и скачайте там самые свежие версии всех этих утилит. После чего используйте их со всеми версиями WinAVR, а идущие в комплекте забудьте как страшный сон.

 

Уважаемый Сергей ! Я даже не знаю как Вас благодарить... :laughing:

 

Самое интересное, что на "стационарном" компе и на "буке" были совершенно разные "занозы" !!!

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 И все ! Земля опять завертелась !!!

 

Жму руку как ПРОФЕССИОНАЛУ, заходящему сюда не "флудить" а помогать словом и делом !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я столкнулся с таким глюком: есть бутлоадер с эмуляцией 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);

Пробовал каждый раз на разных файлах, поэтому "вроде"...

BootLoader.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я столкнулся с таким глюком:

 

Вот ЭТО написано человеком который поленился прочитать документацию:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ЭТО написано человеком который поленился прочитать документацию:
Код не мой. Return взят из какого-то файла скачанного из ветки в этом форуме. Но этот код к вышеописанной проблеме отношения не имеет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот ЭТО написано человеком который поленился прочитать документацию:

 

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.

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если readBits вызывается как функция
Она вообще не вызывается если не давать команды CMD_READ_FUSE_ISP или CMD_READ_LOCK_ISP. Чтение локов и фузов действительно не работает, но оно меня толком и не интересует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О чем Вы поете? Оно ж пишет rjmp в байтах, а не в словах!
Логично, логично. Лажа с моей стороны имеет место быть :(

 

Proteus, кажется (может я не нашел?), и правда битность PC не учитывает:

.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'а вообще никак) - делать патч (маскировать лишние биты).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...