Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB HOST MSC на FreeTROS на STM32
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Мусатов Константин
Есть проект на 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. Есть ли соображения на счет последнего?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.