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

 
 
> Помогите впихнуть невпихуемое, резервы флеш-памяти
alux
сообщение Jun 11 2007, 11:23
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Размер программы превышает на 25 байт допустимой. Выжал из программы все, что смог. Рекомендации из апнота AVR035 прочитал. Можна ли как-то использовать неиспользованные вектора прерываний? В xcl-файле убрал:
/* Fill unused interrupt vector's with RETI */
//-H1895
//-h(CODE)0-_..X_INTVEC_SIZE
Не помогло. Пробовал уменьшить
-D_..X_INTVEC_SIZE=34 /* 26 Interrupt vectors * 2 bytes each */
до 30, если меньше выдает ошибку. Еще в программе используется 20 глобальных переменных. Пробовал объединять в структуры. Дало выигрыш аж в 4 байта. Может еще будут какие предложения? Может где-то в настройках стека или еще что... МК - мега48.

Сообщение отредактировал alux - Jun 11 2007, 11:26
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
slog
сообщение Jun 11 2007, 11:28
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



Ну для начала "Историю одного байта" прочти.
http://www.caxapa.ru/lib/1byte.html
А потом садись оптимизировать код. Листинг ассемблерный поможет. В листинге линкера есть информация о том сколько какая функция занимает. С самых жирных и начинай. Уверен 100% что 25 байт ужать можно. Какой размер программы-то? И какие функции самые жирные?


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 11 2007, 12:34
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(slog @ Jun 11 2007, 14:28) *
Ну для начала "Историю одного байта" прочти.

Очень интересная история. Правда. Очень понравилась. У меня получилось почти как в рассказе. Правда еще один байт остался в запасе smile.gif. Выкинул проверку источника сброса и разместил три глобальные переменные в регистрах.
Самая ресурсоемкая функция - формула с применением деления и корня квадратного. Использую из math.h.
А что на счет использования неиспользуемых векторов прерывания?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 11 2007, 12:41
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Можно подправить cstartup.s90 и повыкидывать из него то, что не нужно, но этого явно не хватит.
Помимо стандартных дя IAR компилятора методов оптимизации можно применить опцию мультифайловой оптимизации -mfc. Об этом написано в /avr/doc/manuals.htm
Go to the top of the page
 
+Quote Post
slog
сообщение Jun 11 2007, 13:30
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



Цитата(alux @ Jun 11 2007, 16:34) *
Самая ресурсоемкая функция - формула с применением деления и корня квадратного. Использую из math.h.
А что на счет использования неиспользуемых векторов прерывания?

Если у тебя не используется вообще ни одного прерывания, тогда может и сэкономишь чего. А делишь и корни извлекаешь случаем не из float? Если из него, то очень желательно заменить на long обычно это возможно, если получится, можно очень сильно сэкономить. Я недавно сэкономил 2,8кб просто заменив float powf(float, float) на float * float. smile.gif


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 11 2007, 14:19
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(slog @ Jun 11 2007, 16:30) *
Если у тебя не используется вообще ни одного прерывания, тогда может и сэкономишь чего.

Т.е. если хотя бы одно прерывание используется , то на адреса векторов прерываний можно не претендовать?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 11 2007, 14:42
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(alux @ Jun 11 2007, 17:19) *
Т.е. если хотя бы одно прерывание используется , то на адреса векторов прерываний можно не претендовать?

Не на все, а только от нуля до используемого вектора включительно.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 11 2007, 15:18
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(IgorKossak @ Jun 11 2007, 17:42) *
Не на все, а только от нуля до используемого вектора включительно.

Если у меня используется прерывание АЦП, то могу окупировать 4 байта? А что для этого нужно сделать?
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 11 2007, 17:56
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(alux @ Jun 11 2007, 15:23) *
Еще в программе используется 20 глобальных переменных. Пробовал объединять в структуры. Дало выигрыш аж в 4 байта. Может еще будут какие предложения? Может где-то в настройках стека или еще что... МК - мега48.

Так у вас в каком сегменте памяти не хватает? Во флеше или SRAM, переменные то в SRAM хранятья.
А тут в основном обсуждалось как вектора прерываний освободить, но они во флеше и переменные там не разместить.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 11 2007, 18:50
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(KRS @ Jun 11 2007, 20:56) *
Так у вас в каком сегменте памяти не хватает? Во флеше или SRAM, переменные то в SRAM хранятья.
А тут в основном обсуждалось как вектора прерываний освободить, но они во флеше и переменные там не разместить.

Да, флеша не хватает. С переменными я погорячился. Так как мне заполнить пространство кода до вектора прерывания? У меня используется два прерывания: OVF0(0x20) и ADC(0x2A) . Как раз 30 байт спасут "отца русской демократии" smile.gif
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 11 2007, 19:51
Сообщение #11


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(alux @ Jun 11 2007, 22:50) *
Да, флеша не хватает. С переменными я погорячился. Так как мне заполнить пространство кода до вектора прерывания? У меня используется два прерывания: OVF0(0x20) и ADC(0x2A) . Как раз 30 байт спасут "отца русской демократии" smile.gif

Как тут уже говорили можно переписать cstartup. Причем если писать на asm то можно по адресу 0 расположить не сразу rjmp, а 15 инструкций и 16ая rjmp (32 байта свобдно).
Дальше пойдет обработчик OVF0, если он на asm то можно 4 инструкции + rjmp.
Потом разместить обработчик ADC целиком.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 12 2007, 07:26
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(alux @ Jun 11 2007, 18:18) *
Если у меня используется прерывание АЦП, то могу окупировать 4 байта? А что для этого нужно сделать?

Подправить командный файл линкера, но не так как Вы это уже делали в плане количества векторов.
В опциях -Z(CODE) диапазоны адресов указать надо от 0, а не от INTVEC_SIZE.
Это более универсально, чем править cstartup на ассемблере, но менее экономично по высвобождаемой памяти.
Кроме того, если у Вас не предусмотрен возврат из функции main() (exit), в cstartup можно удалить всё, что после вызова main, а вызов main заменить на jmp. Да и саму main() можно определить как __task int main(), чтобы она не сохраняла и не восстанавливала регистры в начале и в конце.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 12 2007, 07:53
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(IgorKossak @ Jun 12 2007, 10:26) *
Подправить командный файл линкера, но не так как Вы это уже делали в плане количества векторов.
В опциях -Z(CODE) диапазоны адресов указать надо от 0, а не от INTVEC_SIZE.


/* Code memory */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)
-Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END

Что здесь необходимо изменить?
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 12 2007, 09:06
Сообщение #14


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(alux @ Jun 12 2007, 11:53) *
/* Code memory */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)
-Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END

Что здесь необходимо изменить?

Не используется послдение 4 вектора поэтому
/* Code memory */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-9)
-Z(CODE)CODE=(_..X_INTVEC_SIZE-8)-_..X_FLASH_END

Но это даст только 8 байт.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 12 2007, 10:22
Сообщение #15


Гуру
******

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



Цитата(KRS @ Jun 12 2007, 12:06) *
Не используется послдение 4 вектора поэтому
/* Code memory */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-9)
-Z(CODE)CODE=(_..X_INTVEC_SIZE-8)-_..X_FLASH_END

Но это даст только 8 байт.
Странные вы люди. Линкер сам знает, сколько памяти он занял при размещении предыдущих сегментов и следующие сегменты размещаетс с первого свободного в указанном диапазоне, так зачем вы ему принудительно диапазон обрезаете? Размещаются сегменты в том порядке, в котором перечислены в .xcl
Код
/* Code memory */
-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE - 1)
-Z(CODE)CODE=0-_..X_FLASH_END
Все. Сколько надо - он возьмет под вектора и дальше пойдет код. Можете пользовать в любом проекте, независимо от количества используемых векторов


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 15:58
Рейтинг@Mail.ru


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