|
Вопрос по WINAVR |
|
|
|
 |
Ответов
|
Jun 21 2007, 14:08
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Вот решил переползти с CVAVR на WINAVR (проект текущий глючит ужасно в CVAVR - чем не повод :-) ) Поднял эту тему, дабы не плодить новую. WinAVR 20060421 И поток вопросов :-) Для пробы набросал кучку всякой фигни в функцию ... Код #include <avr/io.h> #include <avr/interrupt.h> #include <avr/eeprom.h> #include <inttypes.h> #include <util/delay.h>
#include "rzlds.h"
static Tpoint EEMEM points[MAX_POINT+1];
ISR (INT0_vect) { eeprom_write_byte(&points[0].h,01); }
int main(void) { unsigned char buf;
DDRD = 0x02; while(1){ buf++; _delay_ms(1000); PORTD ^= 0x02; }; //while } [/code] 1. Задержки. ставлю _delay_ms() при оптимизации "0" - код вырастает почти на 500 байт - многовато ... при опт. "s" - вырастает немного ... но задежки нет в любом варианте  Видать оптимизатор отработал на славу. Как задержки организовывать? (не говрите про таймеры и загрузку проца ... я в курсе - я с компилятором разобраться хочу) 2. Сборка проекта В makefile ("cтандартный") с дистрибутива добавляю еще один файлик Код # List C source files here. (C dependencies are automatically generated.) SRC = rzlds.c crc8.c В основной программе его функции нигде не использую ... а в hex код добавляется  Оптимизация "s" 3. ELF -> СOFF Просто лог ... Код Converting to AVR Extended COFF: rzlds.cof avr-objcopy --debugging --change-section-address .data-0x800000 --change-section -address .bss-0x800000 --change-section-address .noinit-0x800000 --change-sectio n-address .eeprom-0x810000 -O coff-ext-avr rzlds.elf rzlds.cof Warning: file C:/DOCUME~1/EWEDDI~1/LOCALS~1/Temp/ccsreaaa.s not found in symbol table, ignoring Warning: ignoring function __vectors() outside any compilation unit Warning: ignoring function __bad_interrupt() outside any compilation unit Не могу избавится от трех варнингов ... от первого я вообще в шоке - что он хочет (%TEMP% в пер. среды прописан короткий d:\temp) А второй итретий - о чем это? И как это убрать? Просьба :-) не гоните меня форум читать ... два дня все темы с упоминанием WinAVR читаю ... о _delay_ms() нашел упоминание, но без ответа  ... да и вообще ... хоть сколько-нить работающий кусок кода -- эт из форумских бесед :-)
|
|
|
|
|
Jun 21 2007, 15:43
|

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

|
1. Задержки. В более свежих версиях, кажется, уже добавили ругню через #warning про то, что при выключенной оптимизации будет совсем не то. Перед включением delay.h должна быть определена константа F_CPU (тактовая в герцах), иначе - опять предупреждение и определение её на 1000000. В документации на libc (какая там стандартная FIDO-шная такса на чтение доеументации вслух?) и в самом delay.h (поскольку дока doxygen-ом собирается) написано, что максимально допустимая задержка для _delay_ms равна приблизительно 262мс/тактовая_в_мегагерцах, все более длинные задержки будут отрабатываться как эта максимальная.
2. Сборка проекта Пока могу только порекомендовать не включать в проект то, что не нужно. Кажется, --relax ещё окончательно не отлажен.
3. ELF -> СOFF Не пользуюсь симуляцией. Кажется, новые авр-студии уже берут elf от новых avr-gcc
p.s. "Просьба :-) не гоните меня форум читать ... два дня все темы с упоминанием WinAVR читаю ... о _delay_ms() нашел упоминание"
Документацию надо читать. Документацию.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jun 21 2007, 19:12
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ReAl @ Jun 21 2007, 19:43)  2. Сборка проекта Пока могу только порекомендовать не включать в проект то, что не нужно. Кажется, --relax ещё окончательно не отлажен. --relax - не отвечает за удаление неиспользуемых функций, он отвечает за замену CALL/JMP на RCALL/RJMP. Анатолий.
|
|
|
|
|
Jun 22 2007, 06:08
|

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

|
Цитата(aesok @ Jun 21 2007, 22:12)  --relax - не отвечает за удаление неиспользуемых функций, он отвечает за замену CALL/JMP на RCALL/RJMP. Точно, это я как всегда спутал с прямым углом. За удаление функций отвечает --gc-sections при условии, что функции распиханы по отдельным секциям при помощи -ffunction-sections Всё равно оно ещё, кажется, недоделано. -ffunction-sections в компиляторе работает, а --gc-sections в линкере - нет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 5 2007, 18:04
|

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

|
Цитата(ReAl @ Jun 22 2007, 09:08)  Всё равно оно ещё, кажется, недоделано. -ffunction-sections в компиляторе работает, а --gc-sections в линкере - нет. Давно не проверял работу этих ключиков, оказывается (вот так оно мне нужно, значит  ). По кр. мере в двух самых свежих сборках WinAVR --gc-sections работает, незадействованные функции успешно выбрасывает (соответственно при -fdata-sections будет должно вышвыривать глоблаьные и static-переменные, на которые нет ссылок). Вероятно, заработало это где-то тогда, когда к обработчикам прерываний стали __attribute__((used)) цеплять.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 24 2007, 16:12
|

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

|
Цитата(ReAl @ Jul 5 2007, 21:04)  По кр. мере в двух самых свежих сборках WinAVR --gc-sections работает, незадействованные функции успешно выбрасывает (соответственно при -fdata-sections будет должно вышвыривать глоблаьные и static-переменные, на которые нет ссылок). Вероятно, заработало это где-то тогда, когда к обработчикам прерываний стали __attribute__((used)) цеплять. Вчера и я попробовал. Действительно выбрасывает. Даже те функции, которые с __attribute__((used)) описал. даже без -ffunction-sections. Пробовал и 20060421 и 20070525. Что же делать? Есть у меня одна функция, которая из отдельно скомпилированного загрузчика вызывается. И вторая проблема: то же самое, но с данными. -fdata-sections выкидывает массив, который нужно зарезервировать для функции из области загрузчика, т.е. скомпилированной отдельным проектом. Несмотря на наличие __attribute__((used)). Как бороться? Заводить фиктивные указатели на эти функцию и массив не хочу - некрасиво это. Еще один вопрос - как называется функция, с которой начинается выполнение (что в ENTRY() скрипта ld указывать)?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 25 2007, 21:40
|

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

|
Цитата(Сергей Борщ @ Oct 24 2007, 18:12)  Вчера и я попробовал. Действительно выбрасывает. Даже те функции, которые с __attribute__((used)) описал. даже без -ffunction-sections. Пробовал и 20060421 и 20070525. ... Заводить фиктивные указатели на эти функцию и массив не хочу - некрасиво это. Мда. Мрак. Бестолку фиктивный указатель... Сначала он выбрасывается "ввиду необращения", потом то, на что он указывал. Кстати, я пробовал с 20070525 --gc-sections без -ffunction-sections ничего не выбрасывает. А с -ffunction-sections - да, used не помогает. Почитал ещё - таки похоже used касается только компилятора и только на этапе компиляции файла. Линкеру никакой информации об этом аттрибуте не передаётся. Пока нарыл только то, что невызываемая ниоткуда функция не выбрасывается, если передать линкеру ключик -u/--undefined -Wl,-u,func_nameон применяется для принудительной линковки модуля из библиотеки по имени глобального символа, даже если на него нигде нет ссылки - эдакое ручное помещение символа в таблицу необходимых ссылок. Судя по описанию ключа - то же самое делается командой EXTERN в линкероном скрипте. После чего линкер считает это имя хоть кому-то да нужным и не выбрасывает по --gc-sections Цитата(Сергей Борщ @ Oct 24 2007, 18:12)  Еще один вопрос - как называется функция, с которой начинается выполнение (что в ENTRY() скрипта ld указывать)? В запускалке стандартной там вообще не функция, а идёт переход на weak метку __init, она в секции .init0, потом вслед за ней линкерным скриптом складываются секции вплоть до .init9, которая состоит из jmp main. А из init-секции в init-секцию переход не jmp/call, а просто "естественным путём". Т.е. если у себя завести функцию с именем __init, то по нулевому адресу будет поставлен jump (а не call) на неё и вся цепочка - инициализация указателя стека, обнуление __zero_reg__, инициализация .data, зачистка .bss, конструкторы С++ - пойдут лесом.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Oct 26 2007, 08:30
|

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

