Sagittarius 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба Здравствуйте. Возникла непонятная ситуация. Проц STM32F746, к нему подключено внешнее статическое ОЗУ, 16 бит данных. Скелет программы сгенерен в CubeMX, кеш на команды и данные отключен. Тест простой - сначала пишу во внешнюю RAM 12 штук 32-бит слов (используя memcpy) потом читаю в цикле по одному uint32_t. В зависимости от наличия, частоты и длительности прерываний (простой таймер и инкрементом переменной во внутреннем ОЗУ), паузы между записью и чтением, уровнем оптимизации кода при компиляции иногда происходит сбой - циклов записи на внешней шине всегда 12 а вот циклов чтения иногда проскакивает только 11 (отсутствует выдача сигналов CS и OE). Судя по всему аппаратура проца пропускает первый запрос на чтение, при этом результатом самого чтения оказывается значение, которое последним записывалось во внешнюю RAM (продублированные последние записываемые 16 бит). В зависимости от каких то шаманских действий частота сбоев может быть от 1-2 в секунду до 1-го за 7-8 часов. Пробовал собирать проект в IAR и Keil. Может будут у кого какие мысли по этому поводу? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба Судя по всему аппаратура проца пропускает первый запрос на чтение, при этом результатом самого чтения оказывается значение, которое последним записывалось во внешнюю RAM (продублированные последние записываемые 16 бит). В зависимости от каких то шаманских действий частота сбоев может быть от 1-2 в секунду до 1-го за 7-8 часов. Почему "сбой"? Это же фича - кеширование, нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sagittarius 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба Почему "сбой"? Это же фича - кеширование, нет? 1. кеширование отключено 2. чтение происходит ошибочно, если, к примеру, последним в адрес base[11] было записано число 0x1234xxxx то выполненное сразу после этого чтение по адресу base[0] выдаст 0x12341234, хотя по этому адресу лежит совсем другое значение (по останову в отладчике читается правильное). При этом сам цикл чтения на шине будет отсутствовать. т.е. бага не просто в отсутствии цикла чтения на шине а в ошибочном результате самого чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба В еррате на STM32F42x есть вот такое: Corruption of data read from the FMC Description When the FMC is used as stack, heap or variable data, an interrupt occurring during a CPU read access to the FMC may results in read data corruption or hard fault exception. This problem does not occur when read accesses are performed by another master or when FMC accesses are done when the interrupts are disabled. Workaround Two workarounds can be applied: • Do not use the FMC as stack or heap, and make sure CPU read accesses to the FMC are performed while interrupts are disabled • Use only DMAs to perform read accesses to the FMC. This limitation is present only in revision “A” devices. It is fixed in revision “Y”, “1” and “3”. Теоретически могли по запарке перетащить в новый кристалл старую багу. Ну или новую багу сделали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sagittarius 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба В еррате на STM32F42x есть вот такое: Теоретически могли по запарке перетащить в новый кристалл старую багу. Ну или новую багу сделали. О, спасибо! Коллега рядом как раз на подобное наткнулся, когда другая бага переехала из F4xx в F7xx, была в еррате на 4xx но отсутствовала в еррате на 7xx. Действительно, если прерывания запрещать то все читается нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба О! Тогда сразу видно, с какой версии кристалла можно его применять. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 2 марта, 2017 Опубликовано 2 марта, 2017 · Жалоба В полях mpu для внешней памяти включить совместное использование. Тогда шина будет принудительно морозить cpu и dma на операциях чтения/записи до завершения цикла. Актуально для М4-7. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Здравствуйте! Раз уж разговор о памяти, чтоб не плодить тем, задам вопрос здесть, если можно. Для платки STM32F746-DISCOVERY пытаюсь сосдать проект в Keil5. Использую мастер. При линковке получил ошибку: .\Objects\F7dyscovery.axf: Error: L6982E: AT section glcd_746g_discovery.o(.ARM.__AT_0xC0000000) with base 0xc0000000 limit 0xc003fc00 overlaps address range with AT section lcdconf.o(.ARM.__AT_0xC0000000) with base 0xc0000000 limit 0xc005fa00. Not enough information to list image symbols. . Понятно, что связано с памятью. Что-то не так. Прошу подсказать. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Понятно, что связано с памятью. Что-то не так. Прошу подсказать. Спасибо. Вероятно у Вас заданы две секции с одинаковым абсолютным адресом 0xc0000000. О чём и говорит компоновщик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 14 марта, 2017 Опубликовано 14 марта, 2017 · Жалоба Да. Два конфига одновременно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться