Перейти к содержанию
    

USB HOST MSC на FreeTROS на STM32

Есть проект на FreeRTOS 9.0.0 на чипе STM32F745. Заготовка проекта собрана с помощью Куба, после чего в нем заменены ОС на версию 9 и fatfs на версию 12.

В принципе, работает. Небольшие файлы на флешке обслуживает нормально. Но вот с большими стал выскакивать hard_fault. Стал разбираться с реализацией и несколько подивился.

С одной стороны разработчики постарались использовать ОС для управления ожиданием USB HOST и перевели его работу на очередь. Однако, запрашивающий процесс (задача) обращается к USB через USBH_MSC_SCSI_Read

, после чего попадает в цикл ожидания

  while (USBH_MSC_RdWrProcess(phost, lun) == USBH_BUSY)
  {
    if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0))
    {
      MSC_Handle->state = MSC_IDLE;
      return USBH_FAIL;
    }
  }

Это функция по циклу сверяет статусы и считает время. Вопрос: а почему бы тут не поставить семафор. Иначе получается, пока ждем коммуникацию по USB другим задачам время не достается. Поскольку запрашивающая данные задача имеет высокий приоритет (ну так надо), а данных запрошено достаточно много, то и ступор в работе ОС оказывается весьма заметным. Может кто сталкивался с таким вопросом и знает почему так сделано или уже перерабатывал этот механизм?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил семафор

static SemaphoreHandle_t BOT_Semaphore;
void BOT_Receive( void )
{
  xSemaphoreTake( BOT_Semaphore, portMAX_DELAY );
}

void BOT_Send(void)
{
  portBASE_TYPE t = pdTRUE;
  xSemaphoreGiveFromISR( BOT_Semaphore, &t );
}

Вызовы BOT_Send поставил в места stm32f7xx_hal_hcd.c , где идем назначение hhcd->hc[chnum].urb_state = .....

Вызовы BOT_Receive поставил в usbh_usb_bot.c в функцию USBH_MSC_BOT_Process под BOT_SEND_CBW_WAIT, BOT_DATA_IN_WAIT, BOT_DATA_OUT_WAIT и BOT_RECEIVE_CSW_WAIT, собственно где шло ожидание статусов. Производительность сохранилась, но ОС перестала вставать на время обращения к диску.

Осталась одна проблема. Если компилировать проект без оптимизации, под отладку, то все работает. Если оптимизация включена, то после чтения 60-150 кБ попадаю в hard_fault. Есть ли соображения на счет последнего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...