У нас возникла проблема с мьютексом в CMSIS и FreeRTOS на плате STM32F407.
Есть два потока, которые могут получить доступ к аппаратному радио через UART. Мы используем мьютекс, чтобы гарантировать, что только один поток может разговаривать с радио одновременно.
Используя SWO для печати на последовательный порт каждый раз, когда мьютекс успешно захватывается или освобождается, мы можем видеть, что в определенных ситуациях происходит следующее:
Поток 1 успешно захватывает мьютекс с помощью osMutexWait (radioAccessMutex, 400)
Поток 2 успешно освобождает тот же мьютекс с помощью osMutexRelease (radioAccessMutex)
Насколько я понимаю, мьютекс может быть освобожден только потоком, который в настоящее время удерживает мьютекс.
Возвращаемое значение от обоих вызовов мьютекса - osOK. Рекурсивные мьютексы отключены в файле конфигурации. Оба потока имеют одинаковый приоритет.
Возможно актуальная информация: CMSIS v. 1.02 FreeRTOS v. 8.2.1
Код для вывода SWO:
void SWO_write(char* output)
{
for(int i = 0; i < strlen(output); i++)
{
ITM_SendChar(output[i]);
}
}
Этот код вызывается каждый раз, когда мьютекс захватывается или освобождается сразу после успешного вызова. Результатом вызова передается строка с завершающим нулем.
#define
косвенного обращения и абстракции объектов как очередей, которые могут скрывать от меня проверку на владение. - person Russ Schultz   schedule 14.02.2018osMutexRelease()
не включают «не владелец» в качестве потенциальной ошибки (реализация RTX просто возвращаетosError
, что на самом деле не указано в качестве возможного возвращаемого значения в документации). Мы все предполагаем, что только владельцы могут выпускать мьютексы, потому что это общепринятая семантика мьютексов, но ... - person Russ Schultz   schedule 14.02.2018