|
Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы... |
|
|
|
 |
Ответов
|
Nov 26 2008, 10:17
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(alx2 @ Nov 26 2008, 01:58)  Привет, sonycman! Можно тестовый пример с версией и опциями компилятора? Привет Сейчас у меня вот такие опции: Компилятор: Код Building file: ../Sources/main.cpp Invoking: AVR C++ Compiler avr-g++ -I"F:\Electronics\Projects\GNU\FanController\Headers" -Wall -g2 -gdwarf-2 -Os -fpack-struct -fshort-enums -mcall-prologues -std=gnu++98 -funsigned-char -funsigned-bitfields -fno-exceptions -fno-threadsafe-statics -fno-inline-small-functions -ffunction-sections -mmcu=atmega88 -DF_CPU=10000000UL -MMD -MP -MF"Sources/main.d" -MT"Sources/main.d" -c -o"Sources/main.o" "../Sources/main.cpp" и линкер: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf С включением опции -Wl,-gc-sections неиспользуемая копия встраиваемой функции исчезла. Всё заработало правильно! Цитата Видимо, потому что простой сдвиг не умещается в три процессорные инструкции. При отличной от -Os оптимизации генерится именно сдвиг.
И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x. Но в этом случае (если x имеет тип unsigned) gcc и код генерит одинаковый (со сдвигом), и нет никакого смысла писать одно вместо другого. У sonycman же, судя по приведенному им примеру, левый операнд имеет знаковый тип. Да. Операнд имеет тип signed char. Именно в этом, видимо, и вся проблема. Спасибо, теперь я понял
|
|
|
|
|
Nov 26 2008, 20:20
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(sonycman @ Nov 26 2008, 15:17)  Сейчас у меня вот такие опции: Хм. Странно. Ничего подозрительного не вижу, и на простых примерах воспроизвести не могу. Не генерится у меня код для таких функций... Цитата(Rst7 @ Nov 26 2008, 17:46)  Да ну? Где Вы это вычитали? Сдвиг в Си для знаковых операндов всю жизнь был арифметический, с учетом знака. Читаем первоисточник: Цитата The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined. Цитата When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded. 87) ..... 87) This is often called ``truncation toward zero''. Обрати внимание, что результат оператора / - не есть целая часть арифметического частного. И в качестве упражнения тестовый пример: Код alx2% cat test.c #include <stdio.h> int main(void) { int x = -5; return printf("%d, %d\n", x / 2, x >> 1); } alx2% gcc -O2 -o t test.c alx2% ./t -2, -3 Цитата(Rst7 @ Nov 26 2008, 17:46)  А вот то, что гнусь не поставил команду ASR, а позвал деление - это непонятно. Попробуй привести код со сдвигами, выполняющий деление значения типа int (уже находящегося в регистрах) на 2, который был бы не длиннее трех машинных инструкций (напоминаю, что sonycman просил оптимизировать по размеру кода).
Сообщение отредактировал alx2 - Nov 26 2008, 21:00
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Nov 26 2008, 20:45
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(alx2 @ Nov 26 2008, 22:20)  -2, -3 Однако, сдвиг действительно арифметический. Более подробно посмотрю этот момент, когда попаду за комп, потому как с трубы лень искать. Возможно, я и не прав. Цитата Попробуй привести код со сдвигами, выполняющий деление значения типа int (уже находящегося в регистрах) на 2, который был бы не длиннее трех машинных инструкций (напоминаю, что sonycman просил оптимизировать по размеру кода). Если уж быть точным, там тип signed char у sonycman, так что inc rx, asr rx вполне бы прошло.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 26 2008, 22:02
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Rst7 @ Nov 27 2008, 00:45)  Однако, сдвиг действительно арифметический. Более подробно посмотрю этот момент, когда попаду за комп, потому как с трубы лень искать. Возможно, я и не прав. Если уж быть точным, там тип signed char у sonycman, так что inc rx, asr rx вполне бы прошло. Да, там у меня char: Код #define LCD_WIDTH 96 byte lcdGetStringWidth(PGM_P text);
void lcdPrintText(PGM_P text, byte flags, signed char x, signed char y) switch(flags & 0xe0) { case TXT_CENTERED: if (x < 0) { x = (LCD_WIDTH + x - lcdGetStringWidth(text)) / 2; } ... Но смысла в нём мало - всё равно всё тупо "растягивается" до 16-ти бит  ... даже switch: Код { switch(flags & 0xe0) e3a: 70 e0 ldi r23, 0x00; 0 e3c: 60 7e andi r22, 0xE0; 224 e3e: 70 70 andi r23, 0x00; 0 e40: 60 38 cpi r22, 0x80; 128 e42: 71 05 cpc r23, r1 e44: 21 f0 breq .+8 ; 0xe4e <lcdPrintText(char const*, unsigned char, signed char, signed char)+0x26> e46: 60 3c cpi r22, 0xC0; 192 e48: 71 05 cpc r23, r1 e4a: 11 f5 brne .+68 ; 0xe90 <lcdPrintText(char const*, unsigned char, signed char, signed char)+0x68> e4c: 1d c0 rjmp .+58 ; 0xe88 <lcdPrintText(char const*, unsigned char, signed char, signed char)+0x60> e4e: c4 2f mov r28, r20 e50: dd 27 eor r29, r29 e52: c7 fd sbrc r28, 7 e54: d0 95 com r29 { case TXT_CENTERED: if (x < 0) e56: 47 ff sbrs r20, 7 e58: 0c c0 rjmp .+24 ; 0xe72 <lcdPrintText(char const*, unsigned char, signed char, signed char)+0x4a> { x = (LCD_WIDTH + x - lcdGetStringWidth(text)) / 2; e5a: da df rcall .-76 ; 0xe10 <lcdGetStringWidth(char const*)> e5c: c0 5a subi r28, 0xA0; 160 e5e: df 4f sbci r29, 0xFF; 255 e60: 9e 01 movw r18, r28 e62: 28 1b sub r18, r24 e64: 31 09 sbc r19, r1 e66: c9 01 movw r24, r18 e68: 62 e0 ldi r22, 0x02; 2 e6a: 70 e0 ldi r23, 0x00; 0 e6c: 17 d5 rcall .+2606 ; 0x189c <__divmodhi4> e6e: 16 2f mov r17, r22 e70: 0f c0 rjmp .+30 ; 0xe90 <lcdPrintText(char const*, unsigned char, signed char, signed char)+0x68> } Одно хоть радует - при вызове функции есть хоть какая-то польза от восьмибитных параметров - их быстрее загружать А дальше всё равно бессмысленное "растягивание" до int... и впустую потраченное время и место во флэш.
|
|
|
|
|
Nov 27 2008, 08:51
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Rst7 @ Nov 27 2008, 09:56)  Аналогично есть вопросы к выражению. Все операнды и результат 8 бит, а в середине выражение вычисляется через 16 бит. Чтото не так. Это называется Integer promotion - приведение char к int в промежуточных вычислениях, прописано в стандарте.
|
|
|
|
|
Nov 27 2008, 09:24
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(Rst7 @ Nov 27 2008, 11:08)  Ссылку. Чтото я совсем потерялся. ISO/IEC 9899:19995.1.2.3 пункт 10 Цитата EXAMPLE 2 In executing the fragment Код char c1, c2; /* ... */ c1 = c1 + c2; the ‘‘integer promotions’’ require that the abstract machine promote the value of each variable to int size and then add the two ints and truncate the sum. Provided the addition of two chars can be done without overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only produce the same result, possibly omitting the promotions. 6.3.1.1 пункт 2 Цитата If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.48) All other types are unchanged by the integer promotions.
48) The integer promotions are applied only: as part of the usual arithmetic conversions, to certain argument expressions, to the operands of the unary +, -, and ~ operators, and to both operands of the shift operators, as specified by their respective subclauses.
|
|
|
|
Сообщений в этой теме
sonycman Перенос кода из под ИАРа на WinAVR Nov 22 2008, 19:39 demiurg_spb Поможет WinAVR\avr\include\util... Nov 22 2008, 20:04 sonycman Цитата(demiurg_spb @ Nov 23 2008, 00:04) ... Nov 22 2008, 21:17  ReAl Цитата(sonycman @ Nov 22 2008, 23:17) Раз... Nov 23 2008, 18:03   sonycman Цитата(ARV @ Nov 23 2008, 21:23) как прав... Nov 23 2008, 19:09    ReAl Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:37    Сергей Борщ Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:45   Petka Цитата(ReAl @ Nov 23 2008, 21:03) У gcc е... Nov 23 2008, 20:38    sonycman Цитата(Petka @ Nov 24 2008, 00:38) В прин... Nov 23 2008, 21:37     ReAl Цитата(sonycman @ Nov 23 2008, 23:37) А е... Nov 23 2008, 21:51    ReAl Цитата(Petka @ Nov 23 2008, 22:38) В прин... Nov 23 2008, 21:43     Petka Цитата(ReAl @ Nov 24 2008, 00:43) Это НЕ ... Nov 24 2008, 07:35 MrYuran Насколько я помню, у WinAVR имеется отличная докум... Nov 23 2008, 08:24 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 14:33 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 17:09  ARV Цитата(sonycman @ Nov 23 2008, 20:09) А м... Nov 23 2008, 17:23  alx2 Цитата(sonycman @ Nov 23 2008, 22:09) А м... Nov 23 2008, 21:54 sonycman Портировал я свою программу с IARа на GCC.
Оптимиз... Nov 24 2008, 11:05 aesok Цитата(sonycman @ Nov 24 2008, 14:05) Так... Nov 24 2008, 11:35  sonycman Цитата(aesok @ Nov 24 2008, 15:35) Добавт... Nov 24 2008, 11:57   aesok Цитата(sonycman @ Nov 24 2008, 14:57) У м... Nov 24 2008, 19:07    sonycman Цитата(ARV @ Nov 24 2008, 20:40) смутил к... Nov 24 2008, 19:26     ARV Цитата(sonycman @ Nov 24 2008, 22:26) Поп... Nov 24 2008, 20:00      sonycman Цитата(ARV @ Nov 25 2008, 00:00) Кодavr-g... Nov 24 2008, 20:23       Сергей Борщ Цитата(sonycman @ Nov 24 2008, 22:23) Вот... Nov 24 2008, 21:14        sonycman Цитата(Сергей Борщ @ Nov 25 2008, 01:14) ... Nov 24 2008, 23:36         gotty Цитата(sonycman @ Nov 25 2008, 01:36) Так... Nov 25 2008, 07:39 demiurg_spb Цитата(sonycman @ Nov 24 2008, 14:05) и в... Nov 24 2008, 11:56 alx2 Привет, sonycman!
Цитата(sonycman @ Nov 2... Nov 25 2008, 21:58  Rst7 Цитата(alx2 @ Nov 25 2008, 23:58) И зря. ... Nov 26 2008, 12:46 sonycman Интересно, почему при делении на два не всегда исп... Nov 24 2008, 14:15 MrYuran Цитата(sonycman @ Nov 24 2008, 17:15) Инт... Nov 24 2008, 14:22  sonycman Цитата(MrYuran @ Nov 24 2008, 18:22) Я об... Nov 24 2008, 14:46   demiurg_spb Цитата(sonycman @ Nov 24 2008, 17:46) Ещё... Nov 24 2008, 15:58    sonycman Цитата(demiurg_spb @ Nov 24 2008, 19:58) ... Nov 24 2008, 16:05 ARV смутил ключик --gc-sections я всегда использую -Wl... Nov 24 2008, 16:40 ARV -ff-sections заставляет компилятор размещать код к... Nov 25 2008, 05:56 sonycman Цитата(gotty @ Nov 25 2008, 11:39) Для то... Nov 25 2008, 09:41  ARV Цитата(sonycman @ Nov 25 2008, 12:41) Над... Nov 25 2008, 09:52  gotty Цитата(sonycman @ Nov 25 2008, 11:41) Лин... Nov 25 2008, 10:01   sonycman Цитата(ARV @ Nov 25 2008, 13:52) практика... Nov 25 2008, 10:42    ARV Цитата(sonycman @ Nov 25 2008, 13:42) Пон... Nov 26 2008, 07:22     aesok Цитата(ARV @ Nov 26 2008, 10:22) на сколь... Nov 26 2008, 09:39      ARV Цитата(aesok @ Nov 26 2008, 12:39) На как... Nov 26 2008, 09:50   alx2 Цитата(Rst7 @ Nov 27 2008, 01:45) Если уж... Nov 26 2008, 21:35    Rst7 Цитата(alx2 @ Nov 26 2008, 23:35) оно дае... Nov 26 2008, 21:56    aesok Цитата(sonycman @ Nov 27 2008, 01:02) Но ... Nov 27 2008, 04:14     alx2 Цитата(aesok @ Nov 27 2008, 09:14) The co... Nov 27 2008, 11:50      sonycman Цитата(gotty @ Nov 27 2008, 12:51) Это на... Nov 27 2008, 09:28       zltigo Цитата(sonycman @ Nov 27 2008, 12:28) Но ... Nov 27 2008, 09:45        sonycman Цитата(zltigo @ Nov 27 2008, 13:45) Следо... Nov 27 2008, 10:04         Сергей Борщ Цитата(sonycman @ Nov 27 2008, 12:04) Пон... Nov 27 2008, 11:35     aesok Цитата(Rst7 @ Nov 27 2008, 10:56) вычисля... Nov 27 2008, 16:52      Rst7 Цитата(aesok @ Nov 27 2008, 18:52) Расмот... Nov 27 2008, 17:08    alx2 Цитата(sonycman @ Nov 27 2008, 03:02) Код... Nov 27 2008, 11:29     sonycman Цитата(alx2 @ Nov 27 2008, 15:29) Как ты ... Nov 27 2008, 13:35 sonycman 2aesok
Если у меня в программе операнд имеет тип c... Nov 27 2008, 17:03 aesok Цитата(sonycman @ Nov 27 2008, 20:03) 2ae... Nov 27 2008, 17:18  sonycman Цитата(aesok @ Nov 27 2008, 21:18) Я вам ... Nov 27 2008, 18:22   aesok ЦитатаЭтот пример не имеет ничего общего с моим пр... Nov 27 2008, 19:49    sonycman Цитата(aesok @ Nov 27 2008, 23:49) Это Ва... Nov 27 2008, 21:52     aesok Цитата(sonycman @ Nov 28 2008, 00:52) Нет... Nov 27 2008, 22:22      sonycman Цитата(aesok @ Nov 28 2008, 02:22) Я попы... Nov 27 2008, 22:46       aesok Цитата(sonycman @ Nov 28 2008, 01:46) Хм.... Nov 27 2008, 23:20        sonycman Цитата(aesok @ Nov 28 2008, 03:20) Потому... Nov 28 2008, 00:34     alx2 Цитата(sonycman @ Nov 28 2008, 02:52) Код... Nov 29 2008, 11:51      sonycman Цитата(alx2 @ Nov 29 2008, 15:51) Поэтому... Nov 29 2008, 21:02       aesok Цитата(sonycman @ Nov 30 2008, 00:02) Я п... Nov 29 2008, 22:00        sonycman Цитата(aesok @ Nov 30 2008, 02:00) Не заб... Nov 29 2008, 22:24         alx2 Цитата(sonycman @ Nov 30 2008, 03:24) А в... Nov 30 2008, 14:40        Rst7 Цитата(aesok @ Nov 30 2008, 00:00) меня н... Nov 29 2008, 22:24         aesok Цитата(Rst7 @ Nov 30 2008, 01:24) Простит... Nov 29 2008, 22:36       alx2 Цитата(sonycman @ Nov 30 2008, 02:02) Зач... Nov 30 2008, 13:41        sonycman Цитата(Rst7 @ Nov 30 2008, 17:46) Жесть. ... Nov 30 2008, 14:19 Сергей Борщ Цитата(sonycman @ Nov 28 2008, 02:34) То ... Nov 28 2008, 01:08 Rst7 ЦитатаВо-вторых, я подозреваю, что вероятность вых... Nov 29 2008, 12:53 AHTOXA Цитата(Rst7 @ Nov 29 2008, 17:53) А значи... Nov 29 2008, 19:31  Rst7 Цитата(AHTOXA @ Nov 29 2008, 21:31) Но ве... Nov 29 2008, 21:43   sonycman Цитата(Rst7 @ Nov 30 2008, 01:43) С друго... Nov 29 2008, 21:56    Rst7 Цитата(sonycman @ Nov 29 2008, 23:56) Там... Nov 29 2008, 22:53     sonycman Цитата(Rst7 @ Nov 30 2008, 02:53) Дык где... Nov 29 2008, 23:14      alx2 Цитата(sonycman @ Nov 30 2008, 04:14) В И... Nov 30 2008, 14:21       sonycman Цитата(alx2 @ Nov 30 2008, 18:21) Можно в... Nov 30 2008, 14:34     aesok Цитата(Rst7 @ Nov 30 2008, 01:53) Вынужде... Nov 29 2008, 23:31    alx2 Цитата(sonycman @ Nov 30 2008, 02:56) Име... Nov 30 2008, 13:57   AHTOXA Цитата(Rst7 @ Nov 30 2008, 02:43) Плохо В... Nov 29 2008, 23:23 alx2 Привет, Rst7!
Цитата(Rst7 @ Nov 29 2008, ... Nov 30 2008, 13:13 sonycman Неважнецки получается у GCC работа со структурой в... Nov 30 2008, 10:23 Rst7 Хоть я и откланялся, но господину sonycman'у о... Nov 30 2008, 11:09 sonycman Цитата(Rst7 @ Nov 30 2008, 15:09) 218 byt... Nov 30 2008, 11:57 sonycman RST7
Не получается у меня научить гнуса правильно ... Nov 30 2008, 13:22 Rst7 Цитатаи результат компиляции первой строчки:
Жест... Nov 30 2008, 13:46
2 страниц
1 2 >
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0
|
|
|