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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
_Артём_
сообщение Aug 9 2012, 09:53
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(xemul @ Aug 9 2012, 12:39) *
Вот так
*pADC3_rx_pointer = UDR1;
pADC3_rx_pointer++;
полегчает.

Нет, не полегчает - всё равно будет варнинг.
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 9 2012, 10:18
Сообщение #47



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(_Артём_ @ Aug 9 2012, 13:53) *
Нет, не полегчает - всё равно будет варнинг.

Обосновать сможете? Или привести скриншот такой иаровой странности?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 9 2012, 11:00
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(xemul @ Aug 9 2012, 13:18) *
Обосновать сможете? Или привести скриншот такой иаровой странности?

 Уменьшено до 78%
Прикрепленное изображение
763 x 439 (42.59 килобайт)
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 9 2012, 11:41
Сообщение #49



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Спасибо.
Вероятно, предупреждение связано таки с двухбайтовостью указателя и неготовностью компилятора обеспечить атомарность доступа к нему на однобайтовой архитектуре.
Тогда "*Ptr++ = UDR0;" на авр получается даже чуть более безопасным вариантом, чем "*Ptr = UDR0; Ptr++;".
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Aug 9 2012, 17:13
Сообщение #50


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



инкремент указателя будет согласно типу. У нас это чар, значит на 1 байт независимо от условий.
Попробуйте выражение a = b+c; где все переменные волатайлы, тоже выскочит варнинг.

А причина как раз в том, что несмотря на чёткость последовательности операций ИАР предупреждает, что одновременно вынуть 2 переменные он не сможет. Значит между извлечением UDR0 и записью оного по адресу будет Н тактов, в которых может произойти страшное. Вдруг у нас вложенные прерывания разрешены или ещё какой ужас.
То есть варнинг не страшный, лишь указует на возможную проблему.

Сообщение отредактировал Dikoy - Aug 9 2012, 17:15
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 9 2012, 18:26
Сообщение #51


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Dikoy @ Aug 9 2012, 05:33) *
В этом случае компилер ругается

CODE
{
unsigned char * pTmp = *pADC3_rx_pointer;
*pTmp++ = UDR1;
pADC3_rx_pointer = pTmp;
}

можно попробовать также другие варианты, и выбрать наиболее удачно компилирующийся:
CODE
{
unsigned char * pTmp = *pADC3_rx_pointer++;
*pTmp = UDR1;
}

CODE
{
unsigned char * pTmp = *pADC3_rx_pointer;
*pTmp = UDR1;
pADC3_rx_pointer = ++pTmp;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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