Metallist64 0 10 июня, 2019 Опубликовано 10 июня, 2019 · Жалоба Всем доброго времени суток! Имею неприятность в виде ошибки "osRtxErrorClibMutex" (Standard C/C++ library mutex initialization failed). Конфигурация Real-Time Environment следующая в основной программе: CMSIS -> Core CMSIS -> RTOS2(API)->Keil RTX5 CMSIS Driver -> Flash -> AT45DB642D CMSIS Driver -> SPI(API) -> SPI Compiler -> Event Recorder Compiler -> I/O -> File Device -> Startup Device -> STM32Cube Framework (API) -> STM32CubeMX ( SPI #1 activated Full Duplex Mode) Device -> STM32Cube HAL -> Common Device -> STM32Cube HAL -> Cortex Device -> STM32Cube HAL -> DMA Device -> STM32Cube HAL -> GPIO Device -> STM32Cube HAL -> MDMA Device -> STM32Cube HAL -> PWR Device -> STM32Cube HAL -> RCC Device -> STM32Cube HAL -> SPI File System -> CORE File System -> Drive ->NOR ( 1 pcs) В микроконтроллере есть самопальный бут, который прыгает к нужному адресу основной программы. В нем используется та же конфигурация Real-Time Environment. И функции для работы с файлами EFS (Embedded File System). Вот пример из бута: FILE *fo; stat = finit ("F0:"); stat = fmount ("F0:"); stat = fcheck("F0:"); fopen ("format.dat","w"); fwrite(format_array, 1, 16, fo); fclose (fo); Ситуация заключается в том, что при использовании этого же кода в основной программе - возникает ошибка osRtxErrorClibMutex(функция osRtxErrorNotify). Ноги растут из этой функции: int _mutex_initialize(mutex *m); int _mutex_initialize(mutex *m) { int result; *m = osMutexNew(NULL); if (*m != NULL) { result = 1; } else { result = 0; (void)osRtxErrorNotify(osRtxErrorClibMutex, m); } return result; } Есть ощущение, что в буте создаются мьютексы, которые мешают созданию других мьютексов в основной программе(бред конечно...) Беда в том, что EFS использует RTX и отказаться от нее никак нельзя. Может кто сталкивался, подскажите пожалуйста, куда капнуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 5 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба Насколько я понимаю (посмотреть внимательно RTX руки так и не дошли), эта osMutexNew() использует heap. Размер хипа какой? Увеличить пробовали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Metallist64 0 11 июня, 2019 Опубликовано 11 июня, 2019 · Жалоба 5 hours ago, esaulenka said: Насколько я понимаю (посмотреть внимательно RTX руки так и не дошли), эта osMutexNew() использует heap. Размер хипа какой? Увеличить пробовали? Здравствуйте, heap увеличил сразу в два раза. Но это не решило проблему. Покопался в RTX и оказалось, при создании мьютекса проверяется следующее условие: if (IsIrqMode() || IsIrqMasked()) А функция IsIrqMasked проверяет регистр Priority Mask. В котором, в моем случае, был установлен 0-ой бит. Т.е. прерывания были запрещены. После разрешения прерываний ошибка ушла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться