Проблемы с библиотекой FileX в составе Azure RTOS (ThreadX)

Mikbak

✩✩✩✩✩✩✩
24 Фев 2020
2
0
Всем привет! Ищу людей, которые имеют опыт с Azure RTOS и его расширением FileX для управления файловыми системами и уже понаступали на все грабли этого софта.

Железо: STM32U585CIU6 и SDXC карта памяти на 128 Гб, которая подключена по SPI без DMA.

Попытка форматирования этой карты памяти в exFAT завершается успешно, статус 0 означает FX_SUCCESS:
1768222035968.png

Далее открытие файловой системы завершается печально: статус = 2 (FX_MEDIA_INVALID):
1768222127416.png

Драйвер-обертка над HAL для STM32 для чтения карты памяти был взят готовый.
Интеграция этого драйвера в FileX выглядит так (все по четко по сгенерированному шаблону):
C++:
VOID  fx_stm32_custom_driver(FX_MEDIA *media_ptr)
{
  /* USER CODE BEGIN USER_CODE_SECTION_1 */
  /* USER CODE END USER_CODE_SECTION_1 */
  switch (media_ptr->fx_media_driver_request)
  {
    case FX_DRIVER_INIT:
    {
     /* USER CODE BEGIN DRIVER_INIT */
      if (!sd_is_initialized) {
        const int init_result = SDCARD_Init();
        if(0 == init_result) {
          sd_is_initialized = true;
        } else {
          media_ptr->fx_media_driver_status = FX_MEDIA_INVALID;
          return;
        }
      }
     /* USER CODE END DRIVER_INIT */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
     /* USER CODE BEGIN POST_DRIVER_INIT */
     /* USER CODE END POST_DRIVER_INIT */
      break;
    }
    case FX_DRIVER_UNINIT:
    {
     /* USER CODE BEGIN DRIVER_UNINIT */
      SDCARD_Unselect();
      sd_is_initialized = false;
     /* USER CODE END DRIVER_UNINIT */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_UNINIT */
     /* USER CODE END POST_DRIVER_UNINIT */
      break;
    }
    case FX_DRIVER_BOOT_READ:
    {
    /* USER CODE BEGIN DRIVER_BOOT_READ */
      const uint64_t boot_sector = media_ptr->fx_media_driver_logical_sector;
      uint8_t *const buffer = media_ptr->fx_media_driver_buffer;
      if (SDCARD_ReadSingleBlock(boot_sector, buffer) < 0) {
        media_ptr->fx_media_driver_status = FX_IO_ERROR;
        return;
      }
     /* USER CODE END DRIVER_BOOT_READ */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_BOOT_READ */
     /* USER CODE END POST_DRIVER_BOOT_READ */
      break;
    }
    case FX_DRIVER_READ:
    {
    /* USER CODE BEGIN DRIVER_READ */
      uint64_t sector_start = media_ptr->fx_media_driver_logical_sector;
      uint64_t sector_count = media_ptr->fx_media_driver_sectors;
      uint8_t *buffer = media_ptr->fx_media_driver_buffer;
      while (sector_count > 0U) {
        if (SDCARD_ReadSingleBlock(sector_start, buffer) < 0) {
            media_ptr->fx_media_driver_status = FX_IO_ERROR;
            return;
        }
        buffer += 512U;
        ++sector_start;
        --sector_count;
      }
     /* USER CODE END DRIVER_READ */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_READ */
     /* USER CODE END POST_DRIVER_READ */
      break;
    }
    case FX_DRIVER_BOOT_WRITE:
    {
    /* USER CODE BEGIN DRIVER_BOOT_WRITE */
      const uint64_t boot_sector = media_ptr->fx_media_driver_logical_sector;
      uint8_t *const buffer = media_ptr->fx_media_driver_buffer;
      if (SDCARD_WriteSingleBlock(boot_sector, buffer) < 0) {
        media_ptr->fx_media_driver_status = FX_IO_ERROR;
        return;
      }
     /* USER CODE END DRIVER_BOOT_WRITE */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_BOOT_WRITE */
     /* USER CODE END POST_DRIVER_BOOT_WRITE */
      break;
    }
    case FX_DRIVER_WRITE:
    {
    /* USER CODE BEGIN DRIVER_WRITE */
      uint64_t sector_start = media_ptr->fx_media_driver_logical_sector;
      uint64_t sector_count = media_ptr->fx_media_driver_sectors;
      const uint8_t *buffer = media_ptr->fx_media_driver_buffer;
      while (sector_count > 0U) {
        if (SDCARD_WriteSingleBlock(sector_start, buffer) < 0) {
            media_ptr->fx_media_driver_status = FX_IO_ERROR;
            return;
        }
        buffer += 512U;
        ++sector_start;
        --sector_count;
      }
     /* USER CODE END DRIVER_WRITE */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
     /* USER CODE BEGIN POST_DRIVER_WRITE */
     /* USER CODE END POST_DRIVER_WRITE */
      break;
    }
    case FX_DRIVER_FLUSH:
    {
    /* USER CODE BEGIN DRIVER_FLUSH */
     /* USER CODE END DRIVER_FLUSH */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_FLUSH */
     /* USER CODE END POST_DRIVER_FLUSH */
      break;
    }
    case FX_DRIVER_ABORT:
    {
    /* USER CODE BEGIN DRIVER_ABORT */
     /* USER CODE END DRIVER_ABORT */
      media_ptr->fx_media_driver_status = FX_SUCCESS;
    /* USER CODE BEGIN POST_DRIVER_ABORT */
     /* USER CODE END POST_DRIVER_ABORT */
      break;
    }
    default:
    {
        media_ptr->fx_media_driver_status = FX_IO_ERROR;
        break;
    }
  }
}


Я проверял драйвер карты памяти на предмет работоспособности без FileX: он корректно пишет и читает по секторам. После форматирования в отладке сразу посмотрел сектора 0 и 12 и не увидел там каких-то отклонений, их содержимое соответствует exFAT.

Сталкивался кто-нибудь с таким безобразным поведением файловой системы? Есть ли предположения, почему файловая система не открывается?
 
Изменено:

Mikbak

✩✩✩✩✩✩✩
24 Фев 2020
2
0
Пришел к выводу, что версия FileX 6.4.0 просто не работает (другие версии не проверял), и дело точно не в SD карте.
В качестве эксперимента подключил к драйверу fx_stm32_custom_driver двухмерный массив, эмулирующий сектора карты памяти, и читал/записывал с помощью memcpy — результат такой же отрицательный. Выкинул этот FileX и подключил стандартную FatFS, с ней все завелось с первого раза.