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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> 100 байт не хватает
Огурцов
сообщение Dec 25 2008, 20:25
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 25 2008, 20:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Хоть и bb-offtopic.gif , но нелишне напомнить История одного байта.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 25 2008, 20:34
Сообщение #3


Гуру
******

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



Помню.
Фишка еще в том, что простое увеличение памяти ничего не дает и для более толстой m168 проблема еще более усугубляется - там для того же самого дополнительно нужно около 700 байт.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 25 2008, 22:12
Сообщение #4


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

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



Цитата(Огурцов @ Dec 25 2008, 22:34) *
Фишка еще в том, что простое увеличение памяти ничего не дает и для более толстой m168 проблема еще более усугубляется - там для того же самого дополнительно нужно около 700 байт.
А почему? Размер-то бут-секции меньше 8К и в пределах лоадера можно обходиться rcall-ами/rjmp-ами, в результате для меги168 вырастет только таблица векторов.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 25 2008, 22:17
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Недавно в IAR выдушил 400 байт. Возможно мои рекомендации немного помогут.
1) Проверь какие регистры реально использует компилятор. Попробуй выключить несколько регистров и посмотри насколько увеличился объём кода.
2) посмотри какие процедуры используются тобой чаще всего. Обрати внимание как скомпилировал их компилятор. И вообще к этим процедурам необходимо пристальное внимание. Всё дальнейшее теперь по ним.
3) Посмотри какие параметры туда передаются и как они возвращаются. В частности по CRC. Попробуй объявить её глобальной на весь файл либо наоборот локальной в main, а в других местах передавать аргументом. Смотри как меняется объём файла.

Далее исходя из всех экспериментов я сделал следующее. (у вас может быть вплоть до наоборот)
1) выделил несколько регистров (у меня их резервирование практически не влияло на размер выходного файла)
2) Расположил там переменные, к которым максимально часто обращаюсь и объявил их глобальными расположенными в регистрах.
3) Переписал пару процедур на асме.

Учтите ещё три момента.
1) В кристалле м8 объём занимаемый будет меньше.
2) Кое что возможно расположить в свободном месте между веаторами прерываний. (насколько я понял вы прерывания задействовали).
3) Я пробовал вариант с прерываниями и без них. Без них объём проги получился значительно меньший.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 25 2008, 22:30
Сообщение #6


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

Группа: Свой
Сообщений: 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 тоже можно что-то поскладывать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 26 2008, 06:39
Сообщение #7


Гуру
******

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



Цитата(ReAl @ Dec 25 2008, 22:12) *
А почему? Размер-то бут-секции меньше 8К и в пределах лоадера можно обходиться rcall-ами/rjmp-ами, в результате для меги168 вырастет только таблица векторов.

Да, таблица векторов вырастает (ровно?) в два раза. У m8 она чуть-чуть поменьше, но их вроде бы уже сняли с производства. Бут-секция 2k у всех троих, больше не сделать. Выносить часть лодыря в секцию приложения - как-то совсем не красиво.
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 26 2008, 07:02
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 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;


Анатолий.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 26 2008, 07:02
Сообщение #9


Гуру
******

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



Цитата(ReAl @ Dec 25 2008, 22:30) *
2а) В GPIOR0 можно разместить восемь битовых флагов с коротким доступом на установку/сброс/проверку.
2б) В GPIOR1, GPIOR2 можно разместить две байтовых переменных с доступом in/out, более коротким, чем lds/sts
2в) Гулять так гулять - в EEARL/EEDR а то и в неиспользуемых лоадером таймерных регистрах OCR0A/OCR0B/TCNT0 тоже можно что-то поскладывать.

Вообще-то мысль интересная.
Сейчас нужны еще 18 байт плюс две фичи - проверка взведенных лок битов и проверку CRC бут-секции. Теоретически таблицы векторов для этого могло бы и хватить, т.к. прерывания принципиально не используются. Как ее отключить, оставив один или два вектора ? Это ресет, плюс точка входа из секции приложения.
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 26 2008, 07:13
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 26 2008, 07:17
Сообщение #11


Гуру
******

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



Цитата(aesok @ Dec 26 2008, 07:02) *
avr-gcc генерирует плохой код для операций сдвига, используйте union-ны для выделения байтов из int и long.

10x, -2 байта на каждую переменную.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Dec 26 2008, 10:06
Сообщение #12


Гуру
******

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



Добавил фичи, теперь не хватает 98 байт. Почти угадал )
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 26 2008, 10:39
Сообщение #13


;
******

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



Цитата(rezident @ Dec 26 2008, 00:28) *
История одного байта.

Будете смеяться. Мне тоже когда-то для pic16f84 не хватило одного слова. Искал о-о-очень долго, но утоптал софт на одну команду. smile.gif

Цитата(ReAl @ Dec 26 2008, 02:12) *
и в пределах лоадера можно обходиться rcall-ами/rjmp-ами

Опция --relax в командной строке линкера ?

Цитата(Огурцов @ Dec 26 2008, 14:06) *
Добавил фичи, теперь не хватает 98 байт. Почти угадал )

1. В листинге можно найти много смешного, байт эдак на 100. В основном это jmp вместо rjmp, и интенсивное использование lds/sts.
2. Для бута ассемблер уже не модно ? smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 10:58
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Dec 25 2008, 23:28) *
Хоть и bb-offtopic.gif , но нелишне напомнить История одного байта.

Да не тот случай sad.gif Тут наверняка просто нечто писанное левой ногой и на 2K нахождение 100 байт не требует сверхестественных потуг.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Diz
сообщение Dec 26 2008, 13:09
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Посмотрите, есть ли у в строке для компилятора ключики
-ffunction-sections и -fdata-sections, а для линкера --gc-sections.
Если их нет, линкер не будет выбрасывать неиспользуемое.
Go to the top of the page
 
+Quote Post

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

 


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


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