|
WinAVR-20070122 еще сырой?, ошибки оптимизации |
|
|
|
Feb 17 2007, 04:29
|
Группа: Участник
Сообщений: 8
Регистрация: 6-03-06
Из: Новосибирск
Пользователь №: 15 027

|
Вот пример генерации кода. опции -Os
---------------------------------------------------------
int g;
int func(void) { int res; { uint8_t _SReg; asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));
res = g;
asm volatile( "out __SREG__,%0" :: "r" (_SReg)); } return res; } -------------------------------------------------------- WinAVR 20060421 (правильно)
28 0000 2FB7 in r18,__SREG__ 29 0002 F894 cli 32 0004 8091 0000 lds r24,g 33 0008 9091 0000 lds r25,(g)+1 36 000c 2FBF out __SREG__,r18 40 000e 0895 ret
--------------------------------------------------------- WinAVR 20070122 (неправильно)
32 0006 8FB7 in r24,__SREG__ 33 0008 F894 cli 37 000a 8FBF out __SREG__,r24 40 000c 8091 0000 lds r24,g 41 0010 9091 0000 lds r25,(g)+1 46 0014 0895 ret
---------------------------------------------------------
|
|
|
|
|
 |
Ответов
|
Feb 17 2007, 15:31
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места. Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит. В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода.
|
|
|
|
|
Feb 17 2007, 16:44
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ahulap @ Feb 17 2007, 15:31)  Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места. Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит. В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода. Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться. Анатолий.
|
|
|
|
|
Feb 17 2007, 19:00
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
[/quote] Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться. [/quote] Нет в main() локальных переменных. Из нее в зависимости от джамперов вызываются две static функции (для обновления "себя" или "соседа"). В них несколько локальных переменных (счетчики и байт, принятый по UART), остальные и массивы static. Я этот загрузчик долго сворачивал, так что думаю, дело в сохранении многобайтовых переменных, принимаемых по UART, идущих старшим байтом вперед. Если записать так: static unsigned char buf[512]; unsigned int size; *( (unsigned char *)&size + 1) = buf[0]; *( (unsigned char *)&size + 0) = buf[1]; то компиллятор расположит переменную в памяти, что для счетчика не хорошо. Если записать так: size = (buf[0] <<8) | buf[1]; то будут лишняя операция ИЛИ 2х-байтных чисел. Как это все-таки правильно реализовать на С? Или только через ассемблерные вставки? P.S.: если собрать этот bootloader в IAR 4.12 со средней оптимизацией по размеру, то получится 1940 байт. Есть за чем гнаться
|
|
|
|
Сообщений в этой теме
Jat WinAVR-20070122 еще сырой? Feb 17 2007, 04:29 beer_warrior Вчера был на avrfreaks. Там много таких вопросов.
... Feb 17 2007, 12:32 aesok К сожалению это не компилятор сырой, а ваш код. Пр... Feb 17 2007, 14:10  defunct Цитата(aesok @ Feb 17 2007, 15:44) Если у... Feb 23 2007, 16:23 ahulap Провел эксперименты, вот что получил:
unsigned in... Feb 18 2007, 00:16 aesok В настоящий момент самый эффективный способ в GCC ... Feb 18 2007, 00:43 ahulap Нашел отличие:
00003900 <main>:
3900: 2f... Feb 23 2007, 15:55 aesok Цитата(ahulap @ Feb 23 2007, 15:55) Нашел... Feb 23 2007, 23:43 gormih WinAVR еще долго будет сырым по определению.
Все... Feb 23 2007, 23:51 aesok Цитата(gormih @ Feb 23 2007, 23:51) WinAV... Feb 23 2007, 23:58  gormih Цитата(aesok @ Feb 23 2007, 23:58) Уважае... Feb 24 2007, 00:34   aesok Цитата(gormih @ Feb 24 2007, 00:34) Цитат... Feb 24 2007, 00:43    ahulap Цитата(aesok @ Feb 23 2007, 23:43) Патчи ... Feb 24 2007, 13:12     aesok Цитата(ahulap @ Feb 24 2007, 13:12) Цитат... Feb 24 2007, 13:32 Abakt Он же не пишет - "лучше-хуже" он именно ... Feb 24 2007, 00:42 singlskv Цитата(gormih @ Feb 23 2007, 23:51) WinAV... Feb 24 2007, 12:38 gormih Цитата(singlskv @ Feb 24 2007, 12:38) Хот... Feb 26 2007, 22:55  singlskv Цитата(gormih @ Feb 26 2007, 22:55) Не со... Feb 26 2007, 23:28   gormih Цитата(singlskv @ Feb 26 2007, 23:28) А н... Feb 27 2007, 12:52 beer_warrior ЦитатаДа и не собираюсь думать, чего он там сделае... Feb 27 2007, 14:52 gormih Цитата(beer_warrior @ Feb 27 2007, 14:52)... Feb 27 2007, 14:57 beer_warrior ЦитатаА Ваше высказывания кроме того, что Вы хам -... Feb 27 2007, 15:08 gormih Цитата(beer_warrior @ Feb 27 2007, 15:08)... Feb 27 2007, 16:03 beer_warrior Цитатаа GNU GPL же тренируются молодые перспективн... Feb 27 2007, 16:32 gormih Цитата(beer_warrior @ Feb 27 2007, 16:32)... Feb 27 2007, 16:42 gormih на сколько понимаю на этом всё Mar 1 2007, 23:53 ahulap Вот еще что обнаружил:
есть маленнькая функция
st... Mar 5 2007, 16:19 aesok Цитата(ahulap @ Mar 5 2007, 16:19) Вот ещ... Mar 5 2007, 18:11  ahulap Цитата(aesok @ Mar 5 2007, 17:11) Цитата(... Mar 5 2007, 18:57 beer_warrior Цитатана сколько понимаю на этом всё
Я просил плат... Mar 5 2007, 17:22 gormih Цитата(beer_warrior @ Mar 5 2007, 17:22) ... Mar 6 2007, 01:12 IgorKossak Поумерьте свой пыд, господа.
Тема уже давно себя и... Mar 6 2007, 10:46 IgorKossak gormin довыступался до предупреждения из-за грубос... Mar 7 2007, 18:15
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|