реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> WinAVR криво собирает код...
Rst7
сообщение Apr 8 2009, 20:12
Сообщение #31


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


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

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
manul78
сообщение Apr 8 2009, 22:06
Сообщение #32


Местный
***

Группа: Участник
Сообщений: 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 гектар... сносить проблемматично. Че делать ? smile3046.gif

Сообщение отредактировал manul78 - Apr 8 2009, 22:10


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 9 2009, 05:57
Сообщение #33


Профессионал
*****

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



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

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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 9 2009, 06:17
Сообщение #34


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ARV @ Apr 9 2009, 08:57) *
и вот в последней версии заметил, что теперь генерируется именно SBI!

Первый WinAVR, с которым я начал серьезно работать - 20071221 уже без проблем делал sbi/cbi/sbic
Вы какой именно "старый" имеете ввиду - GCC 3 ?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 9 2009, 07:29
Сообщение #35


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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 уже был снесён на всех компах.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 9 2009, 07:41
Сообщение #36


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 9 2009, 07:42
Сообщение #37


Профессионал
*****

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 9 2009, 09:57
Сообщение #38


Профессионал
*****

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



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


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
manul78
сообщение Apr 9 2009, 16:56
Сообщение #39


Местный
***

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



Цитата(Сергей Борщ @ Apr 9 2009, 11:41) *
Поиск в гугле по сообщению об ошибке очень помогает в таких случаях.

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



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


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

Самое интересное, что на "стационарном" компе и на "буке" были совершенно разные "занозы" !!!
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 И все ! Земля опять завертелась !!!

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


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение Apr 9 2009, 18:45
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 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);
Пробовал каждый раз на разных файлах, поэтому "вроде"...
Прикрепленные файлы
Прикрепленный файл  BootLoader.zip ( 20.45 килобайт ) Кол-во скачиваний: 19
 
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 9 2009, 19:32
Сообщение #41


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение Apr 9 2009, 20:06
Сообщение #42


Участник
*

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



Цитата(aesok @ Apr 9 2009, 21:32) *
Вот ЭТО написано человеком который поленился прочитать документацию:
Код не мой. Return взят из какого-то файла скачанного из ветки в этом форуме. Но этот код к вышеописанной проблеме отношения не имеет.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 9 2009, 20:38
Сообщение #43


Знающий
****

Группа: Участник
Сообщений: 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.

Анатолий.
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение Apr 9 2009, 21:17
Сообщение #44


Участник
*

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



Цитата(aesok @ Apr 9 2009, 22:38) *
Если readBits вызывается как функция
Она вообще не вызывается если не давать команды CMD_READ_FUSE_ISP или CMD_READ_LOCK_ISP. Чтение локов и фузов действительно не работает, но оно меня толком и не интересует.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Apr 9 2009, 22:48
Сообщение #45


Чайник, 1 литр
****

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



Цитата(_Pasha @ Apr 8 2009, 08:34) *
О чем Вы поете? Оно ж пишет rjmp в байтах, а не в словах!
Логично, логично. Лажа с моей стороны имеет место быть sad.gif

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'а вообще никак) - делать патч (маскировать лишние биты).
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016