|
|
  |
MSP-GCC 4. Кто-нибудь пробовал?, Случайно наткнулся:) |
|
|
|
May 24 2010, 09:37
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(demiurg_spb @ May 21 2010, 18:01)  Неа. Всё же со всеми новыми способами оптимизации 4й GCC получается получше 3-его. Прикрутил-таки сегодня "вхоле-програм" и "комбайн". -Os Код Build project 9010U - OK. text data bss dec hex filename 7518 4 772 8294 2066 9010U.elf msp430-gcc (MSPGCC4_r4-20100210) 4.4.3 Copyright (C) 2010 Free Software Foundation, Inc. -O3 выдал internal compiler error -O2: Код text data bss dec hex filename 8876 4 772 9652 25b4 9010U.elf -O1: Код text data bss dec hex filename 8824 4 772 9600 2580 9010U.elf Оптимизация выключена: Код text data bss dec hex filename 12574 72 1118 13764 35c4 9010U.elf Практически то же самое, что 3-я версия давала с -O3 Если это ещё на железке заработает, вывод однозначный. Брать! По оптимизации вполне сравнимо с ИАРом.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 24 2010, 10:40
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(MrYuran @ May 24 2010, 13:37)  По оптимизации вполне сравнимо с ИАРом. Так и о чём:-) При таком способе оптимизации очень важно грамотно использовать volatile - и там где раньше и без него могло проканать - теперь не проканает...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 25 2010, 05:43
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(AHTOXA @ May 24 2010, 17:50)  Круто! Теперь будет занята четверть объёма флеша  Дело не в этом, просто всё должно быть красиво! Ну и хочется знать хотя бы теоретический предел "сжатия". К тому же, у меня задачи достаточно легковесные (измериловка, обработка, обмен с хостом), а вот к примеру, для автономного прибора с графическим экранчиком, кучей менюшек и даже встроенным блокнотом уже начинает играть рояль. Причём, от оптимизации и потребление может зависеть (хотя, на фоне экранчика, жрущего как лошадь 3мА, это всё копейки...) Или вот например, выпустили серию G2xx. Вот если бы добавили флеша хотя бы до 8кБ, то туда можно было бы упихать что-нибудь стоящее. Попробовал вчера ещё один проект собрать, там что-то непонятное творит. Такое ощущение, что вместо elf-а подсовывает неразлинкованный объектник.
1002TD.elf.lst.zip ( 32.52 килобайт )
Кол-во скачиваний: 80
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 25 2010, 09:40
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(demiurg_spb @ May 25 2010, 13:24)  Да ну... Откуда такие предположения? Вроде как при такой компиляции он объектные файлы вообще не создаёт. У Вас в Makefile конечная цель elf или всё-таки ещё получаете hex или bin и что с ними? Предположения из листинга, полученного обждампом из эльфа. Делаю так: Код $(NAME).elf : $(CSRC) @echo $^ @$(CC) -c $(CFLAGS) -combine -fwhole-program $^ $(LDFLAGS) -o $@ Как уже писал, в предыдущем проекте всё собралось нормально. И листинг нормальный. CODE Disassembly of section .text:
00001100 <__init_stack>:
1100: 31 40 00 0a mov #2560, r1 ;#0x0a00
00001104 <__low_level_init>:
1104: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80 1108: 20 01
0000110a <__do_clear_bss>: 110a: 3f 40 e6 02 mov #742, r15 ;#0x02e6 110e: 0f 93 tst r15 1110: 04 24 jz $+10 ;abs 0x111a 1112: 1f 83 dec r15 1114: cf 43 48 02 mov.b #0, 584(r15);r3 As==00, 0x0248(r15) 1118: fc 23 jnz $-6 ;abs 0x1112
0000111a <__do_copy_data>: 111a: 3f 40 48 00 mov #72, r15 ;#0x0048 111e: 0f 93 tst r15 1120: 05 24 jz $+12 ;abs 0x112c 1122: 2f 83 decd r15 1124: 9f 4f 68 5a mov 23144(r15),512(r15);0x5a68(r15), 0x0200(r15) 1128: 00 02 112a: fb 23 jnz $-8 ;abs 0x1122
0000112c <__jump_to_main>: 112c: 30 40 54 22 br #0x2254
00001130 <__ctors_end>: 1130: 30 40 3e 12 br #0x123e
а вот "ненормальный": CODE Disassembly of section .text.GetRealTime.1824:
00000000 <GetRealTime.1824>: 0: 0b 12 push r11 2: 0b 4f mov r15, r11 4: 08 3c jmp $+18 ;abs 0x16 6: 1e 42 00 00 mov &0x0000,r14 a: 1f 42 00 00 mov &0x0000,r15 e: 8b 4e 00 00 mov r14, 0(r11) ;0x0000(r11) 12: 8b 4f 02 00 mov r15, 2(r11) ;0x0002(r11) 16: 1c 42 00 00 mov &0x0000,r12 1a: 1d 42 00 00 mov &0x0000,r13 1e: 3e 4b mov @r11+, r14 20: 3f 4b mov @r11+, r15 22: 2b 82 sub #4, r11 ;r2 As==10 24: 0c 9e cmp r14, r12 26: ef 23 jnz $-32 ;abs 0x6 28: 0d 9f cmp r15, r13 2a: ed 23 jnz $-36 ;abs 0x6 2c: 3b 41 pop r11 2e: 30 41 ret Disassembly of section .text.Beep.1817:
00000000 <Beep.1817>: 0: 0b 12 push r11 2: 0a 12 push r10 4: 0b 4f mov r15, r11 6: 3f 40 00 00 mov #0, r15 ;#0x0000 a: b0 12 00 00 call #0x0000 e: 0c 4b mov r11, r12 10: 3a 40 05 00 mov #5, r10 ;#0x0005 14: b0 12 00 00 call #0x0000 18: 0d 43 clr r13 1a: 82 5c 00 00 add r12, &0x0000 1e: 82 6d 00 00 addc r13, &0x0000 22: e2 c3 31 00 bic.b #2, &0x0031 ;r3 As==10 26: 3a 41 pop r10 28: 3b 41 pop r11 2a: 30 41 ret Если первый выглядит как нормальный бинарник, с конкретными абсолютными адресами, то второй - как нелинкованный выход компилятора.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 25 2010, 11:33
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(MrYuran @ May 25 2010, 14:23)  А как заставить make выводить весь поток полностью? У меня выводит только результаты Цитата(AHTOXA @ May 25 2010, 14:28)  make -n ? Или возможно убрать собаку из начала этой строчки. Цитата(MrYuran @ May 25 2010, 13:40)  Код @$(CC) -c $(CFLAGS) -combine -fwhole-program $^ $(LDFLAGS) -o $@ А так ничего страшного не вижу. Странно... Единственное, проще включить опцию -pedantic и стандарт С99 вместо gnu99, тогда не нужно будет столько много ключей про варнинги (-Wmissing-prototypes -Wmissing-declarations...) Ещё посмотрите на это: -Wl,--relax -ftree-loop-ivcanon -mcall-prologues -fno-tree-scev-cprop -finline-small-functions -fearly-inlining --param inline-call-cost=2 -finline-limit=100 -fno-unit-at-a-time И вообще с оптимизацией -Os всегда получаются самые лучшие результаты (разницы по скорости с -O3 реально фактически нет).
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 25 2010, 12:06
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Короче, я понял. Он все секции мапит на 0x0000, в результате итоговый размер определяется самой длинной секцией. Глюк в чистом виде. фтопку... Хотя нет... Достаём обратно... Код $(NAME).elf : $(CSRC) @echo $^ @$(CC) -c $(CFLAGS) $^ $(LDFLAGS) -o $(NAME).o $(CC) $(NAME).o $(LDFLAGS) -o $@ $(OBJCOPY) -O ihex $(NAME).elf $(NAME).a43 Как я и думал, это был объектник, который надо ещё слинковать За один проход никак... Код text data bss dec hex filename 23004 2 257 23263 5adf 1002TD.elf Вот это похоже на правду. А вот это без -combine и -fwhole-program: Код text data bss dec hex filename 26954 2 302 27258 6a7a 1002TD.elf Разница, конечно, есть, но не такая сказочная. На -Os - вообще 22кБ против 23
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 11 2010, 13:29
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Противоречивые какие-то чувства навевает... Поигрался сегодня вдоволь. Обнаружил странный глюк: (а может, так и должно быть?) если объявить interrupt функцию как static inline, то она не линкуется, а вместо неё в таблицу векторов забивается _unexpected_ Причём, даже отдельно static или inline тоже вызывают подобный глюк. В старой версии некоторые комбинации проходят. Кстати, ключ "вхоле_програм" вызывает подобный глюк при любом раскладе. Размер таки 4 версия компилит бОльший, чем предыдущая. С 20кБ около 2-х набегает, а вот с 50 - уже все 5, и можно случайно не влезть во флешь со старым проектом... В поисках флагов для "полновесного" sprintf() наткнулся на вот что: http://mspgcc.bzr.sf.net/bzr/mspgcc/mspgcc-core/changesОказывается, исходный mspgcc жив! Осталось таки научиться его собирать...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jun 13 2010, 11:08
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(MrYuran @ Jun 11 2010, 17:29)  если объявить interrupt функцию как static inline Этого делать не надо т.к. при архитектуре mcu с таблицей векторов прерываний невозможно в принципе инлайнить обработчики прерываний. Цитата(MrYuran @ Jun 11 2010, 17:29)  Причём, даже отдельно static или inline тоже вызывают подобный глюк. со static - это действительно бага. Цитата Кстати, ключ "вхоле_програм" вызывает подобный глюк при любом раскладе. Не бейте пианиста он играет как умеет
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 17 2010, 07:31
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
ААААААААААААААААААААААААААААААА!!!!!! Нашел причину всех моих неудач за последний месяц! Идея была в том, чтобы написать культурный HAL на основе mspgcc-шного iostructures.h И что я сегодня заметил?! Код static void ClearWatchDog(void) { SYS_WDT.out.SYS_WDT_PIN = 1; 5300: b2 d0 80 00 bis #128, &0x001e;#0x0080 5304: 1e 00 /main/../platform/watchdog_lo_level.h:27 SYS_WDT.out.SYS_WDT_PIN = 0; 5306: b2 f0 7f ff and #-129, &0x001e;#0xff7f 530a: 1e 00 SYS_WDT - это port4: #if defined(__MSP430_HAS_PORT4__) || defined(__MSP430_HAS_PORT4_R__) __MSP430_EXTERN__ struct port_simple_t port4 asm("0x001c"); #endif , где Код struct port_simple_t { ioregister_t in; /* Input */ ->1c ioregister_t out; /* Output */ ->1d [b] ioregister_t dir; /* Direction */ ->1e[/b] ioregister_t sel; /* Selection */ }; Ну и каких, собственно, аллюзий out стал по адресу 1e? То есть всё как бы съехало на 1 адрес, и я вместо того чтобы махнуть ногой, переключаю направление... После такого стресса перестаёшь верить в разумное и доброе, хочется выдернуть шнур и выдавить стекло. И в отпуск на полгода... Ну а это уже ни в какие рамки: Код static void WatchDogInit(void) { SYS_WDT.out.SYS_WDT_PIN = 0; 44e8: 3f 40 1e 00 mov #30, r15;#0x001e 44ec: bf f0 7f ff and #-129, 0(r15);#0xff7f, 0x0000(r15) 44f0: 00 00 /main/../platform/watchdog_lo_level.h:16 SYS_WDT.sel.SYS_WDT_PIN = 0; 44f2: bf f0 7f ff and #-129, 4(r15);#0xff7f, 0x0004(r15) 44f6: 04 00 /main/../platform/watchdog_lo_level.h:17 SYS_WDT.dir.SYS_WDT_PIN = 1; 44f8: bf d0 80 00 bis #128, 2(r15);#0x0080, 0x0002(r15) 44fc: 02 00 Поля структуры просто перетасованы в каком-то непонятном порядке... и всё сдвинуто Но ведь работало же как-то раньше! Кажись допёр... Структуры должны быть packed  Может есть такой ключик, чтобы все структуры упаковать? А то по одной долго возиться, да и править системные исходники не совсем идеологически правильно ###### __attribute__ ((packed)) не помог... все регистры по 2 байта. Со старым компилятором то же самое. Что за жизнь пошла...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|