|
Конфликт RAM и SPI |
|
|
|
Jan 19 2017, 06:43
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, я понимаю, что причину моей проблемы вы не найдете, но может быть подскажете, как искать ошибку. А может быть и констатируете, что это не ошибка, а глюк отладчика... Суть такова. Контроллер STM32F103, в нем включен USART. В обработчике прерывания по приему заполняется буфер, объявленный как uint8_t rx_buffer[50]; Буфер кольцевой. Работаю с KEIL. Отлаживаю по SWD, в окно watch я добавил rx_buffer. Проблема в чем - в эту переменную, согласно уведомлениям отладчика, периодически в случайные позиции на мгновение вместо 0x00 записывается 0xFF или 0xAA. При этом единственное место в программе, где в эту переменную что-то пишется - это обработка прерывания по приему, я ставил брейкпоинт на эту единственную строку - не срабатывает. Потому как я для чистоты эксперимента вообще отключил источник данных. Я закомментировал практически всю программу Код main() { while(1) { LCD_DrawFill(0,0,30,30,BLACK); }
} Выяснилось, что глюк появляется когда присутствует именно эта строка. ну и анализ и комментирование строк в этой функции привели к тому, что глюк вызывается при записи в регистр данных SPI3. Я бы обозначил эту проблему, как конфликт SPI и RAM если бы не два "но". 1. В SPI ведется запись еще несколькими функциями, но проблема возникает только в одной из них. 2. Я написал кусок кода, который в цикле проверяет каждый элемент rx_buffer на предмет отличия его от изначального 0x00 и поставил на нем брейкпоинт. Понимая, что проверка и кратковременное изменение буфера могут не совпасть по времени, я запустил программу на ночь, по моим прикидкам буфер должен был быть проверен около 3 миллионов раз. Ни разу програма не засекла вмешательство в буфер. Похожие глюки, с записыванием данных не в те переменные у меня была как-то, когда я объявил безразмерный массив ( uint8_t XXX[]; ) Но в данном случае ничего такого у меня нет. Скажите, возможно ли что отладчик брешет? Как используя средства отдладки KEIL подловить момент записи в переменную и определить кто на нее посягает?
Сообщение отредактировал zheka - Jan 19 2017, 09:59
|
|
|
|
|
 |
