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

 
 
 
Reply to this topicStart new topic
Diz
сообщение Nov 7 2007, 22:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



PIC24FJ16GA002, компилятор C30 v3.0 (исправленная студенческая).

Столкнулся со странным поведением при больших сдвигах, например:

Код
void rs232_tx_uchar( unsigned char);


Код
void rs232_tx_ulong( unsigned long txData)
{
        rs232_tx_uchar( txData >> 24);
        rs232_tx_uchar( txData >> 16);
        rs232_tx_uchar( txData >> 8);
        rs232_tx_uchar( txData);
}


При запуске старший байт старшего слова на терминал не выводится, вместо него дважды
выводится младший байт старшего слова - 'сдвиг' на 24 не работает.

Если сделать так
Код
void rs232_tx_ulong( unsigned long txData)
{
        unsigned int tmpData = txData >> 16;

        rs232_tx_uchar( tmpData >> 8);
        rs232_tx_uchar( txData >> 16);
        rs232_tx_uchar( txData >> 8);
        rs232_tx_uchar( txData);
}

то все работает нормально.

Та же проблема и в более серьезных местах.
Кто-нибудь сталкивался или это я чего-то не понимаю ?

PS Да, оптимизация -O2.
Go to the top of the page
 
+Quote Post
volodya
сообщение Nov 8 2007, 05:37
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(Diz @ Nov 8 2007, 00:20) *
PIC24FJ16GA002, компилятор C30 v3.0 (исправленная студенческая).

Столкнулся со странным поведением при больших сдвигах, например:


Проблема с преобразованием long->char при передаче с неявным преобразованием действительно возникает ошибка в отдельных ситуациях.
При пердаче

Код
void rs232_tx_uchar( unsigned char);

void rs232_tx_ulong( unsigned long txData)
{
        rs232_tx_uchar( (unsigned char){txData >> 24));        
}


ситуация должна исправляется. (покрайней мере в моем случае smile3046.gif было так).

Сообщение отредактировал volodya - Nov 8 2007, 05:39


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post
Diz
сообщение Nov 8 2007, 09:33
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



В моем случае явное приведение типов не помогает.

Помогает, например, вот так
Код
void rs232_tx_ulong( unsigned long txData)
{
        volatile unsigned long tmpData = txData >> 24;

        rs232_tx_uchar( tmpData);
}


При этом без volatile не работает - значит, дурит оптимизатор.

Впрочем, вот что нашел:

Release Notes for MPLAB® C30 v3.01 (device support version cool.gif
[...]
Limitations
The current limitations are as follows:
[...]

C30-290 - Optimization failure with right shift of long values when the upper half of the result is not used.

Сообщение отредактировал Diz - Nov 8 2007, 09:35
Go to the top of the page
 
+Quote Post
dac
сообщение Nov 8 2007, 10:17
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



В hitech та же проблема, не работает и битовые обращения типа х & (1<<9) для переменных длинее 16 бит
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th June 2025 - 09:50
Рейтинг@Mail.ru


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