|
Цитата(ReAl @ Oct 26 2007, 00:40)  Пока нарыл только то, что невызываемая ниоткуда функция не выбрасывается, если передать линкеру ключик -u/--undefined Спасибо, использую. Непередача used линкеру - это как, бага или фича? Может надо сообщить авторам, чтоб поправили? Цитата(ReAl @ Oct 26 2007, 00:40)  В запускалке стандартной там вообще не функция, а идёт переход на weak метку __init, она в секции .init0, потом вслед за ней линкерным скриптом складываются секции вплоть до .init9, которая состоит из jmp main. А из init-секции в init-секцию переход не jmp/call, а просто "естественным путём". Т.е. ENTRY() не нужна? А по --gc-sections вся эта инициализация не выкинется однажды?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Karl Вопрос по WINAVR Apr 29 2005, 09:06 BorisRozentsvaig Цитата(Karl @ Apr 29 2005, 13:06)Как располож... Apr 29 2005, 11:06 Karl Цитата(BorisRozentsvaig @ Apr 29 2005, 16:06)... May 3 2005, 10:24  pulsar-17 Цитата(Karl @ May 3 2005, 13:24)А как же тогд... May 3 2005, 16:20   Karl Цитата(pulsar-17 @ May 3 2005, 21:20)Цит... May 4 2005, 12:31    Karl Реально функция func() располагается в памяти прог... May 4 2005, 13:21 SL@V@ Если в IAR-е то:
__no_init char mas[10] @0x200;
... Apr 29 2005, 11:07 pulsar-17 большие массивы данных я конвертировал:
avr-objco... May 3 2005, 17:42 pulsar-17 Как я понял переход происходит по адресу указанном... May 5 2005, 09:13 Karl Вы поняли правильно. Переход происходит именно по ... May 6 2005, 03:25 pulsar-17 Я проверил на версии 20050214.
За исключением лиш... May 6 2005, 05:08 Karl Огромная благодарность за помощь. Действительно, h... May 6 2005, 07:44  Karl Так никто не занет, как сделать, чтобы cof - файл ... May 18 2005, 03:42   BorisRozentsvaig Цитата(Karl @ May 18 2005, 07:42)Так никто не... May 18 2005, 14:27    Karl Попробовал elf - файл. В дизасемблере AVRStudio ув... May 19 2005, 10:04     BorisRozentsvaig Цитата(Karl @ May 19 2005, 14:04)Попробовал e... May 19 2005, 15:14     BorisRozentsvaig Цитата(Karl @ May 19 2005, 14:04)Попробовал e... May 19 2005, 15:16      Karl Я использую WinAVR-20050214, AVRStudio4.11 b406SP2... May 20 2005, 03:44       BorisRozentsvaig Цитата(Karl @ May 20 2005, 07:44)Я использую ... May 20 2005, 15:57        BorisRozentsvaig Так и есть. Проверил на своем проекте.
Если генери... May 20 2005, 16:15         Karl Цитата(BorisRozentsvaig @ May 20 2005, 21:15)... May 23 2005, 03:40          BorisRozentsvaig Цитата(Karl @ May 23 2005, 07:40)AVR- студио ... May 23 2005, 06:54 LViktor Подскажите где можно найти компилятор avr-gcc 4.х ... Aug 11 2005, 16:23        aesok Цитата(Сергей Борщ @ Oct 26 2007, 12:30) ... Oct 26 2007, 08:56         Сергей Борщ Цитата(aesok @ Oct 26 2007, 11:56) Не вык... Oct 26 2007, 12:03          aesok Цитата(Сергей Борщ @ Oct 26 2007, 16:03) ... Oct 26 2007, 12:20           Сергей Борщ Цитата(aesok @ Oct 26 2007, 15:20) Из опи... Oct 26 2007, 13:22            ReAl Цитата(Сергей Борщ @ Oct 26 2007, 15:22) ... Oct 26 2007, 19:20 AndryG Подведем промежуточные итоги:
1. известные на этап... Jun 22 2007, 08:35 ReAl Цитата(AndryG @ Jun 22 2007, 11:35) 1. из... Jun 22 2007, 14:37 AndryG повозился вчера с makefile от компилятора ...
доб... Jul 26 2007, 14:01 mdmitry Цитата(AndryG @ Jul 26 2007, 18:01) повоз... Jul 26 2007, 20:38 ReAl Цитата(AndryG @ Jul 26 2007, 16:01) повоз... Jul 27 2007, 07:24 AndryG У меня релиз апреля(вроде) 2006 года ... таргет оп... Jul 27 2007, 05:37 AndryG Хм! -mmcu вспоминается ... но почему ж тогда у... Jul 27 2007, 07:52 AndryG Почитал я ваши посты ... и поник ... как просто бы... Oct 26 2007, 10:17 firework Цитата(AndryG @ Oct 26 2007, 12:17) Почит... Oct 28 2007, 21:14  yvk Использую Winavr-20070525. При компиляции бутлоаде... Nov 1 2007, 14:32   Сергей Борщ Цитата(yvk @ Nov 1 2007, 17:32) на выходе... Nov 1 2007, 17:17    yvk Цитата(Сергей Борщ @ Nov 1 2007, 20:17) К... Nov 1 2007, 17:45     Сергей Борщ Цитата(yvk @ Nov 1 2007, 20:45) в авр сту... Nov 1 2007, 18:11      yvk Спасибо, помогло. Нужно было заменить .bootloader ... Nov 1 2007, 22:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|