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

 
 
 
Reply to this topicStart new topic
> Особенности CARMа
vesago
сообщение Nov 13 2007, 11:38
Сообщение #1


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Коллеги, не могу понять - что я не так делаю? Пишу обработчик уарта для LPC2214.

Код
//********************************************************************************
**********
//Обработчик прерывания UART1
//********************************************************************************
**********
void UART1_Handler(void) __irq
{
    u8_t iid;
    u8_t tmphead;
    u8_t tmptail;


    //iid = U1IIR;

    iid = 0;
    while(((iid & 1) == 0))
        //while(((iid = U1IIR) & UIIR_NO_INT) == 0)
    {
        switch(iid & UIIR_ID_MASK)
        {

        case UIIR_RLS_INT:                  //Receive Line Status
            U1LSR;                          //read LSR to clear
            break;

            //Прием
        case UIIR_CTI_INT:                  //Character Timeout Indicator
        case UIIR_RDA_INT:                  //Receive Data Available
            do
            {
                iid = U1RBR;
                if((uart1.flags & (1<<UART1_FLAG_TX_IN_PROGRESS)) == 0)
                {
                    tmphead = (uart1.rx_head + 1) & UART1_RX_BUFFER_MASK;
                    uart1.rx_head = tmphead;
                    if(tmphead == uart1.rx_tail)
                    {
                        //ERROR! Receive buffer overflow
                        uart1.flags |= (1<<UART1_FLAG_ERR);
                    }
                    uart1.rx_buf[tmphead] = iid;
                }
            }while(U1LSR & U1LSR_RDR_BIT);
            break;
    
            //Прередача
        case UIIR_THRE_INT:
            while(U1LSR & U1LSR_THRE_BIT)
            {
                tmptail = uart1.tx_tail;
                if(uart1.tx_head != tmptail)
                {
                    tmptail = (uart1.tx_tail + 1) &    UART1_TX_BUFFER_MASK;
                    uart1.tx_tail = tmptail;
                    U1THR = uart1.tx_buf[tmptail];
                }
                    else
                    {
                        uart1.flags &= ~(1<<UART1_FLAG_TX_IN_PROGRESS);    
                        uart1.flags |= (1<<UART1_FLAG_TX_COMPLETE);
                    }
            }
            break;

        case UIIR_MS_INT:                   //MODEM Status
            U1MSR;                          //read MSR to clear
            break;

        default:                            //Unknown
            U1LSR;
            U1RBR;
            U1MSR;
            break;
        }
    }

    VICVectAddr = 0x00000000;
}


Начал проверять - не работает. Начал разбираться, смотрю - при передаче байта выражение while(((iid = U1IIR) & UIIR_NO_INT) == 0) всегда ложно. Я тогда тупо iid проинициализировал 0 - все равно. Посмотрел в дизасме (см. картинку) компилятор вместо while сразу поставил выход из цикла. Что это значит? Оптимизацию вообще отключил. Пишу в кейл/карм.

Еще - в автомате тоже циклы вида while(...){} не работают - компилер сразу ставит выход из цикла. Зато do{}while(...); отлично работает. Эх видно особенность карма.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 13 2007, 12:33
Сообщение #2


Гуру
******

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



а UIIR_NO_INT случайно не равно нулю?


--------------------
На любой вопрос даю любой ответ
"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
abcdefg
сообщение Nov 13 2007, 12:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(vesago @ Nov 13 2007, 14:38) *
Коллеги, не могу понять - что я не так делаю? Пишу обработчик уарта для LPC2214.

Начал разбираться, смотрю - при передаче байта выражение while(((iid = U1IIR) & UIIR_NO_INT) == 0) всегда ложно. Я тогда тупо iid проинициализировал 0 - все равно. Посмотрел в дизасме (см. картинку) компилятор вместо while сразу поставил выход из цикла. Что это значит? Оптимизацию вообще отключил. Пишу в кейл/карм.



1. Зачем цикл по флагу прерывания, если и так обработчик прерывания + циклы в приеме/передаче?

2. Вполне допускаю, что keil "не понимает" такой конструкции while(((iid = U1IIR) & UIIR_NO_INT)

3. iid=0, такая вот "отключенная оптимизация". Была похожая фигня, решалась через указатели...
Go to the top of the page
 
+Quote Post
vesago
сообщение Nov 13 2007, 12:42
Сообщение #4


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Цитата(Сергей Борщ @ Nov 13 2007, 14:33) *
а UIIR_NO_INT случайно не равно нулю?


Единичке она равна. Да я и просто iid инициализировал нулем. Я бы давно соскочил с этого поганого карма на реалвью, да память внешняя прицеплена - не разобрался со скратчем.


Цитата(abcdefg @ Nov 13 2007, 14:34) *
1. Зачем цикл по флагу прерывания, если и так обработчик прерывания + циклы в приеме/передаче?

2. Вполне допускаю, что keil "не понимает" такой конструкции while(((iid = U1IIR) & UIIR_NO_INT)

3. iid=0, такая вот "отключенная оптимизация". Была похожая фигня, решалась через указатели...


1 - все так и должно быть, дабы из фифо все выбрать - борюсь с невекторными прерываниями.
2 - а в других местах отлично понимает. Видно с оптимизацией его переклинило. Эх, так хорошо все начиналось. Я уже и волатайл ставил перед перменной. Как только цикл вайл - заходит только если напрямую указать вайл(1){}
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Nov 13 2007, 13:16
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(vesago @ Nov 13 2007, 15:42) *
борюсь с невекторными прерываниями.


это как? 07.gif
т.е. почему при возникновении невекторного может вызываться обработчик uart'а??
Go to the top of the page
 
+Quote Post

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

 


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


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