Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное поведение C30
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Diz
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.
volodya
Цитата(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 было так).
Diz
В моем случае явное приведение типов не помогает.

Помогает, например, вот так
Код
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.
dac
В hitech та же проблема, не работает и битовые обращения типа х & (1<<9) для переменных длинее 16 бит
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.