Цитата(Сергей Борщ @ Nov 21 2008, 22:11)

Очень странно. У меня работало. Просто в настройках проекта указать Custom (или External?) Makefile и все. Парсер вывода ведь никуда не денется. А еще можно отказаться от студии и работать в Эклипсе, а студию изредка использовать как симулятор, загружая в нее .elf.
Эклипс? Не юзал пока. А СликЭдит не подойдёт?
Скомпильнул небольшой код, и мне оптимизация ГНУ показалась интересной. Есть некоторые моменты, которые ИАР (5.10) даже не пытался затронуть, в отличие от, так сказать. Правда, очень уж любит ГНУ разворачивать подпрограммы, размерчик в итоге, думаю, получится посолидней...
Тестил ГНУ на О3 и на Оs, а ИАР на макс. по скорости...
ЗЫ: вот напоследок перл от ИАРА:
Дано:
Код
#define RPM_MIN 0
#define RPM_MED 1
#define RPM_MAX 2
typedef unsigned char byte;
struct frDatatable
{
byte min_speed;
byte med_speed;
byte max_speed;
byte min_temp;
byte max_temp;
} data;
byte RPMval[3];
byte minTEMPval;
byte maxTEMPval;
void CFanRegulator::SetData(frDatatable *data)
{
RPMval[RPM_MIN] = data->min_speed;
RPMval[RPM_MED] = data->med_speed;
RPMval[RPM_MAX] = data->max_speed;
minTEMPval = data->min_temp;
maxTEMPval = data->max_temp;
}
Вроде проще некуда. В итоге имеем:
Код
void CFanRegulator::SetData(frDatatable *data)
\ ??SetData:
15 {
16 RPMval[RPM_MIN] = data->min_speed;
\ 00000000 01F9 MOVW R31:R30, R19:R18
\ 00000002 8140 LD R20, Z
\ 00000004 01F8 MOVW R31:R30, R17:R16
\ 00000006 8345 STD Z+5, R20
17 RPMval[RPM_MED] = data->med_speed;
\ 00000008 01F9 MOVW R31:R30, R19:R18
\ 0000000A 8141 LDD R20, Z+1
\ 0000000C 01F8 MOVW R31:R30, R17:R16
\ 0000000E 8346 STD Z+6, R20
18 RPMval[RPM_MAX] = data->max_speed;
\ 00000010 01F9 MOVW R31:R30, R19:R18
\ 00000012 8142 LDD R20, Z+2
\ 00000014 01F8 MOVW R31:R30, R17:R16
\ 00000016 8347 STD Z+7, R20
19 minTEMPval = data->min_temp;
\ 00000018 01F9 MOVW R31:R30, R19:R18
\ 0000001A 8143 LDD R20, Z+3
\ 0000001C 01F8 MOVW R31:R30, R17:R16
\ 0000001E 8740 STD Z+8, R20
20 maxTEMPval = data->max_temp;
\ 00000020 01F9 MOVW R31:R30, R19:R18
\ 00000022 8124 LDD R18, Z+4
\ 00000024 01F8 MOVW R31:R30, R17:R16
\ 00000026 8721 STD Z+9, R18
21 }
\ 00000028 9508 RET
Просто аццкая куча кода
Раз указатель грузится каждый раз заново - зачем он здесь вообще нужен?
К чему так заморачиваться - надо было авторам LDS использовать - эффект тот-же
И такое встречается частенько.
Вроде хороший компилер, но работа с указателями похабная.
Из трёх регистровых пар практически используется только одна.
А вот ГНУ такой фигнёй, похоже, не страдает