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

 
 
> Что это фича или баг?, avr-gcc 4.1.2 WinAvr 20070525
xelax
сообщение Dec 1 2008, 07:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Столкнулся с очень интересным эффектом. Есть два кода, с моей точки зрения, которые должны работать идентично. Но первый случай не работает, второй работает безупречно.
Код
tty ? (UDR1 = data) : (UDR0 = data);

disasm code:
+000023EA:   91E010C5    LDS     R30,0x10C5       Load direct from data space
+000023EC:   91F010C6    LDS     R31,0x10C6       Load direct from data space
+000023EE:   0FE9            ADD     R30,R25          Add without carry
+000023EF:   1DF1            ADC     R31,R1           Add with carry
+000023F0:   8180            LDD     R24,Z+0          Load indirect with

+000023F1:   938000CE    STS     0x00CE,R24       Store direct to data space
+000023F3:   918000CE    LDS     R24,0x00CE       Load direct from data space



Код
if (tty > 0)
    UDR1 = data;
  else
    UDR0 = data;

disasm come:
+000023E8:   91E010C5    LDS     R30,0x10C5       Load direct from data space
+000023EA:   91F010C6    LDS     R31,0x10C6       Load direct from data space
+000023EC:   0FE9           ADD     R30,R25          Add without carry
+000023ED:   1DF1          ADC     R31,R1           Add with carry
+000023EE:   8180           LDD     R24,Z+0          Load indirect with

+000023EF:   938000CE    STS     0x00CE,R24       Store direct to data space




При дизасме в первом случае, вижу на мой взгляд абсолютно бесполезную строчку
Код
LDS     R24,0x00CE       Load direct from data space

но которая(мне кажется) ломает функционал uart начисто (проявляется следующим образом: из регистра приёмника вычитывается байт, который был вычитан до этого. То есть вижу иногда в общем пакете по два одинаковых байта).

Кто-нибудь может пояснить значение этой строчки??? Рботающий и неработающий коды отличаются только ей. И чем собственно коснтрукция ? : ; для компилятора отличается от if else? 07.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
forever failure
сообщение Dec 1 2008, 08:00
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



В первом случае в условии проверка на ненулевое значение, а во втором - на положительное. Может в этом разница ?
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 1 2008, 08:21
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(forever failure @ Dec 1 2008, 11:00) *
В первом случае в условии проверка на ненулевое значение, а во втором - на положительное. Может в этом разница ?


Да собственно говоря в if можно и на равенство 0 проверять, асм будет такой же (постоянство радует smile.gif ).

Меня просто напрягает, свободное обращение с регистром уарта UDR. Ведь и запись и чтение этого регистра запускают определённые физические процессы в уарте. А тут захотелось ему, он взял и вычитал значение из этого регистра в R24. Неприятное явление.

ЗЫ В IAR и тот и другой случаи работают нормально.

Цитата(Непомнящий Евгений @ Dec 1 2008, 11:09) *
? : возвращает результат, if else - нет. Больше вроде бы ничем.

Собственно в строчке LDS R24,0x00CE , насколько я понял, и возвращается результат операции UDR1 = data.



0x00CE это адрес UDR регистра, я не понимаю как это строчка может сообщать о результате операции. 07.gif

Цитата(_Pasha @ Dec 1 2008, 11:10) *
Нескромный вопрос: tty у Вас volatile? Просто не могу себе представить ситуацию, когда селектором устройств является не volatile переменная...



К моему стыду действительно не volatile. Эта переменная часть структуры, описывающей уарт
Код
typedef struct
{
  /** \brief tty - One of the defines UART_CHANNEL_0 or UART_CHANNEL_1.
  Which defines a number of UART. */
  uint8_t tty;
......
.....
.....
} UartDescriptor_t;
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 1 2008, 08:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(xelax @ Dec 1 2008, 11:18) *
0x00CE это адрес UDR регистра, я не понимаю как это строчка может сообщать о результате операции. 07.gif


Ну вероятно GGC полагает, что результатом операции a=b является значение "a" после операции присваивания. А "а" у вас - UDR1 - вероятно помеченный volatile или еще как-то. Вот его значение и вычитывается...

И еще вопросик - я не въеду, где в приведенном вами дизасме происходит сравнение tty c 0? Или вы привели только кусочек?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- xelax   Что это фича или баг?   Dec 1 2008, 07:46
||- - xelax   Цитата(Непомнящий Евгений @ Dec 1 2008, 11...   Dec 1 2008, 09:12
|- - _Pasha   Цитата(xelax @ Dec 1 2008, 12:21) я не по...   Dec 1 2008, 09:03
|- - Непомнящий Евгений   Цитата(_Pasha @ Dec 1 2008, 12:03) Выполн...   Dec 1 2008, 09:15
|- - _Pasha   Цитата(Непомнящий Евгений @ Dec 1 2008, 13...   Dec 1 2008, 09:28
|- - xelax   Цитата(_Pasha @ Dec 1 2008, 12:28) Вот ав...   Dec 1 2008, 09:54
||- - gotty   Цитата(xelax @ Dec 1 2008, 11:54) А собст...   Dec 1 2008, 10:33
||- - Непомнящий Евгений   Цитата(gotty @ Dec 1 2008, 13:33) Никакая...   Dec 1 2008, 10:44
||- - xelax   Цитата(gotty @ Dec 1 2008, 13:44) Никакая...   Dec 1 2008, 10:51
||- - gotty   Цитата(Непомнящий Евгений @ Dec 1 2008, 12...   Dec 1 2008, 11:02
||- - AHTOXA   Цитата(gotty @ Dec 1 2008, 16:02) Надо ра...   Dec 1 2008, 11:51
||- - _Pasha   Цитата(AHTOXA @ Dec 1 2008, 15:51) должна...   Dec 1 2008, 12:07
||- - AHTOXA   Цитата(_Pasha @ Dec 1 2008, 17:07) А это ...   Dec 1 2008, 12:21
||- - xelax   Цитата(_Pasha @ Dec 1 2008, 15:07) ../tes...   Dec 1 2008, 12:30
||- - _Pasha   Цитата(xelax @ Dec 1 2008, 16:30) а так? ...   Dec 1 2008, 12:38
||- - _Pasha   Цитата(_Pasha @ Dec 1 2008, 16:38) Понятн...   Dec 1 2008, 15:12
||- - ReAl   Цитата(_Pasha @ Dec 1 2008, 17:12) Господ...   Dec 11 2008, 09:13
|- - Непомнящий Евгений   Цитата(_Pasha @ Dec 1 2008, 12:28) Вот ав...   Dec 1 2008, 10:30
- - Непомнящий Евгений   Цитата(xelax @ Dec 1 2008, 10:46) И чем с...   Dec 1 2008, 08:09
- - _Pasha   Цитата(xelax @ Dec 1 2008, 11:46) но кото...   Dec 1 2008, 08:10


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

 


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


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