Ответов
|
Jan 19 2017, 09:44
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zheka @ Jan 19 2017, 09:43)  Как используя средства отдладки KEIL подловить момент записи в переменную и определить кто на нее посягает? Насчёт Кейла не скажу, но у Вас же Cortex-M3? В нём есть MPU. Выносите rx_buffer в отдельную секцию памяти, выравниваете ещё положение и размер на 64 байта (например), закрываете к ней доступ по записи через MPU, приоткрывая его временно только в точке записи (в ISR) (на всякий случай запретив прерывания на это время (или назначив прерыванию rx_buffer наивысший приоритет из всех)). Если в каком-то другом месте будет попытка записи в эту область - сразу получите исключение, проанализируете его источник - найдёте виновника. Я таким образом не раз решал проблемы со случайными записями в переменные. Цитата(scifi @ Jan 19 2017, 09:51)  Обычно это называют watchpoint, вроде бы. У Кейла это называется data breakpoint. Если настроить всё как надо, отладчик остановится в тот момент, когда процессор попробует записать что-то в указанный диапазон адресов. Он не остановится, если туда полезет DMA, но это не ваш случай, насколько я понял. Плохой метод. Наличие watchpoint-ов вызывает изменение временной диаграммы работы программы (вызывает резкое её замедление). Видимо потому, что анализ условия watchpoint выполняется программно в ПО эмулятора (или отладчика?). Изменение времянки может привести к исчезновению проблемы. Применение MPU - менее инвазивный метод. Ещё другой способ: Запускаете высокочастотное прерывание от любого таймера. Частотой 500-1000кГц (зависит от производительности процессора). Так чтобы оно грузило процессор процентов на 50% или больше. В ISR сравниваете какие-то части rx_buffer с копией (Ваш ISR, который пишет в rx_buffer, должен дублировать запись и в его копию). Назначаете приоритет прерывания записи rx_buffer самым высоким, прерывания от таймера - выше других, но ниже прерывания пишущего rx_buffer. Если при очередной проверке данные не совпали - читаете из стека в какой точке идёт выполнение фоновой программы. Если обработчик таймера будет коротким (лучше на асм), то сможете обнаружить точку модификации с точностью до примерно десятка команд или меньше. Но конечно этот метод сильнее влияет на выполнение самой исследуемой программы чем метод с MPU. Да и весь rx_buffer сразу в одном прерывании не проконтролируешь, только 1-2 32-битных слова.
|
|
|
|
|
Jan 19 2017, 18:22
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
/////
Господа, в общем вывод такой - это глюк даже не отладчика, а самого кейла.
Никто мне в переменную ничего не пишет. Об этом свидетельсвтует следующее 1.Несмотря на то, что по сообщениям окна watсh, переменную rx_buffer кто-то упорно насилует, брейкпоинты на запись не срабатывают. При этом они срабатывают когда туда на самом деле осуществляется запись. 2. Как я заметил, байт, который оказывается в буфере, зависит от того, что там было раньше. Если бы шла запись в переменную, то ее содержимое просто затиралось бы конкретным числом, а тут мусор есть производное от первоначального значения. Мне сложно представить себе такой глюк или конфликт с памятью, при котором из буфера что-то будет читаться, затем с полученным результатом что-то делается и результат записывается в ячейку.... А вот на порчу отдельных бит это похоже. Более того, как я писал, появление левых данных всегда кратковременное, через долю секунды данные возвращаются к исходному виду. Опять таки, мне сложно представить глюк, который считывает данные, гадит, а потом восстанавливает.
Зато это очень похоже на периодическое искажение выведения результата кейлом - то есть данные в буфере постоянны, иногда KEIL считав их, теряет их правильность и выводит на экран бред, но при следующем чтении тех же самых правильных данных все нормально.
Сообщение отредактировал zheka - Jan 19 2017, 18:04
|
|
|
|
|
Jan 20 2017, 10:33
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(zheka @ Jan 19 2017, 21:22)  Господа, в общем вывод такой - это глюк даже не отладчика, а самого кейла.
Зато это очень похоже на периодическое искажение выведения результата кейлом - то есть данные в буфере постоянны, иногда KEIL считав их, теряет их правильность и выводит на экран бред, но при следующем чтении тех же самых правильных данных все нормально. Я бы не спешил ругать Кейл. Всё-таки он полагается на дрова для отладочного адаптера, которые написаны другими товарищами, и в них возможны глюки. Кроме того, весьма вероятно, что в протоколе SWD нет средств контроля целостности данных, поэтому в случае порчи сигналов SWD получите то, что получили. А тут уже вы виноваты - не надо портить сигналы
|
|
|
|
Сообщений в этой теме
zheka Конфликт RAM и SPI Jan 19 2017, 06:43 scifi Цитата(zheka @ Jan 19 2017, 09:43) Скажит... Jan 19 2017, 06:51 zheka ЦитатаКстати, с тактированием всё нормально? Может... Jan 19 2017, 08:05 KnightIgor Цитата(zheka @ Jan 19 2017, 08:43) Господ... Jan 19 2017, 08:32 zheka ЦитатаЯ бы посмотрел (по карте памяти),
Это где пр... Jan 19 2017, 08:59 scifi Цитата(jcxz @ Jan 19 2017, 12:44) Насчёт ... Jan 19 2017, 09:56  jcxz Цитата(scifi @ Jan 19 2017, 12:56) Когда ... Jan 19 2017, 09:59 Obam Опередили про MPU…
PM0056 STM32F10xxx Cortex-M3 p... Jan 19 2017, 10:07  jcxz Цитата(Obam @ Jan 19 2017, 13:07) 0xE000E... Jan 19 2017, 10:36   Obam "Кутузов был без глаза. Нет! У Кутузова н... Jan 19 2017, 11:05    scifi Цитата(Obam @ Jan 19 2017, 14:05) STM чум... Jan 19 2017, 11:18  jcxz Цитата(zheka @ Jan 19 2017, 21:22) Зато э... Jan 20 2017, 10:15   SasaVitebsk Цитата(scifi @ Jan 20 2017, 13:33) Я бы н... Jan 22 2017, 08:58    zltigo Цитата(SasaVitebsk @ Jan 22 2017, 10:58) ... Jan 22 2017, 19:10    jcxz Цитата(SasaVitebsk @ Jan 22 2017, 11:58) ... Jan 23 2017, 06:45     SasaVitebsk Цитата(jcxz @ Jan 23 2017, 09:45) Во мног... Jan 23 2017, 16:12 rudy_b Тут есть еще и проблема с дебильной периферией STM... Jan 20 2017, 16:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|