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

 
 
> Как в WinAVR не создавать таблицу векторов?
Drunya
сообщение May 28 2011, 11:14
Сообщение #1





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



Можно ли какой-то опцией в WinAVR отключить генерацию таблицы векторов прерываний? За ненадобностью, не используются они у меня. Памяти в тиньке и так всего 1К слов...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение May 28 2011, 15:41
Сообщение #2


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

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



Неправильные дебри. В другие надо было лезть.

-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
Если не нужно инициализировать стаические переменные, то тоже почистить ненужное.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Drunya
сообщение May 28 2011, 17:45
Сообщение #3





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



Большое спасибо за такой большой ответ! Занавес приоткрыт, появляется много вопросов 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.

Сообщение отредактировал Drunya - May 28 2011, 17:16
Go to the top of the page
 
+Quote Post



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

 


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


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