kostya-m 0 3 февраля, 2017 Опубликовано 3 февраля, 2017 · Жалоба Есть проект на 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 другим задачам время не достается. Поскольку запрашивающая данные задача имеет высокий приоритет (ну так надо), а данных запрошено достаточно много, то и ступор в работе ОС оказывается весьма заметным. Может кто сталкивался с таким вопросом и знает почему так сделано или уже перерабатывал этот механизм? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 4 февраля, 2017 Опубликовано 4 февраля, 2017 · Жалоба Добавил семафор 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. Есть ли соображения на счет последнего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться