В принципе, работает. Небольшие файлы на флешке обслуживает нормально. Но вот с большими стал выскакивать 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;
}
}
{
if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0))
{
MSC_Handle->state = MSC_IDLE;
return USBH_FAIL;
}
}
Это функция по циклу сверяет статусы и считает время. Вопрос: а почему бы тут не поставить семафор. Иначе получается, пока ждем коммуникацию по USB другим задачам время не достается. Поскольку запрашивающая данные задача имеет высокий приоритет (ну так надо), а данных запрошено достаточно много, то и ступор в работе ОС оказывается весьма заметным. Может кто сталкивался с таким вопросом и знает почему так сделано или уже перерабатывал этот механизм?