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

 
 
> Вопрос по WINAVR
Karl
сообщение Apr 29 2005, 09:06
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Как расположить массив по определенному адресу в памяти программ? Что нужно сказать компилятору?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndryG
сообщение Jun 21 2007, 14:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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" - вырастает немного ... но задежки нет в любом варианте sad.gif Видать оптимизатор отработал на славу.
Как задержки организовывать? (не говрите про таймеры и загрузку проца ... я в курсе - я с компилятором разобраться хочу)

2. Сборка проекта
В makefile ("cтандартный") с дистрибутива добавляю еще один файлик
Код
# List C source files here. (C dependencies are automatically generated.)
SRC = rzlds.c crc8.c

В основной программе его функции нигде не использую ... а в hex код добавляется sad.gif Оптимизация "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() нашел упоминание, но без ответа sad.gif ... да и вообще ... хоть сколько-нить работающий кусок кода -- эт из форумских бесед :-)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 21 2007, 15:43
Сообщение #3


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

Группа: Свой
Сообщений: 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() нашел упоминание"

Документацию надо читать. Документацию.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 21 2007, 19:12
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ReAl @ Jun 21 2007, 19:43) *
2. Сборка проекта
Пока могу только порекомендовать не включать в проект то, что не нужно. Кажется, --relax ещё окончательно не отлажен.


--relax - не отвечает за удаление неиспользуемых функций, он отвечает за замену CALL/JMP на RCALL/RJMP.

Анатолий.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 22 2007, 06:08
Сообщение #5


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

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 5 2007, 18:04
Сообщение #6


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

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



Цитата(ReAl @ Jun 22 2007, 09:08) *
Всё равно оно ещё, кажется, недоделано. -ffunction-sections в компиляторе работает, а --gc-sections в линкере - нет.

Давно не проверял работу этих ключиков, оказывается (вот так оно мне нужно, значит smile.gif ).
По кр. мере в двух самых свежих сборках WinAVR --gc-sections работает, незадействованные функции успешно выбрасывает (соответственно при -fdata-sections будет должно вышвыривать глоблаьные и static-переменные, на которые нет ссылок).
Вероятно, заработало это где-то тогда, когда к обработчикам прерываний стали __attribute__((used)) цеплять.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 24 2007, 16:12
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 25 2007, 21:40
Сообщение #8


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

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


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


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
aesok
сообщение Oct 26 2007, 08:56
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Сергей Борщ @ Oct 26 2007, 12:30) *
А по --gc-sections вся эта инициализация не выкинется однажды?


Не выкиниться, все стандартные имена (vectors, initX, и.т.д.) в ld скрипте начиня с версии binutils 2.17 помпомечены атрибутом KEEP (...).

В версии 2.16 (WinAVR-2006..) еще не помечены, и по этой причине опции "-ffunction-sections" и "-fdata-sections" не работают.

Анатолий.

Сообщение отредактировал aesok - Oct 26 2007, 08:59
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 26 2007, 12:03
Сообщение #11


Гуру
******

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



Цитата(aesok @ Oct 26 2007, 11:56) *
Не выкиниться, все стандартные имена (vectors, initX, и.т.д.) в ld скрипте начиня с версии binutils 2.17 помпомечены атрибутом KEEP (...).
Вот оно! Я клал свою функцию и массив в отдельные секции принудительно. Сделал в скрипте этим секциям KEEP() и все получилось. Спасибо!!! Остался открытым вопрос - то, что компилятор не передает линкеру атрибут used - это бага или так и должно быть?

