реклама на сайте
подробности

 
 
> Конфликт RAM и SPI
zheka
сообщение Jan 19 2017, 06:43
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Jan 19 2017, 09:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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-битных слова.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 19 2017, 18:22
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



/////

Господа, в общем вывод такой - это глюк даже не отладчика, а самого кейла.

Никто мне в переменную ничего не пишет. Об этом свидетельсвтует следующее
1.Несмотря на то, что по сообщениям окна watсh, переменную rx_buffer кто-то упорно насилует, брейкпоинты на запись не срабатывают. При этом они срабатывают когда туда на самом деле осуществляется запись.
2. Как я заметил, байт, который оказывается в буфере, зависит от того, что там было раньше. Если бы шла запись в переменную, то ее содержимое просто затиралось бы конкретным числом, а тут мусор есть производное от первоначального значения. Мне сложно представить себе такой глюк или конфликт с памятью, при котором из буфера что-то будет читаться, затем с полученным результатом что-то делается и результат записывается в ячейку.... А вот на порчу отдельных бит это похоже.
Более того, как я писал, появление левых данных всегда кратковременное, через долю секунды данные возвращаются к исходному виду. Опять таки, мне сложно представить глюк, который считывает данные, гадит, а потом восстанавливает.

Зато это очень похоже на периодическое искажение выведения результата кейлом - то есть данные в буфере постоянны, иногда KEIL считав их, теряет их правильность и выводит на экран бред, но при следующем чтении тех же самых правильных данных все нормально.

Сообщение отредактировал zheka - Jan 19 2017, 18:04
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 20 2017, 10:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(zheka @ Jan 19 2017, 21:22) *
Господа, в общем вывод такой - это глюк даже не отладчика, а самого кейла.

Зато это очень похоже на периодическое искажение выведения результата кейлом - то есть данные в буфере постоянны, иногда KEIL считав их, теряет их правильность и выводит на экран бред, но при следующем чтении тех же самых правильных данных все нормально.

Я бы не спешил ругать Кейл. Всё-таки он полагается на дрова для отладочного адаптера, которые написаны другими товарищами, и в них возможны глюки. Кроме того, весьма вероятно, что в протоколе SWD нет средств контроля целостности данных, поэтому в случае порчи сигналов SWD получите то, что получили. А тут уже вы виноваты - не надо портить сигналы laughing.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 22 2017, 08:58
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(scifi @ Jan 20 2017, 13:33) *
Я бы не спешил ругать Кейл. Всё-таки он полагается на дрова для отладочного адаптера, которые написаны другими товарищами...

Я неоднократно наблюдал глюки отладчика Keil с фирменным родным ULINK в оплаченном пакете. (Проц lpc1765). В том числе и при выводе данных в окне периферии.
Особенно криво он себя ведёт, ну например, если 2 одинаковых задачи запускаются (RTX). Откуда он при этом выводит данные в окно отладки вообще не понятно.
В аналогичной ситуации IAR ведёт себя абсолютно корректно. Даже на сторонней ОСи. По моему это показатель.



Цитата(rudy_b @ Jan 20 2017, 19:34) *
проблема с дебильной периферией STM32

Объективно, я бы так сказал - периферия как периферия.
Есть удачные решения - есть не очень. Но в целом мне она понравилась.
С чем можно было бы согласится, что нет общего подхода к разным периферийным модулям. Но это просматривается почти во всех камнях. Единый подход более менее виден у LPC. Но и там есть к чему придраться.
Наличие флагов, которые сбрасываются при чтении - это много где. Ситуация с MSP значительно хуже. Там часть прерываний сбрасывается путём чтения регистра источника, часть путём принудительного сброса флага, часть чтением спец регистра... Короче вообще бардак. biggrin.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 22 2017, 19:10
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(SasaVitebsk @ Jan 22 2017, 10:58) *
Ситуация с MSP значительно хуже. Там часть прерываний сбрасывается путём чтения регистра источника, часть путём принудительного сброса флага, часть чтением спец регистра... Короче вообще бардак. biggrin.gif

У него периферия реально заточена под общее микропотребление. Все остальное вторично.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 06:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016