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

Что делать если большой проект перестает работать при оптимизации?

On 7/21/2022 at 1:52 AM, Forger said:

А что помешало разместить эту функцию и подробности в шапке темы

Какую функцию? На момент написания темы не было известно вообще что происходит. Собственно вся тема - от безысходности была написана. Оптимизация нужна была чтобы ужать код - он не должен быть больше чем 0x4800. Это бутлоадер. Знал бы что здесь такие плаваю - не стал бы писать вообще.

 

On 7/21/2022 at 1:52 AM, Forger said:

по хамски

Это каким надо быть чтобы глумится и требовать к себе уважения.

On 7/21/2022 at 1:54 AM, k155la3 said:

. Тесты с оптимизациями по размеру/скорости - IMHO - для тех случаев, когда вместо жестко-логичных алгоритмов или использования таймеров применяются задержки, реализованные кодом и "просчитанные по тактам участки кода" (тоска по ассемблеру и первым контроллерам). 

Всегда использовал (1). Разово - (2) 

Вот такими глупостями я уже давно не занимаюсь. 

Изменено пользователем Димон Безпарольный

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


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

1. Кто такие QUAD_SPI_Enable, QUAD_SPI_Disable, DR_Read?

2. В SST26_ReadStatusRegistr() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения?

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


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

On 7/21/2022 at 9:11 AM, Arlleex said:

Кто такие QUAD_SPI_Enable, QUAD_SPI_Disable, DR_Read?

#define QUAD_SPI_Disable QUADSPI->CR   &= ~(QUADSPI_CR_EN)
#define QUAD_SPI_Enable  QUADSPI->CR  |=  (QUADSPI_CR_EN)
#define DR_Read *(__IO uint8_t *) & QUADSPI->DR

On 7/21/2022 at 9:11 AM, Arlleex said:

В SST26_ReadStatusRegistr() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения?

Используется Status-flag polling mode. Делал и так:

	QUAD_SPI_WaitBusy();										//Полим флаг Busy регистра QUADSPI->SR
	uint8_t Data = DR_Read;	

Разницы нет. Оптимизацию также эта функция не проходит.

Изменено пользователем Димон Безпарольный

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


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

10 часов назад, Димон Безпарольный сказал:

Проблему локализовал до одной функции. 

 

Цитата

uint8_t SST26_ReadStatusRegistr(void)                            //Функция читает байт статуса 26V016
{                                                                //Для запуска в Quad режиме применить функцию SST26_Enable_Quad();
    QUAD_SPI_Enable;                                            // - Это "макрос" или что это?
    QUAD_SPI_WaitBusy();                                        //Полим флаг Busy регистра QUADSPI->SR
    QUADSPI->DLR = 0;                                            //Читаем 1 байт
//По 1 проводу:
//                   inst IMODE[1:0] ADMODE[1:0] ADSIZE[1:0] ABMODE[1:0] ABSIZE[1:0] DCYC[4:0] DMODE[1:0] FMODE[1:0] SIOO 
    QUADSPI->CCR = 0x05| 1<<8    |  0<<10    |   0<<12   |   0<<14   |   0<<16   |  0<<18  |  1<<24   |  1<<26   | 0<<28;
//По 4 проводам
//    QUADSPI->CCR =        3<<8    |  0<<10    |   0<<12   |   3<<14   |   0<<16   |  0<<18  |  3<<24   |  1<<26   | 0<<28;
    uint8_t Data = DR_Read;                                        //
    QUAD_SPI_Disable;                                            //
    return Data;                                                //
}      

'DummyCycles' внутри 'QUAD_SPI_WaitBusy();' устанавливали? Возможно сама м/с памяти без этого 'DummyCycles', неправильно реагирует и кажется, что "флаг сброшен". Т.е. без оптимизации - все работало и успевало (этот самый поллинг флага QUAD_SPI_WaitBusy();), а с оптимизацией - нет.

Просто как возможный вариант тут ЭТО написал.

Добавлю - чтобы убедиться, что 'QUAD_SPI_WaitBusy();'  неправильно работает достаточно после нее внедрить небольшую задержку - и если код заработает нормально, то дело в этой ф. ('DummyCycles' нет и пр.)

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


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

Почему бы в отладчике не посмотреть, что выкидывает оптимизация и от этого "плясать"?

 

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


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

А в описании регистров QUADSPI->DR и CR volatile присутствует? Если нет - это может быть источником проблемы.

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


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

Очень советую ваши макросы доступа к аппаратурепереписать в безопасном стиле (те что выражения - окружить скобками, те что функции - do { ... } while (0))

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


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

On 7/21/2022 at 1:24 AM, Димон Безпарольный said:

юбая оптимизация (О1-О3) делает проект глючным. Есть какой - нибудь подход чтобы выявить эти глюки? Может кто посоветует как применять Volatile?

 

Keil Небось? :acute:

После как перешёл на GCC проблемы ушли.

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


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

Советую такую пару сделать (кстати, до сих пор процессор не указали)

	QUADSPI->CR |= QUADSPI_CR_EN_Msk;
	(void) QUADSPI->CR;

 

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


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

On 7/21/2022 at 12:46 PM, repstosw said:

После как перешёл на GCC проблемы ушли.

Отличное "решение", да.

 

On 7/21/2022 at 12:50 PM, GenaSPB said:

Советую такую пару сделать (кстати, до сих пор процессор не указали)

А почему не __DSB()?

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


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

В 21.07.2022 в 12:55, aaarrr сказал:

А почему не __DSB()?

DSB может не всегда работать. Иногда лучше сделать обратное чтение.

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


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

On 7/21/2022 at 11:41 AM, AleksBak said:

'DummyCycles' внутри 'QUAD_SPI_WaitBusy();' устанавливали? Возможно сама м/с памяти без этого 'DummyCycles', неправильно реагирует и кажется, что "флаг сброшен".

Это немного другое. Ключевое здесь QUAD_SPI. Т.е. это ожидание готовности интерфейса и к микросхеме не имеет отношения.

uint32_t QUAD_SPI_WaitBusy(void)								//Функция полит флаг Busy регистра QUADSPI->SR
{																//
	unsigned long timerStart = HAL_GetTick();					//
	while (QUADSPI->SR & QUADSPI_SR_BUSY) 						//QUADSPI_SR_BUSY имеет иную полярность чем
		{														//все остальные
			if ((HAL_GetTick() - timerStart) > 10)				//Таймаут в милисекундах
				{												//
					return 1;									//
				}												//
		};														//
	return 0;													//
}																//

 

On 7/21/2022 at 11:58 AM, _dark_ said:

Почему бы в отладчике не посмотреть, что выкидывает оптимизация и от этого "плясать"?

До этого еще не дошел. Вечером посмотрю ассемблерный код.

On 7/21/2022 at 12:24 PM, Alex11 said:

А в описании регистров QUADSPI->DR и CR volatile присутствует? Если нет - это может быть источником проблемы.

А это не volatile:

 

#define DR_Read *(__IO uint8_t *) & QUADSPI->DR

?

__IO и есть volatile.

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


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

8 часов назад, aaarrr сказал:

А почему не __DSB()?

5 часов назад, jcxz сказал:

DSB может не всегда работать. Иногда лучше сделать обратное чтение.

На ARM Cortex-M3/M4 DMB/DSB абсолютно бесполезны, т.к. переупорядоченные доступы к памяти архитектурно запрещены (а DSB требуется крайне редко). К слову, просто. Что у ТС за МК - без понятия.
 

8 часов назад, GenaSPB сказал:

Советую такую пару сделать (кстати, до сих пор процессор не указали)...

А я бы для начала рекомендовал автору писать код на человеческом Си - например, макрос-функции оформлять как макрос-функции, а не как хрен пойми что, чтобы гадать на ровном месте.
 

10 часов назад, Димон Безпарольный сказал:

Используется Status-flag polling mode. Делал и так...

Причем здесь QUAD_SPI_WaitBusy()? Повторю вопрос

12 часов назад, Arlleex сказал:

2. В SST26_ReadStatusRegistr() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения?

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


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

On 7/21/2022 at 4:46 PM, Arlleex said:

Что у ТС за МК - без понятия.

Забыл написать, да. STM32L471. Сейчас в шапку кину.

On 7/21/2022 at 4:46 PM, Arlleex said:

В SST26_ReadStatusRegistr() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения?

Добавил.

	//QUAD_SPI_WaitBusy();										//Полим флаг Busy регистра QUADSPI->SR
	uint8_t Data = DR_Read;										//
	QUAD_SPI_Disable;											//

Но с ожиданием вообще чехарда какая - то. Не читается и не пишется - пока некогда разбираться.

On 7/21/2022 at 4:46 PM, Arlleex said:

А я бы для начала рекомендовал автору писать код на человеческом Си - например, макрос-функции оформлять как макрос-функции, а не как хрен пойми что, чтобы гадать на ровном месте.

Поясните где у меня не пойми что - я перепишу.

Изменено пользователем Димон Безпарольный

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


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

Функции помечаются скобками () на конце. Макрос-функции тоже, даже если там одна строчка кода.

Посмотрите логанализатором на шину, особенно в сочетании сигналов данных и CS.

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


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

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

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

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

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

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

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

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

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

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