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

freeRTOs 8.1.2 не стабильно работает приложение

Приложение крутится на STM32F405 и взаимодействует с vlsi1053b. Захватывает звук по SPI от Vlsi и сохраняет на SD карту (по SDIO). Еще один поток отрабатывает кнопки, итого - 2 потока.

В начале все было хорошо, но как только добавил функцию оцифровки со встроенного ацп (с пустым прерыванием от ДМА по завершению цикла с частотой 22кгц) - появились сбои записи fatfs в основном потоке, например, вызываю запись 100 байтов, а функция сообщает, что записала 55. И после этого уже не пишет ничего.

Пошел дальше - понизил оптимизацию кода до наименьшей - и ошибки начали валиться просто даже при открытии файлов на чтение.

В итоге, убрал взаимодействие с Vlsi, убрал все возможные DMA и прерывания (кроме прерываний от rtos) и результат такой, что сбои случаются если просто запустить и сразу обратиться к карте, хотя если делать все по шагам - все прокатывает отлично. Опять таки - выкручиваю оптимизацию на скорость - и все начинает работать как бы стабильно. Настораживает, что приложение никогда не зависает, просто я фиксирую ошибки по тому или иному блоку (по SD карте или ошибки коммуникации с VlSI) , связанные, как мне видится с длительными блокированиями задач, хотя тот же fatfs работает синхронно по полингу и откуда взяться такому лагу - пока ума не приложу, в vlsi через, например минуту стабильной работы ни с того ни с сего внезапно переполняется буфер с аудиоданнми, вчера день потерял в поиске, что может быть?????

 

Проект генерировал в STM32CubeMX 4.7, так же стараюсь использовать его обертки для rtos, вроде в них нет подвоха.

настройки прерываний и их приоритеты корректны и за этим следит Cube, тут перепроверял. Глобалный стек - 0x4000, у основной задачи - столько же

Изменено пользователем kan35

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


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

Собственно здесь прикрепил проект для отладки STM3210E-EVAL от STM (STM32cube и IAR/KEIL). Косяк не зависит от проца,компилятра.

https://yadi.sk/d/0fjiGdpJfvD3a

Ниже я привожу код, который я сам писал, все остальное делает конфигуратор.

В конфигураторе настроил обработку 4 каналов Ацп и прерывание от дма после каждого цикла. Как видите - прерывание пустое. Как только включаю оцифровку - FAT даже не монтируется, о чем мигает светодиод :-) ! если у кого есть возможность посмотрите на код, а еще лучше - попробуйте.

/* USER CODE BEGIN 4 */
void LED(int state)
{
 if (state)
   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
 else
   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
}

void Fault(int n)
{
 while (1)
 {
   for (int i = 0; i<n; i++)
   {
     LED(1);
     osDelay(50);
     LED(0);
     osDelay(150);
   }
   osDelay(1000);
 }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
 /* NOTE : This function should not be modified. When the callback is needed,
           function HAL_ADC_ConvCpltCallback must be implemented in the user file.
  */
}
/* USER CODE END 4 */

/* StartDefaultTask function */
void StartDefaultTask(void const * argument)
{
 /* init code for FATFS */
 MX_FATFS_Init();

 /* USER CODE BEGIN 5 */

 if (HAL_ADC_Start_DMA(&hadc1,\
                       (uint32_t *)aADCxConvertedValues,\
                       ADCCONVERTEDVALUES_BUFFER_SIZE\
                      ) != HAL_OK)\
   Fault(4);   /* Start Error */

 if (f_mount(&fs, SD_Path, 1) != FR_OK )
   Fault(1);
 /* Infinite loop */
 for(;;)
 {
   FIL fp;
   unsigned int ar;
   char buff[10];
   osDelay(1);
   if (f_open(&fp, "test.txt", FA_READ) != FR_OK)
     Fault(2);
   if (f_read(&fp, buff, 10, &ar) != FR_OK || ar != 10)
     Fault(3);
   if (f_close(&fp) != FR_OK)
     Fault(4);

 }
 /* USER CODE END 5 */ 
}

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


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

Выяснил, действительно, переполняется буфер SDIO, кривой драйвер, спасибо, ST. Перешел на драйвер с обменом по ДМА. Загрузка проца, прерывания, оптимизации кода - перестали влиять. Надо же!

FreeRTOS был не при чем.

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


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

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

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

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

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

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

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

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

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

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