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

 
 
> Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы...
sonycman
сообщение Nov 22 2008, 19:39
Сообщение #1


Любитель
*****

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



Сейчас пытаюсь подогнать ИАРовский проект на меге88 под ВинАВР 4.3.2.
Чувствую, помучаться придётся немало smile3046.gif

Пока не могу разобраться, как красиво прочитать/записать 16-ти битный таймер, обеспечив атомарность операции.
Аналога иаровского __monitor не нашёл.
Существуют ли подобные макросы? Или надо писать самому?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Nov 26 2008, 10:17
Сообщение #2


Любитель
*****

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



Цитата(alx2 @ Nov 26 2008, 01:58) *
Привет, sonycman!
Можно тестовый пример с версией и опциями компилятора?

Привет smile.gif
Сейчас у меня вот такие опции:
Компилятор:
Код
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. Именно в этом, видимо, и вся проблема. Спасибо, теперь я понял smile.gif
Go to the top of the page
 
+Quote Post
alx2
сообщение Nov 26 2008, 20:20
Сообщение #3


Местный
***

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


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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 вполне бы прошло.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 26 2008, 22:02
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 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-ти бит crying.gif ... даже 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>
    }

Одно хоть радует - при вызове функции есть хоть какая-то польза от восьмибитных параметров - их быстрее загружать smile.gif
А дальше всё равно бессмысленное "растягивание" до int... и впустую потраченное время и место во флэш.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 27 2008, 07:56
Сообщение #6


Йа моск ;)
******

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



Цитата(sonycman @ Nov 27 2008, 00:02) *
А дальше всё равно бессмысленное "растягивание" до int... и впустую потраченное время и место во флэш.

Вот именно. switch - хоть и int по стандарту, но если у него аргумент прямо в скобках &0xE0, то никаким стандартом не прикрыть недоточенность компилятора.


Аналогично есть вопросы к выражению. Все операнды и результат 8 бит, а в середине выражение вычисляется через 16 бит. Чтото не так.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 27 2008, 08:51
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(Rst7 @ Nov 27 2008, 09:56) *
Аналогично есть вопросы к выражению. Все операнды и результат 8 бит, а в середине выражение вычисляется через 16 бит. Чтото не так.
Это называется Integer promotion - приведение char к int в промежуточных вычислениях, прописано в стандарте.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 27 2008, 09:28
Сообщение #8


Любитель
*****

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



Цитата(gotty @ Nov 27 2008, 12:51) *
Это называется Integer promotion - приведение char к int в промежуточных вычислениях, прописано в стандарте.

Но неужели слепое следование стандартам больших машин - это абсолютно правильно и на AVR?
Неужели в вышеприведённом примере столь необходимо было следовать такому стандарту?

А может существует какая-то опция, позволяющая отключать эту фичу?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|||- - Rst7   Цитата(gotty @ Nov 27 2008, 10:51) Это на...   Nov 27 2008, 09:08
||||- - gotty   Цитата(Rst7 @ Nov 27 2008, 11:08) Ссылку....   Nov 27 2008, 09:24
|||- - 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 страниц V   1 2 >


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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:19
Рейтинг@Mail.ru


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