Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в WinAVR не создавать таблицу векторов?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Drunya
Можно ли какой-то опцией в WinAVR отключить генерацию таблицы векторов прерываний? За ненадобностью, не используются они у меня. Памяти в тиньке и так всего 1К слов...
Spider
Боюсь, что таблица прерываний это не прихоть WinAVR, а неотъемлимая часть структуры прошивки проца. Так, что ИМХО нельзя.
Drunya
Ну почему же неотъемлемая, вполне можно и без нее.

Порылся я в дебрях документации на GCC и в разделе AVR Options нашел опции -mno-interrupt (отключение совместимости кода с прерываниями) и -mno-tablejump (не генерировать таблицу переходов). Однако никакого эффекта они не дают. Вопрос - почему?
В CodeVision, кстати, это дело отключается.
ReAl
Неправильные дебри. В другие надо было лезть.

-mno-interrupt говорит С-компилятору, что прерываний в системе нет, поэтому ему не нужно их сохранять/запрещать/восстанавливать при операциях с указателем стека

-mno-tablejump говорит С-компилятору не использовать таблицы переходов для реализации switch

А нужно не давать линкеру на линковку запускалку (gcrt), которая шьёт таблицу векторов по умолчанию и ещё всякое. Делается ключикм -nostdlib, при котором gcc от себя линкеру ключи библиотек не ставит.

Код
.nolist
#define __SFR_OFFSET 0
#include <avr/io.h>
.list

        .text
main:
        ser     r16
        out     DDRB, r16
1:
        inc     r16
        out     PORTB, r16
        rjmp 1b

     ; разместил после main просто для того, чтобы показать, что .vectors
     ; линекром всё равно ставится первой в начале флеша
        .section        .vectors,"ax",@progbits
start:
        rjmp main

        .end
avr-gcc -nostdlib -mmcu=atmega8 t.S -o t.elf
avr-objdump -d t.elf

Код
t.elf:     file format elf32-avr
Disassembly of section .text:

00000000 <start>:
   0:    00 c0           rjmp    .+0    ; 0x2 <__ctors_end>

; на это имя не обращать внимания, оно у линкера прописано в скрипте, дизасм его посчитал важнее
00000002 <__ctors_end>:
   2:    0f ef           ldi    r16, 0xFF; 255
   4:    07 bb           out    0x17, r16; 23
   6:    03 95           inc    r16
   8:    08 bb           out    0x18, r16; 24
   a:    fd cf           rjmp    .-6    ; 0x6 <__ctors_end+0x4>

Если пишете на С, то библиотеки нужны.
Вероятно, будет достаточно сделать асмовый файлик с вон тем .vectors (добавить строку .global main) и добавить его в проект, в ключи линкеру добавить -lgcc -lc для подключения стандартных библиотек. -mno-interrupt будет плезен для сокращения кода.

---------------------
Не-а, соврал...
Надо ведь остальную часть запускающего кода заставить работать (обнуление __zero_reg__, инициализация статических данных, обнуление .bss, инициализация стека). Так что в .vectors надо ставить не rjmp main, а переход на нужную часть запускалки.
Лучше всего взять иcходники gcrt1.S из avr-libc (линк download в самом низу страницы) и допилить его до нужного состояния путём оставления в секции .vectors только строки XJMP __init
Если не нужно инициализировать стаические переменные, то тоже почистить ненужное.
Drunya
Большое спасибо за такой большой ответ! Занавес приоткрыт, появляется много вопросов sm.gif :

Цитата(ReAl @ May 28 2011, 18:41) *
нужно не давать линкеру на линковку запускалку (gcrt)
Что такое "запускалка (gcrt)"и как ее не давать?

Цитата(ReAl @ May 28 2011, 18:41) *
Если пишете на С, то библиотеки нужны.
Вероятно, будет достаточно сделать асмовый файлик с вон тем .vectors (добавить строку .global main) и добавить его в проект, в ключи линкеру добавить -lgcc -lc для подключения стандартных библиотек.
Пишу на С, иначе зачем оно мне все?sm.gif
1) Куда добавить .vectors и .global main?
2) Проверил, с ключом -nostdlib пустая программа void main (void){while (1);} занимает 2 байта. Нету, как раньше, ни векторов прерываний (ура! sm.gif ), ни инициализации стека и __zero_reg__ (и, вероятно, глобальных переменных, если бы были). sad.gif Значит, нужно добавить этот кусок самостоятельно в .init2, я правильно понимаю?
3) Значит ли, что с ключом -nostdlib линкер не будет проводить никаких манипуляций с секциями (.bss, .text), в том числе и __init() и _exit()?
И вообще, в каких источниках можно про это все почитать?

upd
О, пока я тут ковырялся, ReAl свой пост удлиннилsm.gif

Цитата(ReAL)
Не-а, соврал...
Надо ведь остальную часть запускающего кода заставить работать (обнуление __zero_reg__, инициализация статических данных, обнуление .bss, инициализация стека). Так что в .vectors надо ставить не rjmp main, а переход на нужную часть запускалки.
Лучше всего взять иcходники gcrt1.S из avr-libc (линк download в самом низу страницы) и допилить его до нужного состояния путём оставления в секции .vectors только строки XJMP __init
Если не нужно инициализировать стаические переменные, то тоже почистить ненужное.

Короче, вижу без 100 грамов здесь не разобраться. Очень не хотелось бы исходники avr-libc "пилить".
В общем, если не хотим таблицу векторов - юзаем для линковки -nostdlib и самостоятельно заботимся об .initX и .finitX. Я правильно понимаю?



Вот еще что нашел: http://caxapa.ru/210419.html?todo=full Там тоже советуют поправить gcrt1.S.
demiurg_spb
можно лишь поправить скрипт линкера.
Изучите прикреплённые файлики.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.