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

 
 
> FreeRtos и его таски
Jenya7
сообщение Jun 6 2018, 08:55
Сообщение #1


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

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



Есть два таска - главный и логер с одинаковым приоритетом.В логере я записываю во флеш память большой кусок данных 4096 байт по SPI.
Код
do
{
     spi_rw_flash(0x00, &flash_data);
    *buff_in++ = flash_data;    /* read data to buffer */                
     leng--;
}while( leng > 0);
время записи 20 милисекунд. время переключения между тасками 2 милисекунды. по идее за эти 20 милисекунд должно быть 10 переключений между тасками.на деле я вижу что во время записи в логер главный таск застревает.Вопрос почему? И второй вопрос - если пришло время переключения таска - скедюлер даст SPI дозаписать текущий байт или выйдет посередине?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Jun 6 2018, 14:49
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Jenya7 @ Jun 6 2018, 16:55) *
Есть два таска - главный и логер с одинаковым приоритетом.В логере я записываю во флеш память большой кусок данных 4096 байт по SPI.
CODE
do
{
     spi_rw_flash(0x00, &flash_data);
    *buff_in++ = flash_data;    /* read data to buffer */                
     leng--;
}while( leng > 0);
время записи 20 милисекунд. время переключения между тасками 2 милисекунды. по идее за эти 20 милисекунд должно быть 10 переключений между тасками.на деле я вижу что во время записи в логер главный таск застревает.Вопрос почему? И второй вопрос - если пришло время переключения таска - скедюлер даст SPI дозаписать текущий байт или выйдет посередине?

Я надеюсь, у вас spi_rw_flash отдаёт управление шедулеру при первом удобном случае (работает только по прерываниям, используя средства межпроцессного взаимодействия.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 7 2018, 04:42
Сообщение #3


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

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



Цитата(haker_fox @ Jun 6 2018, 19:49) *
Я надеюсь, у вас spi_rw_flash отдаёт управление шедулеру при первом удобном случае (работает только по прерываниям, используя средства межпроцессного взаимодействия.

функция без прерываний
Код
uint8_t spi_rw_flash(uint8_t tx, uint8_t* rx)
{
    uint16_t counter_retry = 0;
    uint8_t err = 0;

      g_uiRecFlag_SFL = 0;

    // send byte
      err |= SFL_SPI_SendChar(tx);

    // wait until event of receive occurred
     while(!g_uiRecFlag_SFL){
         counter_retry++;
         if (counter_retry > SPI_TIMEOUT_RETRY)
             return 1;
     };

     // receive and save data in .
     err |= SFL_SPI_RecvChar(rx);

     g_uiRecFlag_SFL = 0;

     return err;
}

а как нужно отдавать управление шедулеру? по идее он сам знает когда переключиться на другой таск.
Go to the top of the page
 
+Quote Post



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

 


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


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