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

 
 
> Танцы с Бубном!, Или повесть о потерянном Link Registr'e
SanyaKID
сообщение Jul 27 2007, 10:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Работаю на отладочной плате OLIMEX Header boards. Проц - LPC2138. Кому интересно можно поглядеть тут http://www.mt-system.ru/p125.mt . Среда Keil. Компилятор RealView.
Есть функция сравнивающая 2 больших массива, где в первых двух байтах длина массивов. По окончании сравнения если равно возвращается 0, если больше 1, если меньше -1. Так вот при возврате "-1" в определенный момент, когда определенное число принимает определенное значение (сравнение производится в цикле), следующий код портит R14.

Код
0001e4  e1d300b0          LDRH     r0,[r3,#0]
0001e8  e1d110b0          LDRH     r1,[r1,#0]
0001ec  e1500001          CMP      r0,r1
0001f0  9a000001          BLS      |L1.508|
                  |L1.500|
0001f4  e3a00001          MOV      r0,#1
0001f8  e12fff1e          BX       lr
                  |L1.508|
0001fc  e3e00000          MVN      r0,#0
000200  e12fff1e          BX       lr


До команды CMP r0,r1 содержимое R14 верное, после нее становится неверным.
Содержимое R0 и R1 таково, что переход идет в метку L1.500 и соответственно возвращается функция не туда откуда вызывалась.

Такой глюк возникает только в определенный момент, то не всегда. Гдето 95% глюка, в остальное время этот момент проходит, но скорее всего при следующей итерации в цикле глюк повторяется.

На что грешить и не знаю даже. В функции нет вообще ни одной команды, как либо работающей с R14.

Бьюсь головой в стену уже второй день sad.gif
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
vmp
сообщение Jul 27 2007, 10:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



А что с прерываниями? Может, они портят?
Для контроля попробуйте запретить прерывания перед вызовом функции.
И какие адреса передаются в качестве параметров - попадают ли они в ОЗУ (ПЗУ).
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Jul 27 2007, 10:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Вполне может быть вызвано прерывание от таймера (Используется операционка RTX). Но дело в том, что регист R14 банкируется, то есть что в FIQ что в IRQ свой собственный R14, который хоть об изменяйся 100 раз, никак не повлияет на R14 вне прерывания.
В функцию передаются указатели на массивы. Сами массивы лежат в RAM.
Были подозрения, что что-то портится в стеке, но я стек увеличивал аж на 1.5к. Не помогло...

Только что проверил в симуляторе Кейла - все работает как часы. Так хочется все свалить на плохое железо, но, как чаще всего бывает, даже в самом неочевидном поведении контроллера виноват как правило софт sad.gif Да и нету под рукой пока другого арма чтоб проверить smile.gif

Сообщение отредактировал SanyaKID - Jul 27 2007, 11:09
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 27 2007, 11:37
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SanyaKID @ Jul 27 2007, 13:57) *
Но дело в том, что регист R14 банкируется
Это еще ни о чем не говорит. Прерывание таймера может вызвать перепланировку, следовательно переключение контекстов и перезапись регистров user-банка. Если в стеке процесса не хватает памяти, то содержимое контекста может быть испорчено и при возврате в этот процесс вы будете наблюдать испорченное содержимое регистров.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Jul 27 2007, 12:01
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Попробовал отключать прерывания от таймера - таже фигня
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 27 2007, 13:32
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Где-то тут Data Abort-ом пахнет smile.gif
Код
0001e4  e1d300b0          LDRH     r0,[r3,#0]
0001e8  e1d110b0          LDRH     r1,[r1,#0]


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 27 2007, 13:34
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SanyaKID @ Jul 27 2007, 15:01) *
Попробовал отключать прерывания от таймера - таже фигня
Попробуйте запретить прерывания вообще.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 27 2007, 13:35
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А где собсно возврат результата "-1" ?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 27 2007, 23:59
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SanyaKID @ Jul 27 2007, 13:57) *
Вполне может быть вызвано прерывание от таймера (Используется операционка RTX). Но дело в том, что регист R14 банкируется, то есть что в FIQ что в IRQ свой собственный R14, который хоть об изменяйся 100 раз, никак не повлияет на R14 вне прерывания.
Насколько помнится RTX переключает контекст в прерывании на SVSR.
Так что вполне может портить LR.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 30 2007, 09:04
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



А какая у вас ревизия чипа ? Случаем не C или D?
А в пошаговом режиме вам удавалось добиваться такого поведения?
А вот темку почитайте, на всякий случай:
http://electronix.ru/forum/index.php?showtopic=33479


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Aug 20 2007, 13:37
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Я был в отпуске... Тока что вернулся. Проблема оказалась действительно в MAM. Его отключение помогло.

То на что я до отпуска безрезультатно потратил 4 дня, сейчас решилось за 1 день. Удачно отдохнул smile.gif

Сообщение отредактировал SanyaKID - Aug 20 2007, 13:38
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 21 2007, 08:47
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(SanyaKID @ Aug 20 2007, 19:37) *
Я был в отпуске... Тока что вернулся. Проблема оказалась действительно в MAM. Его отключение помогло.

Помогло полное отключение или перевод в режим MAMCR=1 ?
Какая ревизия чипа?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
SanyaKID
сообщение Aug 21 2007, 09:20
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Ревизия чипа - С. Я отключил МАМ вообще. С частичным МАМом играться не пробовал, так как, посовещавшись, мы решили не тратить на это время.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 21 2007, 09:37
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(SanyaKID @ Aug 21 2007, 15:20) *
Ревизия чипа - С. Я отключил МАМ вообще. С частичным МАМом играться не пробовал, так как, посовещавшись, мы решили не тратить на это время.

при отключенном МАМ скорость выполнения программы замедляется раз в 5.
Не всегда это приемлемо. Не могли бы вы попробовать поработать с МАМCR=1
и просто пронаблюдать, если подобные глюки появятся, то сообщить.
У меня к сожалению нет сейчас ревизии чипа C или D, а партия спаянных устройств придет
только в середине сентября. Какая ревизия там будет пока не знаю, но могу предположить
с большой долей вероятностью что именно из этих. Хотелось бы заранее подстелить соломку,
хотя с отключенным МАМ мы попробовали, не хватает производительности однозначно


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 21 2007, 10:01
Сообщение #15


Гуру
******

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



Цитата(Andy Mozzhevilov @ Aug 21 2007, 12:37) *
У меня к сожалению нет сейчас ревизии чипа C или D,

После опубликования бага имею в разработке пять экземпляров девайсов 2138 и 2148 с "нехорошими" ревизиями. С MAM=3 не уходил. Подготовил в конфигурационном EEPROM параметр для торможения, но пишу/отлаживаю на полном ускорителе. Как ни странно нималейших проблем. Крутится система, два сильно загруженных SPI, все внешние прерывания задействованы, внутри на прерываниях I2C, SPI, SPI на FIQ, RTC, один/два UART на полных 115200, всего остального тоже хватает. Кода в этих девайсах пока от 50 до 100K. Несколько работают уже круглосуточно под нагрузкой в реальной системе. Проблем нет.


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

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:58
Рейтинг@Mail.ru


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