|
|
  |
100 байт не хватает |
|
|
|
Dec 25 2008, 20:25
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
В общем, называется "приплыли", допрограммировались - бутлодырь перестал вмещаться в размер бутсекции, т.е. в 2k. Последним делом добавлено нечто такое: Код void Bus_transmit_packet(uint8 aStatus) { uint16 vCrc;
Bus_transmit_byte(Slp_packet_end); Bus_transmit_byte(Slp_packet_end); Bus_transmit_byte(Slp_sysdev_program | Slp_response_mask); // vCrc = vxl_get_crc16(Vxl_crc_ccitt_initial_value, Slp_sysdev_program | Slp_response_mask); Bus_staff_n_transmit_byte(aStatus); vCrc = vxl_get_crc16(0x7976, aStatus); Bus_staff_n_transmit_byte(vCrc >> 8); Bus_staff_n_transmit_byte(vCrc & 0xFF); Bus_transmit_byte(Slp_packet_end); } Что занимает примерно 60 байт. Предварительное заполнение массива и передача массива хоть и напрашивалась явно, но почти ничего не изменила или даже хуже. Однако, где бы наскрести еще сотню байт ? (таблица векторов еще не затронута, как и секции инициализации/финализации) Поделитесь, pls, примером оптимизации - сам я боюсь все порушить и грохнуть что-либо нужное. M88, GCC(WinAVR-20060421), cкрипты линкера от WinAVR-20081205
Сообщение отредактировал Огурцов - Dec 25 2008, 20:26
|
|
|
|
|
Dec 25 2008, 22:30
|

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

|
Тьху, у меги88 и 168 одинаковые размеры бут-секции. Цитата(SasaVitebsk @ Dec 26 2008, 00:17)  1) выделил несколько регистров (у меня их резервирование практически не влияло на размер выходного файла) 2) Расположил там переменные, к которым максимально часто обращаюсь и объявил их глобальными расположенными в регистрах. 2а) В GPIOR0 можно разместить восемь битовых флагов с коротким доступом на установку/сброс/проверку. 2б) В GPIOR1, GPIOR2 можно разместить две байтовых переменных с доступом in/out, более коротким, чем lds/sts 2в) Гулять так гулять - в EEARL/EEDR а то и в неиспользуемых лоадером таймерных регистрах OCR0A/OCR0B/TCNT0 тоже можно что-то поскладывать.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 26 2008, 07:02
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Bus_transmit_byte и Bus_staff_n_transmit_byte это функции или макросы? Если функции то в зависимости от их размера добавте им атрибуты noinline или always_inline. Код Bus_staff_n_transmit_byte(vCrc >> 8); Bus_staff_n_transmit_byte(vCrc & 0xFF); avr-gcc генерирует плохой код для операций сдвига, используйте union-ны для выделения байтов из int и long. Код union { uint16_t word; struct { uint8_t lo; uint8_t hi; } byte; } x;
x.byte.lo = ...; x.byte.hi = ...; return x.word; Анатолий.
|
|
|
|
|
Dec 26 2008, 07:13
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Огурцов @ Dec 26 2008, 10:02)  Как ее отключить, оставив один или два вектора ? Это ресет, плюс точка входа из секции приложения. Для этого нужно перекомпилировать под свой проект crtXXXX.o. Код стандартного здесь: http://cvs.savannah.gnu.org/viewvc/avr-lib.../?root=avr-libcБотлоадер использует прерывания? Если нет то добавте ключик "-mno-interrupts". Таблицу векторов он не уберет но код немного сократить может. Анатолий.
Сообщение отредактировал aesok - Dec 26 2008, 07:14
|
|
|
|
|
Dec 26 2008, 10:39
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(rezident @ Dec 26 2008, 00:28)  История одного байта. Будете смеяться. Мне тоже когда-то для pic16f84 не хватило одного слова. Искал о-о-очень долго, но утоптал софт на одну команду.  Цитата(ReAl @ Dec 26 2008, 02:12)  и в пределах лоадера можно обходиться rcall-ами/rjmp-ами Опция --relax в командной строке линкера ? Цитата(Огурцов @ Dec 26 2008, 14:06)  Добавил фичи, теперь не хватает 98 байт. Почти угадал ) 1. В листинге можно найти много смешного, байт эдак на 100. В основном это jmp вместо rjmp, и интенсивное использование lds/sts. 2. Для бута ассемблер уже не модно ?
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|