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

 
 
 
Reply to this topicStart new topic
> Выход по таймаут.
Jenya7
сообщение Oct 13 2015, 06:32
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть такая функция.
Код
uint32_t SPI_TransferByte(uint32_t sendbyte)
{
    /* Check that transmit buffer is empty */
    while (!(SPI_USART->STATUS & USART_STATUS_TXBL));
    SPI_USART->TXDATA = (uint32_t)sendbyte;
     /* Wait for transmitting to finished */
        while (!(SPI_USART->STATUS & USART_STATUS_TXC));
       //return data;
    return majority32const(&SPI_USART->RXDATA);
}

Есть большая вероятность что она заткнется в while(...)
Watchdog не хочу запускать. это не причина ресетовать всю систему.
решил сделать так.
Код
uint32_t SPI_TransferByte(uint32_t sendbyte)
{
    uint32_t timeout = 10000;
    /* Check that transmit buffer is empty */
    while (!(SPI_USART->STATUS & USART_STATUS_TXBL) && timeout)
    {
        timeout--;
    }
    SPI_USART->TXDATA = (uint32_t)sendbyte;
    timeout = 10000;
    /* Wait for transmitting to finished */
    while (!(SPI_USART->STATUS & USART_STATUS_TXC) && timeout)
    {
        timeout--;
    }
    //return data;
    return majority32const(&SPI_USART->RXDATA);
}

насколько это криво? или все таки нормальное решение?

Сообщение отредактировал Jenya7 - Oct 13 2015, 06:34
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 13 2015, 06:44
Сообщение #2


Гуру
******

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



Нормальное. Я бы только написал
Код
while (!(SPI_USART->STATUS & USART_STATUS_TXBL))
{
    if(!--timeout)
        break;
}


--------------------
На любой вопрос даю любой ответ
"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
Jenya7
сообщение Oct 13 2015, 06:45
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Oct 13 2015, 11:44) *
Нормальное. Я бы только написал
Код
while (!(SPI_USART->STATUS & USART_STATUS_TXBL))
{
    if(!--timeout)
        break;
}

спасибо.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 13 2015, 08:53
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Имхо если начали появляться таймауты это уже повод потратить время для переписывания на асинхронный лад.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 13 2015, 10:58
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Kabdim @ Oct 13 2015, 13:53) *
Имхо если начали появляться таймауты это уже повод потратить время для переписывания на асинхронный лад.

асинхронный это как?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 13 2015, 12:07
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Это: процесс запустил передачу и заснул, а разбудят его либо по окончании операции, либо по истечении таймаута.
Go to the top of the page
 
+Quote Post

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

 


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


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