|
Помогите впихнуть невпихуемое, резервы флеш-памяти |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jun 11 2007, 11:28
|
Знающий
   
Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489

|
Ну для начала "Историю одного байта" прочти. http://www.caxapa.ru/lib/1byte.htmlА потом садись оптимизировать код. Листинг ассемблерный поможет. В листинге линкера есть информация о том сколько какая функция занимает. С самых жирных и начинай. Уверен 100% что 25 байт ужать можно. Какой размер программы-то? И какие функции самые жирные?
--------------------
В действительности всё не так, как на самом деле.
|
|
|
|
|
Jun 11 2007, 12:34
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(slog @ Jun 11 2007, 14:28)  Ну для начала "Историю одного байта" прочти. Очень интересная история. Правда. Очень понравилась. У меня получилось почти как в рассказе. Правда еще один байт остался в запасе  . Выкинул проверку источника сброса и разместил три глобальные переменные в регистрах. Самая ресурсоемкая функция - формула с применением деления и корня квадратного. Использую из math.h. А что на счет использования неиспользуемых векторов прерывания?
|
|
|
|
|
Jun 12 2007, 07:26
|

Шаман
     
Группа: Модераторы
Сообщений: 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(), чтобы она не сохраняла и не восстанавливала регистры в начале и в конце.
|
|
|
|
|
Jun 12 2007, 07:53
|
Знающий
   
Группа: Свой
Сообщений: 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 Что здесь необходимо изменить?
|
|
|
|
|
Jun 12 2007, 09:06
|

Профессионал
    
Группа: Модераторы
Сообщений: 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 байт.
|
|
|
|
|
Jun 12 2007, 10:22
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|