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

Standard C/C++ library mutex initialization failed

Всем доброго времени суток!

Имею неприятность в виде ошибки "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  и отказаться от нее никак нельзя.

Может кто сталкивался, подскажите пожалуйста, куда капнуть?

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


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

Насколько я понимаю (посмотреть внимательно RTX руки так и не дошли), эта osMutexNew() использует heap. Размер хипа какой? Увеличить пробовали?

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


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

5 hours ago, esaulenka said:

Насколько я понимаю (посмотреть внимательно RTX руки так и не дошли), эта osMutexNew() использует heap. Размер хипа какой? Увеличить пробовали?

Здравствуйте, heap увеличил сразу в два раза. Но это не решило проблему.

Покопался в RTX и оказалось, при создании мьютекса проверяется следующее условие:

 if (IsIrqMode() || IsIrqMasked())

А функция IsIrqMasked проверяет регистр Priority Mask. В котором, в моем случае, был установлен 0-ой бит. Т.е. прерывания были запрещены.

После разрешения прерываний ошибка ушла.

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


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

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

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

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

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

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

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

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

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

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