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

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


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

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



Как расположить массив по определенному адресу в памяти программ? Что нужно сказать компилятору?
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 49)
BorisRozentsvaig
сообщение Apr 29 2005, 11:06
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ Apr 29 2005, 13:06)
Как расположить массив по определенному адресу в памяти программ? Что нужно сказать компилятору?
*


Думается, что стандартными средствами, никак. Все что можно делать с переменными в памяти программ см. pgmspace.h и http://users.rcn.com/rneswold/avr/c957.html#PROGMEM
Go to the top of the page
 
+Quote Post
SL@V@
сообщение Apr 29 2005, 11:07
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 30-03-05
Пользователь №: 3 806



Если в IAR-е то:

__no_init char mas[10] @0x200;

(массив mas[10] в озу по ардесу 0x200)
Go to the top of the page
 
+Quote Post
Karl
сообщение May 3 2005, 10:24
Сообщение #4


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

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



Цитата(BorisRozentsvaig @ Apr 29 2005, 16:06)
Цитата(Karl @ Apr 29 2005, 13:06)
Как расположить массив по определенному адресу в памяти программ? Что нужно сказать компилятору?
*


Думается, что стандартными средствами, никак. Все что можно делать с переменными в памяти программ см. pgmspace.h и http://users.rcn.com/rneswold/avr/c957.html#PROGMEM
*



Это не совсем то, что мне надо. Хм. А как же тогда программу - загрузчик в загрузочный сектор поместить?
Go to the top of the page
 
+Quote Post
pulsar-17
сообщение May 3 2005, 16:20
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



Цитата(Karl @ May 3 2005, 13:24)
А как же тогда программу - загрузчик в загрузочный сектор поместить?
*


Очень просто:

сам загрузчик:
BOOTLOADER_SECTION void func()
{

}

BOOTLOADER_SECTION определен:
#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))

в makefile надо пропиcать в параметрах линькера адрес секции:
-Wl,--section-start=.bootloader=0x1FE00

адрес может быть и другой в зависимости от фьюзов(смотри доку на контроллер)
Go to the top of the page
 
+Quote Post
pulsar-17
сообщение May 3 2005, 17:42
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



большие массивы данных я конвертировал:

avr-objcopy -I binary --change-addresses 0x1234 -O ihex infile outfile
infile - входной бинарный файл
outfile - выходной файл в формате ihex
вместо 0x1234 указать необходимый адрес

а затем загружал во флэш
Go to the top of the page
 
+Quote Post
Karl
сообщение May 4 2005, 12:31
Сообщение #7


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

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



Цитата(pulsar-17 @ May 3 2005, 21:20)
Цитата(Karl @ May 3 2005, 13:24)
А как же тогда программу - загрузчик в загрузочный сектор поместить?
*


Очень просто:

сам загрузчик:
BOOTLOADER_SECTION void func()
{

}

BOOTLOADER_SECTION определен:
#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))

в makefile надо пропиcать в параметрах линькера адрес секции:
-Wl,--section-start=.bootloader=0x1FE00

адрес может быть и другой в зависимости от фьюзов(смотри доку на контроллер)
*



Попробовал - по вызову функции func() происходит переход на нужное место (по указанному адресу). Только вот самой функции там нет sad.gif . Там вообще пусто.
Go to the top of the page
 
+Quote Post
Karl
сообщение May 4 2005, 13:21
Сообщение #8


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

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



Реально функция func() располагается в памяти программ там же, гд и была бы без BOOTLOADER_SECTION. Меняется только адрес, на который осуществляется переход после обращения к функции sad.gif
Go to the top of the page
 
+Quote Post
pulsar-17
сообщение May 5 2005, 09:13
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



Как я понял переход происходит по адресу указанному в ключе:
-Wl,--section-start=.bootloader=0x1FE00

Какой версией WinAVR Вы пользуетесь?

Если Вы можете пришлите Ваш makefile мне будет значительно легче вам помочь.
Go to the top of the page
 
+Quote Post
Karl
сообщение May 6 2005, 03:25
Сообщение #10


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

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



Вы поняли правильно. Переход происходит именно по указанному адресу.
Пользуюсь версией WinAVR-20040720. Позавчера скачал WinAVR-20050214 - результат тот же.
Прикрепленные файлы
Прикрепленный файл  Makefile.zip ( 1.67 килобайт ) Кол-во скачиваний: 120
 
Go to the top of the page
 
+Quote Post
pulsar-17
сообщение May 6 2005, 05:08
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



Я проверил на версии 20050214.

За исключением лишнего пробела в Makefile в строке 32 криминала нет.

Секция bootloader располагается по заданному адресу, код функции лежит именно там. Проверял по дизассемблеру и для полной достоверности по HEX-файлу.

Тест прилагаю.
В файле boot.c находится пример использования самопрограммирования из моих проектов.
Надеюсь Вам это поможет.
Прикрепленные файлы
Прикрепленный файл  TEST_AVR.rar ( 8.07 килобайт ) Кол-во скачиваний: 151
 
Go to the top of the page
 
+Quote Post
Karl
сообщение May 6 2005, 07:44
Сообщение #12


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

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



Огромная благодарность за помощь. Действительно, hex - файл собирается верно. Я попался на том, что проверял программу в симуляторе AvrStudio. А cof - файл собирается, похоже, не правильно smile.gif
Но если не сгенерить правильно cof - файл, то не получится отлаживать с JTAG? Нехорошо sad.gif
Go to the top of the page
 
+Quote Post
Karl
сообщение May 18 2005, 03:42
Сообщение #13


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

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



Так никто не занет, как сделать, чтобы cof - файл создавался правильным???
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 18 2005, 14:27
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ May 18 2005, 07:42)
Так никто не занет, как сделать, чтобы cof - файл создавался правильным???
*

В makefile добавь:

BIN = $(AVR)/bin/avr-objcopy
ELFCOF = $(BIN) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000

%.cof: %.elf
$(ELFCOF) -O coff-ext-avr $< $@
или
$(ELFCOF) -O coff-avr $< $@

Но, вообще-то, последняя AVR Studio прекрасно понимает формат elf.

Много информации по этому поводу можно найти на avrfreaks.net, например:
h_t_t_p://w_w_w.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=28815&highlight=elf+support
Go to the top of the page
 
+Quote Post
Karl
сообщение May 19 2005, 10:04
Сообщение #15


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

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



Попробовал elf - файл. В дизасемблере AVRStudio увидел следующее smile.gif :

@00000F80: boot_write_page
---- F:\Work\Tegran\V1\boot.c -----------------------------------------------------------
9: {
+00000F80: FFFF ??? Data or unknown opcode
No Source -----------------------------------------------------------------------------------
+00000F81: FFFF ??? Data or unknown opcode
+00000F82: FFFF ??? Data or unknown opcode
+00000F83: FFFF ??? Data or unknown opcode
+00000F84: FFFF ??? Data or unknown opcode
+00000F85: FFFF ??? Data or unknown opcode
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 19 2005, 15:14
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ May 19 2005, 14:04)
Попробовал elf - файл. В дизасемблере AVRStudio увидел следующее smile.gif :

@00000F80: boot_write_page
---- F:\Work\Tegran\V1\boot.c -----------------------------------------------------------
9:        {
+00000F80:  FFFF        ???                      Data or unknown opcode
No Source -----------------------------------------------------------------------------------
+00000F81:  FFFF        ???                      Data or unknown opcode
+00000F82:  FFFF        ???                      Data or unknown opcode
+00000F83:  FFFF        ???                      Data or unknown opcode
+00000F84:  FFFF        ???                      Data or unknown opcode
+00000F85:  FFFF        ???                      Data or unknown opcode
*


А ты генеришь файл в ELF/DRAFT-2 формате? AVR-studio поддерживает только его. Проверь makefile:

DEBUG = dwarf-2

CPFLAGS = ..... -g$(DEBUG) ...

Если ты брал Makefile из примеров, то этого достаточно.
Если писал сам, то замени CPFLAGS на значение, которое ты используешь для передачи параметров при вызове avr-gcc.
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 19 2005, 15:16
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ May 19 2005, 14:04)
Попробовал elf - файл. В дизасемблере AVRStudio увидел следующее smile.gif :
.....


Кстати, а какую версии WinAVR и AVR Studio ты используешь?
Go to the top of the page
 
+Quote Post
Karl
сообщение May 20 2005, 03:44
Сообщение #18


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

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



Я использую WinAVR-20050214, AVRStudio4.11 b406SP2. make файл генерил программой MFile. DEBUG = dwarf-2. Так и есть.
Прикрепленные файлы
Прикрепленный файл  test.rar ( 14.43 килобайт ) Кол-во скачиваний: 58
 
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 20 2005, 15:57
Сообщение #19


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ May 20 2005, 07:44)
Я использую WinAVR-20050214, AVRStudio4.11 b406SP2. make файл генерил программой MFile. DEBUG = dwarf-2. Так и есть.
*


Погоди. Ты в майкфайле пишешь:
LDFLAGS += --section-start=.bootloader=0x1f00
А функция boot_write_page у тебя как раз в бутлоадере:
...
BOOTLOADER_SECTION
void boot_write_page(unsigned long fptr, unsigned short *sptr)
...

Значит, ее начальный адрес должен быть старше 0x1F00, а в твоем дампе адреса с 0x0F80 начинаются...... ?????
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 20 2005, 16:15
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Так и есть. Проверил на своем проекте.
Если генерить elf и открывать в AVR-студио, то адрес процедуры бутлоадера определяется некорректно. С coff файлом все нормально.
Go to the top of the page
 
+Quote Post
Karl
сообщение May 23 2005, 03:40
Сообщение #21


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

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



Цитата(BorisRozentsvaig @ May 20 2005, 21:15)
Так и есть. Проверил на своем проекте.
Если генерить elf и открывать в AVR-студио, то адрес процедуры бутлоадера определяется некорректно. С coff файлом все нормально.
*


AVR- студио показывает адреса в словах, а в make - файле адрес указывается в байтах. Я так понял. 0x1f00/2=0хf80. А мой проектик запускал? Так же вместо кода одни 0xFF?
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение May 23 2005, 06:54
Сообщение #22


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(Karl @ May 23 2005, 07:40)
AVR- студио показывает адреса в словах, а в make - файле адрес указывается в байтах. Я так понял. 0x1f00/2=0хf80. А мой проектик запускал? Так же вместо кода одни 0xFF?
*



С твоим проектом тоже самое. Действительно, AVR-студио в окне dubug показывает адреса в словах, а в зависимости от типа файла (elf или coff), создаваемых WinAvr, адреса в окне watch показываются в словах или в байтах.
Если не лениво, попробуй откомпилировать приложенный демо-проект с avrfreaks.net - может там нормально будет бутлоадер отлаживаться?
Прикрепленные файлы
Прикрепленный файл  STK500_Protocol_v2_Bootloader.zip ( 28.64 килобайт ) Кол-во скачиваний: 74
 
Go to the top of the page
 
+Quote Post
LViktor
сообщение Aug 11 2005, 16:23
Сообщение #23





Группа: Новичок
Сообщений: 4
Регистрация: 17-07-05
Пользователь №: 6 854



Подскажите где можно найти компилятор avr-gcc 4.х для windows. И как можно прикрутить новую библиотеку avr-libc-1.2.5 к WinAVR-20050214. Только посылать на http://winavr.sourceforge.net/ нет необходимости.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jun 21 2007, 14:08
Сообщение #24


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

Группа: Свой
Сообщений: 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
Сообщение #25


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

Группа: Свой
Сообщений: 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
Сообщение #26


Знающий
****

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


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

Группа: Свой
Сообщений: 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
AndryG
сообщение Jun 22 2007, 08:35
Сообщение #28


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Подведем промежуточные итоги:
1. известные на этапе компиляции задержки делаем через _delay_loop[_2]() функции (можно удобный define сделать, дабы с тактовой сразу высчитывать)
Если задержки нужно вычислять в программе - таймер Вам в рки :-)
2. Нефиг, пока, лишние функции в свои файлы совать. Отсюда вопрос ... а как тогда используются "прилагаемые" хидеры ... там ведь куча функций описана, а линкуются только нужные? (тупой вопрос - надо идти читать документы ... видать с библиотек линкер нормально тянет только нужное)
3. ELF понимает и Студия и Протеус ... вот только в Протеусе (Студию не пробовал) половина строк кода стоит "не выполняемая" ... и на нулевой оптимизации тоже ... получается один шаг и половина программы выполнена sad.gif Вопрос открытый остается.

Еще вопросик. "Переменная" F_CPU определяется в makefile ... и она же нужна мне в моем исходнике. Если я определяю ее сам, то ругается, что идет переопределение, если вообще не определять, то кричит, что не знаю такого слова ? Как быть?

____
P.S.
Пользуясь случаем передаю свое огромное "спасибо, Real" за Ваш программатор. (надеюсь автором не ошибся :-) ) После того как я сжег c STK200/300 половину линий LPT-порта ... с Вашим программатором я неразлучен smile.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 22 2007, 14:37
Сообщение #29


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

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



Цитата(AndryG @ Jun 22 2007, 11:35) *
1. известные на этапе компиляции задержки делаем через _delay_loop[_2]() функции (можно удобный define сделать, дабы с тактовой сразу высчитывать)
Зачем самому делать?
_delay_us() и _delay_ms() из delay.h как раз представляют из себя комбинацию из "сразу высчитывать" и вызова _delay_loop1() и _delay_loop2() соответственно. Тактовую они берут по F_CPU. А при выключенной оптимизации проблемы именно потому, что "сразу высчитывание" без оптимизации не всё делается на этапе компиляции.

Цитата(AndryG @ Jun 22 2007, 11:35) *
2. ... видать с библиотек линкер нормально тянет только нужное
Именно так.

Цитата(AndryG @ Jun 22 2007, 11:35) *
Еще вопросик. "Переменная" F_CPU определяется в makefile ... и она же нужна мне в моем исходнике. Если я определяю ее сам, то ругается, что идет переопределение, если вообще не определять, то кричит, что не знаю такого слова
Не понял. У меня в makefile определяется, через -DF_CPU=$(F_CPU)UL передаётся gcc и через -o$(F_CPU)hz передаётся в avreal. При компиляции delay всё нормально.
Если F_CPU определять в исходниках, то это нужно делать не перед вызовом _delay_*, а перед включением delay.h.
Если сделать наоборот, то будет ругаться на переопределение, так как при отсутствии F_CPU во время разбора delay.h устанавливается F_CPU по умолчанию (я бы предпочёл вывал по #error "delay.h: F_CPU not defined").


p.s. автором не ошибся.


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


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

Группа: Свой
Сообщений: 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
AndryG
сообщение Jul 26 2007, 14:01
Сообщение #31


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



повозился вчера с makefile от компилятора ...
добавил в gcc -D__AVR_$(TARGET)__ -- теперь в коде можно вспоминать только хидер io.h , а "персональные" хидеры для контроллера теперь io.h вставит!

Люди, а не поделится ли кто описанием ключей запуска на winavr на русском языке?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jul 26 2007, 20:38
Сообщение #32


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(AndryG @ Jul 26 2007, 18:01) *
повозился вчера с makefile от компилятора ...
добавил в gcc -D__AVR_$(TARGET)__ -- теперь в коде можно вспоминать только хидер io.h , а "персональные" хидеры для контроллера теперь io.h вставит!

Люди, а не поделится ли кто описанием ключей запуска на winavr на русском языке?

По умолчанию TARGET задается в makefile и только там определяется.
Что понимается под ключами? Опции компилятора и линкера, так в makefile все определяется.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 27 2007, 05:37
Сообщение #33


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



У меня релиз апреля(вроде) 2006 года ... таргет определяется в makefile ... но если в исходник не ставить хидер конкретного чипа, то комилятор ругается, что не определен тип микроконтроллера ... после добавления вышеуказанного куска в makefile мы добавляем define, по котрому io.h вставит нужный хидер нужного контроллера.

Для многих это полная фигня, а для меня маленькая победа в освоении компилятора :-) вот и поделился радостью.

А ключи ... да я имел ввиду описание опций вызова компилятора и линкера. То что они определяются в makefile - это здорово, но все же они упоминаются в "базовом" makefile.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 27 2007, 07:24
Сообщение #34


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

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



Цитата(AndryG @ Jul 26 2007, 16:01) *
повозился вчера с makefile от компилятора ...
добавил в gcc -D__AVR_$(TARGET)__ -- теперь в коде можно вспоминать только хидер io.h , а "персональные" хидеры для контроллера теперь io.h вставит!

Люди, а не поделится ли кто описанием ключей запуска на winavr на русском языке?

Что-то я спросонок не пойму... Если есть ключ, например, -mmcu=atmega88 то gcc сам порождает и нужный __AVR_ATmega88__, и по мере необходимости всякие __AVR_ENHANCED__, __AVR_HAVE_LPMX__ и т.п. Причём я не помню времён, когда этого не было, т.е. когда мне не хватало комбинации -mmcu и io.h


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jul 27 2007, 07:52
Сообщение #35


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Хм! -mmcu вспоминается ... но почему ж тогда у меня ругается, что не определен контроллер ?

Будем колупать дальше ... спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 24 2007, 16:12
Сообщение #36


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #37


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

Группа: Свой
Сообщений: 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
Сообщение #38


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #39


Знающий
****

Группа: Участник
Сообщений: 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
AndryG
сообщение Oct 26 2007, 10:17
Сообщение #40


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Почитал я ваши посты ... и поник ... как просто было с CV ... а тут sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 26 2007, 12:03
Сообщение #41


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #42


Знающий
****

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #44


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

Группа: Свой
Сообщений: 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
firework
сообщение Oct 28 2007, 21:14
Сообщение #45


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 2-03-07
Из: Киев
Пользователь №: 25 818



Цитата(AndryG @ Oct 26 2007, 12:17) *
Почитал я ваши посты ... и поник ... как просто было с CV ... а тут sad.gif

У меня очень навороченный прект на CV (ATmega2561 + на параллельной шине ST16C554). Все работает как часы. Единственный смысл перехода на WINAVR вижу только в том, что он бесплатный. Не нужно каждый раз при появлении новых версий искать лекарство. В остольном CV рулит. Работаю с ним 3,5 года.


--------------------
Go to the top of the page
 
+Quote Post
yvk
сообщение Nov 1 2007, 14:32
Сообщение #46


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 28-02-06
Из: Kharkiv
Пользователь №: 14 770



Использую Winavr-20070525. При компиляции бутлоадера на выходе код, в котором сама программа расположена в области бутлоадера, но все инициализация лежит в младших адресах. Каким образом заставить линкер ложить секции .initN в секцию бутлоадера?


--------------------
Не плыви по течению. Не плыви против течения. Плыви туда, куда тебе нужно.
К.Прутков-инженер.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2007, 17:17
Сообщение #47


Гуру
******

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



Цитата(yvk @ Nov 1 2007, 17:32) *
на выходе код, в котором сама программа расположена в области бутлоадера, но все инициализация лежит в младших адресах.
Каким образом вы заставили его положить код в верхние адреса? От этого зависит что посоветовать. Я добавил в опции линкера -Wl,--section-start=.text=0x1800 и все кладется как надо.


--------------------
На любой вопрос даю любой ответ
"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
yvk
сообщение Nov 1 2007, 17:45
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 28-02-06
Из: Kharkiv
Пользователь №: 14 770



Цитата(Сергей Борщ @ Nov 1 2007, 20:17) *
Каким образом вы заставили его положить код в верхние адреса? От этого зависит что посоветовать. Я добавил в опции линкера -Wl,--section-start=.text=0x1800 и все кладется как надо.

именно таким образоми заставил
в авр студио (4.13.528) в Project Option\Memory Settings: Memory type - Flash; Name - .bootloader; Address - 0xf000;
сама прога BOOTLOADER_SECTION uint8_t main (void){...}
если стартовать с нулевого адреса, то все будет работать, но с фьюзом Boot Reset Enabled как минимум не будет инициализации стека

Сообщение отредактировал yvk - Nov 1 2007, 17:50


--------------------
Не плыви по течению. Не плыви против течения. Плыви туда, куда тебе нужно.
К.Прутков-инженер.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2007, 18:11
Сообщение #49


Гуру
******

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



Цитата(yvk @ Nov 1 2007, 20:45) *
в авр студио (4.13.528) в Project Option\Memory Settings: Memory type - Flash; Name - .bootloader; Address - 0xf000;
сама прога BOOTLOADER_SECTION uint8_t main (void){...}
если стартовать с нулевого адреса, то все будет работать, но с фьюзом Boot Reset Enabled как минимум не будет инициализации стека
Выкиньте из проги BOOTLOADER_SECTION, верните настройки Memory Settings как были, а в Project options->Custom Options->Linker options добавьте -Wl,--section-start=.text=0xF000. Не буду утверждать, что это единственно правильное решение, но так работает. Вы же не собираетесь в одном проекте собирать и приложение и загрузчик?
А еще можно скопировать из AVR/LIB/LDSCRIPTS в папку проекта скрипт от вашего процессора, отредактировать в нем размещение (раздел MEMORY в самом начале) и подключить этот скрипт через ключ линкера -Wl,-T,имя скрипта


--------------------
На любой вопрос даю любой ответ
"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
yvk
сообщение Nov 1 2007, 22:11
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 28-02-06
Из: Kharkiv
Пользователь №: 14 770



Спасибо, помогло. Нужно было заменить .bootloader на .text


--------------------
Не плыви по течению. Не плыви против течения. Плыви туда, куда тебе нужно.
К.Прутков-инженер.
Go to the top of the page
 
+Quote Post

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

 


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


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