|
Танцы с Бубном!, Или повесть о потерянном 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. Бьюсь головой в стену уже второй день
|
|
|
|
|
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
|
|
|
|
|
Aug 21 2007, 11:04
|
Участник

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

|
Попробовал с МАМCR=1 - на старте вылетает в Prefetch abort. Кода у меня 33к. Забита почти вся RAM. Используется RTX и I2C. А скорость без МАМ пока вообщем-то приемлема для данного проекта.
|
|
|
|
|
Aug 21 2007, 11:10
|

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

|
Цитата(zltigo @ Aug 21 2007, 16:01)  С MAM=3 Что имеется ввиду? настройка MAМTIM или MAMCR? Для MAMCR модно только 0, 1 и 2 Цитата(SanyaKID @ Aug 21 2007, 17:04)  Попробовал с МАМCR=1 - на старте вылетает в Prefetch abort. Кода у меня 33к. Забита почти вся RAM. Используется RTX и I2C. А скорость без МАМ пока вообщем-то приемлема для данного проекта. А MAM где настраивается? В low_level_init ?
--------------------
Пасу котов...
|
|
|
|
|
Aug 21 2007, 11:19
|
Участник

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

|
Я юзаю KEIL. И насколько я понял все настройки там делаются в Reset_Handler'е
|
|
|
|
|
Aug 21 2007, 11:45
|

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

|
Цитата(Andy Mozzhevilov @ Aug 21 2007, 14:10)  Что имеется ввиду? настройка MAМTIM или MAMCR? MAMCR, естественно  - третий полный вариант, т.е. = 2  Цитата А MAM где настраивается? В low_level_init ? Раньше, сразу в startup первыми-же командами, было сделано после анонса предыдущего бага с MAMCR=0/1. Код #if CS_PLL_SETUP
ldr r0,=PLLBASE mov r1,#0xAA mov r2,#0x55 ; Configure and Enable PLL mov r3,#(PLLCFG_MSEL|PLLCFG_PSEL); PLL Divider Multiplier str r3,[r0,#PLLCFG_OFS ] mov r3,#PLLCON_PLLE str r3,[r0,#PLLCON_OFS ] str r1,[r0,#PLLFEED_OFS] str r2,[r0,#PLLFEED_OFS] ; Wait until PLL Locked loop_pll: ldr r3,[r0,#PLLSTAT_OFS] ands r3,r3, #PLLSTAT_PLOCK beq loop_pll ; Switch to PLL Clock mov r3,#(PLLCON_PLLE | PLLCON_PLLC) str r3,[r0, #PLLCON_OFS ] str r1,[r0, #PLLFEED_OFS] str r2,[r0, #PLLFEED_OFS] #endif
#if CS_MAM_SETUP ; Setup MAM For LPC21(3/4)X BugFix ldr r0,=MAMBASE mov r1,#3 ; 3ws Slow for 60MHz str r1,[r0,#MAMTIM_OFF] mov r1,#0x02 ; Full MAM str r1,[r0,#MAMCR_OFF ] #endif
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 21 2007, 11:52
|
Участник

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

|
Во, у меня примерно также. Только перед PLL еще VPBDIV настраивается.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|