Димон Безпарольный 2 21 июля, 2022 Опубликовано 21 июля, 2022 (изменено) · Жалоба 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) Вот такими глупостями я уже давно не занимаюсь. Изменено 21 июля, 2022 пользователем Димон Безпарольный 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба 1. Кто такие QUAD_SPI_Enable, QUAD_SPI_Disable, DR_Read? 2. В SST26_ReadStatusRegistr() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 21 июля, 2022 Опубликовано 21 июля, 2022 (изменено) · Жалоба 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; Разницы нет. Оптимизацию также эта функция не проходит. Изменено 21 июля, 2022 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба 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' нет и пр.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dark_ 0 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба Почему бы в отладчике не посмотреть, что выкидывает оптимизация и от этого "плясать"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 6 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба А в описании регистров QUADSPI->DR и CR volatile присутствует? Если нет - это может быть источником проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба Очень советую ваши макросы доступа к аппаратурепереписать в безопасном стиле (те что выражения - окружить скобками, те что функции - do { ... } while (0)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба On 7/21/2022 at 1:24 AM, Димон Безпарольный said: юбая оптимизация (О1-О3) делает проект глючным. Есть какой - нибудь подход чтобы выявить эти глюки? Может кто посоветует как применять Volatile? Keil Небось? После как перешёл на GCC проблемы ушли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба Советую такую пару сделать (кстати, до сих пор процессор не указали) QUADSPI->CR |= QUADSPI_CR_EN_Msk; (void) QUADSPI->CR; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба On 7/21/2022 at 12:46 PM, repstosw said: После как перешёл на GCC проблемы ушли. Отличное "решение", да. On 7/21/2022 at 12:50 PM, GenaSPB said: Советую такую пару сделать (кстати, до сих пор процессор не указали) А почему не __DSB()? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба В 21.07.2022 в 12:55, aaarrr сказал: А почему не __DSB()? DSB может не всегда работать. Иногда лучше сделать обратное чтение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба 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() должна запуститься какая-то транзакция? Если да, то почему нет ожидания ее завершения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 21 июля, 2022 Опубликовано 21 июля, 2022 (изменено) · Жалоба 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: А я бы для начала рекомендовал автору писать код на человеческом Си - например, макрос-функции оформлять как макрос-функции, а не как хрен пойми что, чтобы гадать на ровном месте. Поясните где у меня не пойми что - я перепишу. Изменено 21 июля, 2022 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 187 21 июля, 2022 Опубликовано 21 июля, 2022 · Жалоба Функции помечаются скобками () на конце. Макрос-функции тоже, даже если там одна строчка кода. Посмотрите логанализатором на шину, особенно в сочетании сигналов данных и CS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться