STM32 - не работает код при включенной оптимизации

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

STM32 - не работает код при включенной оптимизации

Сообщение VHEMaster »

Привет всем котам! Проблема следующая
Имеется контроллер STM32F407ZET6. Вместе с ним на плате USB флешка, UART и ЦАП.
При выключенной оптимизации код работает без проблем.
СпойлерОбработчик прерываний

Код: Выделить всё

void TIM6_DAC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */

  /* USER CODE END TIM6_DAC_IRQn 0 */
  HAL_DAC_IRQHandler(&hdac);
  HAL_TIM_IRQHandler(&htim6);//Сброс флагов
  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */


  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_L, L_Buffer[AudioPoint]);//Выводим в ЦАП
  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_L, R_Buffer[AudioPoint]);
  print("D %d %d\n\r",2,i,AudioPoint);//Дебаг. 
  AudioPoint++;//Освобождаем ячейку
  if(AudioPoint >= BUFFERSIZE) AudioPoint = 0;
  /* USER CODE END TIM6_DAC_IRQn 1 */

}
СпойлерОсновная программа

Код: Выделить всё

	    	BUFFERSIZE = 128; //Количество сэмплов в буффере
	    	AudioPoint = BUFFERSIZE;
	    	uint8_t Bytes = FileBuff[32];//Байт на сэмпл WAVE
    		length = BUFFERSIZE*Bytes;//Длинна блока
    		uint8_t ftime = 1;//В первый раз(антибаг)
	    	while(f_eof(&File))//Пока файл не кончился
	    	{
	    		if(File.Size-File.CurrentByte < length) length = File.Size-File.CurrentByte;//Антибаг
	    		if(f_read(&File, FileBuff, length)) { print("File read error!",0); goto error; }//Чтение

    			print("R\n\r",0);//Дебаг
	    		i = 0;//Обнуляем указатель
	    		while(i<BUFFERSIZE)//Пока буффер из носителя не будет полностью считан
	    		{
//////////////////////////////////////////////////////////////////////////////
	    			if(i != AudioPoint)//Вот тут вот какая-то херня. Если ячейка буффера ЦАПа освободилась, записываем в неё новое значение
	    			{
	    				L_Buffer[i]  = FileBuff[(i*Bytes)+1]<<8;//Заполняем ячейку буффера "звук"
	    				L_Buffer[i] += FileBuff[(i*Bytes)];
	    				L_Buffer[i] ^= 0x8000;
	    				R_Buffer[i]  = FileBuff[(i*Bytes)+3]<<8;
	    				R_Buffer[i] += FileBuff[(i*Bytes)+2];
	    				R_Buffer[i] ^= 0x8000;
		    			print("F %d %d\n\r",2,i,AudioPoint);//Дебаг
	    				i += 1;//Добавляем единичку
	    			}
//////////////////////////////////////////////////////////////////////////////
	    		}
if(ftime) { AudioPoint = 0; HAL_TIM_Base_Start_IT(&htim6); ftime = 0; }//В первый проход запускаем таймер

}
ftime = 1;
HAL_TIM_Base_Stop_IT(&htim6);//Файл закончился, останавливаем таймер
print("Done! Thanks!\n\r", 0);//Благодарность
error:
while(1);//Программа закончена
Происходит чтение WAV файла в свободные ячейки буффера. Проблема в том, что в основном коде (где выделено) не срабатывает "if" с включенной оптимизацией.
СпойлерВывод с UART при включенной оптимизацией. Не работает!

Код: Выделить всё

Opening "A:\EnterSandman.wav"
R
F 0 128
F 1 128
F 2 128
Заполнение буффера
F 126 128
F 127 128
D 128 0
R
F 0 1
D 1 1
D 1 2
D 1 3
И так далее
СпойлерВывод с UART при отключенной оптимизации. Работает!

Код: Выделить всё

Opening "A:\EnterSandman.wav"
R
F 0 128
F 1 128
F 2 128
F 3 128
F 4 128
F 5 128
F 6 128
Заполнение буффера
F 124 128
F 125 128
F 126 128
F 127 128
D 128 0
R
F 0 1
D 1 1
F 1 2
D 2 2
F 2 3
D 3 3
F 3 4
D 4 4
F 4 5
D 5 5
F 5 6
D 6 6
F 6 7
D 7 7
И так далее
!Скорость ЦАПа была занижена до 5 Гц чтобы данные для отладки не искажались.
И есть ещё проблема. Дело в том, что с выключенной оптимизацией во время воспроизведения файла звук прерывается... Приоритет у TIM6 стоит 0, у USB флешки, с которой происходит чтение, вообще 5. Использую библиотеку HAL для обслуживания флешки. Чтение идёт по одному кластеру размером в 32 килобайта. Звук прерывается как раз во время чтения с флешки. Запись прикрепил. Думаю, оригинал все знают.
Вот как выглядит дорожка
СпойлерИзображение
Изображение
Запись звука тут https://vk.com/maks_naumchuk?w=wall65222672_7202
Или тут http://rghost.ru/8MMx5y4Gt
Помогите решить хотя-бы одну проблему

Использую CooCox CoIDE и ARM-GCC компилятор.

UPD
Проблема с оптимизацией была в отсутствии volatile при объявлении переменных.
Вот новая запись http://rghost.ru/6CT76DDWJ
В ВК тоже обновил
Задержки уже не такие, но перерывы ещё заметны
Всем канифоли :)
https://vk.com/maks_naumchuk
Реклама
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

Re: STM32 - не работает код при включенной оптимизации

Сообщение VHEMaster »

Проблема была из-за багов в драйвере файловой системы. После их исправления всё стало быть отлично. Тему можно закрывать
Всем канифоли :)
https://vk.com/maks_naumchuk
Реклама
Аватара пользователя
ArtDen
Мучитель микросхем
Сообщения: 462
Зарегистрирован: Пн фев 22, 2010 09:12:34
Контактная информация:

Re: STM32 - не работает код при включенной оптимизации

Сообщение ArtDen »

А что за баги? Как исправили?
http://ufa-darts.ru/ - приходи играть в дартс в Уфе
Аватара пользователя
VHEMaster
Потрогал лапой паяльник
Сообщения: 374
Зарегистрирован: Сб июл 14, 2012 09:20:09
Откуда: Украина, город Полтава

Re: STM32 - не работает код при включенной оптимизации

Сообщение VHEMaster »

ArtDen писал(а):А что за баги? Как исправили?
Баг заключался в том, что неправильно заполнялся буфер при выровненном чтении. Т.е. в начале же считывается 44 байта файла WAV, а затем уже по 2048 байта. Т.е. каждый раз при вызове функции чтения носителя часть, или даже все байты, который нужно считать, получаются из буфера, который был заполнен ранее. И вот как раз при чтении части байт из этого буфера, и части из новой порции данных, буфер, отдаваемый в ЦАП неправильно заполнялся. Как-то так
Всем канифоли :)
https://vk.com/maks_naumchuk
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «ARM»