|
Танцы с Бубном!, Или повесть о потерянном Link Registr'e |
|
|
|
Jul 27 2007, 10:39
|
Участник

Группа: Участник
Сообщений: 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. Бьюсь головой в стену уже второй день
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jul 27 2007, 10:57
|
Участник

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

|
Вполне может быть вызвано прерывание от таймера (Используется операционка RTX). Но дело в том, что регист R14 банкируется, то есть что в FIQ что в IRQ свой собственный R14, который хоть об изменяйся 100 раз, никак не повлияет на R14 вне прерывания. В функцию передаются указатели на массивы. Сами массивы лежат в RAM. Были подозрения, что что-то портится в стеке, но я стек увеличивал аж на 1.5к. Не помогло... Только что проверил в симуляторе Кейла - все работает как часы. Так хочется все свалить на плохое железо, но, как чаще всего бывает, даже в самом неочевидном поведении контроллера виноват как правило софт  Да и нету под рукой пока другого арма чтоб проверить
Сообщение отредактировал SanyaKID - Jul 27 2007, 11:09
|
|
|
|
|
Jul 27 2007, 12:01
|
Участник

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

|
Попробовал отключать прерывания от таймера - таже фигня
|
|
|
|
|
Jul 30 2007, 09:04
|

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

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

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

|
Я был в отпуске... Тока что вернулся. Проблема оказалась действительно в MAM. Его отключение помогло. То на что я до отпуска безрезультатно потратил 4 дня, сейчас решилось за 1 день. Удачно отдохнул
Сообщение отредактировал SanyaKID - Aug 20 2007, 13:38
|
|
|
|
|
Aug 21 2007, 08:47
|

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

|
Цитата(SanyaKID @ Aug 20 2007, 19:37)  Я был в отпуске... Тока что вернулся. Проблема оказалась действительно в MAM. Его отключение помогло. Помогло полное отключение или перевод в режим MAMCR=1 ? Какая ревизия чипа?
--------------------
Пасу котов...
|
|
|
|
|
Aug 21 2007, 09:20
|
Участник

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

|
Ревизия чипа - С. Я отключил МАМ вообще. С частичным МАМом играться не пробовал, так как, посовещавшись, мы решили не тратить на это время.
|
|
|
|
|
Aug 21 2007, 09:37
|

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

|
Цитата(SanyaKID @ Aug 21 2007, 15:20)  Ревизия чипа - С. Я отключил МАМ вообще. С частичным МАМом играться не пробовал, так как, посовещавшись, мы решили не тратить на это время. при отключенном МАМ скорость выполнения программы замедляется раз в 5. Не всегда это приемлемо. Не могли бы вы попробовать поработать с МАМCR=1 и просто пронаблюдать, если подобные глюки появятся, то сообщить. У меня к сожалению нет сейчас ревизии чипа C или D, а партия спаянных устройств придет только в середине сентября. Какая ревизия там будет пока не знаю, но могу предположить с большой долей вероятностью что именно из этих. Хотелось бы заранее подстелить соломку, хотя с отключенным МАМ мы попробовали, не хватает производительности однозначно
--------------------
Пасу котов...
|
|
|
|
|
Aug 21 2007, 10:01
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|