Цитата(AndryG @ Oct 26 2007, 13:17) *
Почитал я ваши посты ... и поник ... как просто было с CV ... а тут sad.gif
Сложности возникают при попытке сделать что-то нетривиальное - "чесать левое ухо правой ногой". Поверьте, я писал аналогичную программу в CV - знали бы вы сколько времени было потрачено, чтобы заставить его разместить ту самую функцию и тот самый массив по нужным мне адресам, и через какую ж.. это в конце-концов получилось реализовать. Так что зря пугаетесть - с WinAVR у вас могут быть трудности в начале, зато потом гладкий полет, с CV будете иметь с точностью до наоборот - сначала легкий старт, потом какое-то время полет, потом большие трудности (если, конечно, ваши программы будут развиваться).
После того, как подружили WinAVR и AVRStudio проблем с WinAVR нет даже в начале. В этой связке сложности начнутся, если захотите использовать С++. Плагин пока почему-то не позволяет подключать плюсовые файлы. Но есть альтернатива в виде Eclipse - как среда разработки гораздо удобнее студии, студию можно пользовать только как симулятор.


--------------------
На любой вопрос даю любой ответ
"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
aesok
сообщение Oct 26 2007, 12:20
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Сергей Борщ @ Oct 26 2007, 16:03) *
Вот оно! Я клал свою функцию и массив в отдельные секции принудительно. Сделал в скрипте этим секциям KEEP() и все получилось. Спасибо!!! Остался открытым вопрос - то, что компилятор не передает линкеру атрибут used - это бага или так и должно быть?


Из описания атрибута used следует что код функции должен быть в объектном файле, но ничего не говориться о том должен ли линкер добавить секцию где находиться этот код в исполняемый файл.

Анатолий.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 26 2007, 13:22
Сообщение #13


Гуру
******

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



Цитата(aesok @ Oct 26 2007, 15:20) *
Из описания атрибута used следует что код функции должен быть в объектном файле, но ничего не говориться о том должен ли линкер добавить секцию где находиться этот код в исполняемый файл.
Честно говоря я описание аттрибутов читаю здесь и там сказано просто:
Цитата
means that code must be emitted for the function even if it appears that the function is not referenced
И тут нет деления на объектный/исполняемый код. Компилятор-то все равно в объектник складывает все, и используемое и нет. А уже линкер собирает только нужное. Вот я и в непонимании нахожусь... Мне кажется, что именно линкер должен получать и использовать used. Иначе я не вижу смысла в used. Поправьте, если я не прав.


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Oct 26 2007, 19:20
Сообщение #14


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

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



Цитата(Сергей Борщ @ Oct 26 2007, 15:22) *
и там сказано просто:
means that code must be emitted for the function even if it appears that the function is not referenced
И тут нет деления на объектный/исполняемый код. Компилятор-то все равно в объектник складывает все, и используемое и нет. А уже линкер собирает только нужное. Вот я и в непонимании нахожусь...
Ну вот прочтя это я и решил, что такуи used относится только к компиляции файла - будет сгенерировано и окажется в объектнике. А дальше как линкер на душу положит. Хотя сначала мне казалось, что должно бы и до линкера дойти. Но нет - так нет, что тут скажешь, способ нашёлся, и то хорошо. Хотя какой-нибудь __attribute__((force_linking)) не помешал бы smile.gif

Цитата(Сергей Борщ @ Oct 26 2007, 15:22) *
Иначе я не вижу смысла в used. Поправьте, если я не прав.
Ну, как минимум один вариант использования я нашёл
Код
static void init(void) __attrinbte__((section(".init5"),naked,used));
static void init(void)
{
   ...
}

Это инициализация модуля, которая линкуется автоматически, если модуль (файл) подключен
- нет риска забыть в начале main() забыть вызвать какой-то из множества init
- размещением в "правильной" секции можно обеспечить выполнение этой инициализации, например, до выполнения каких-либо конструкторов, или до инициализации .data/очистки .bss (если в init открывается доступ к памяти на внешней шине).
Благодаря used помещается в объектный файл, иначе невызванная static-функиця удалится ещё компилятором. Т.е. used даёт возможность тут использовать static, благодаря чему спрятать эту точку входа от доступа снаружи.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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


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

 


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


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