Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Танцы с Бубном!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SanyaKID
Работаю на отладочной плате 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
vmp
А что с прерываниями? Может, они портят?
Для контроля попробуйте запретить прерывания перед вызовом функции.
И какие адреса передаются в качестве параметров - попадают ли они в ОЗУ (ПЗУ).
SanyaKID
Вполне может быть вызвано прерывание от таймера (Используется операционка RTX). Но дело в том, что регист R14 банкируется, то есть что в FIQ что в IRQ свой собственный R14, который хоть об изменяйся 100 раз, никак не повлияет на R14 вне прерывания.
В функцию передаются указатели на массивы. Сами массивы лежат в RAM.
Были подозрения, что что-то портится в стеке, но я стек увеличивал аж на 1.5к. Не помогло...

Только что проверил в симуляторе Кейла - все работает как часы. Так хочется все свалить на плохое железо, но, как чаще всего бывает, даже в самом неочевидном поведении контроллера виноват как правило софт sad.gif Да и нету под рукой пока другого арма чтоб проверить smile.gif
Сергей Борщ
Цитата(SanyaKID @ Jul 27 2007, 13:57) *
Но дело в том, что регист R14 банкируется
Это еще ни о чем не говорит. Прерывание таймера может вызвать перепланировку, следовательно переключение контекстов и перезапись регистров user-банка. Если в стеке процесса не хватает памяти, то содержимое контекста может быть испорчено и при возврате в этот процесс вы будете наблюдать испорченное содержимое регистров.
SanyaKID
Попробовал отключать прерывания от таймера - таже фигня
GetSmart
Где-то тут Data Abort-ом пахнет smile.gif
Код
0001e4  e1d300b0          LDRH     r0,[r3,#0]
0001e8  e1d110b0          LDRH     r1,[r1,#0]
Сергей Борщ
Цитата(SanyaKID @ Jul 27 2007, 15:01) *
Попробовал отключать прерывания от таймера - таже фигня
Попробуйте запретить прерывания вообще.
GetSmart
А где собсно возврат результата "-1" ?
defunct
Цитата(SanyaKID @ Jul 27 2007, 13:57) *
Вполне может быть вызвано прерывание от таймера (Используется операционка RTX). Но дело в том, что регист R14 банкируется, то есть что в FIQ что в IRQ свой собственный R14, который хоть об изменяйся 100 раз, никак не повлияет на R14 вне прерывания.
Насколько помнится RTX переключает контекст в прерывании на SVSR.
Так что вполне может портить LR.
Andy Mozzhevilov
А какая у вас ревизия чипа ? Случаем не C или D?
А в пошаговом режиме вам удавалось добиваться такого поведения?
А вот темку почитайте, на всякий случай:
http://electronix.ru/forum/index.php?showtopic=33479
SanyaKID
Я был в отпуске... Тока что вернулся. Проблема оказалась действительно в MAM. Его отключение помогло.

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

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

при отключенном МАМ скорость выполнения программы замедляется раз в 5.
Не всегда это приемлемо. Не могли бы вы попробовать поработать с МАМCR=1
и просто пронаблюдать, если подобные глюки появятся, то сообщить.
У меня к сожалению нет сейчас ревизии чипа C или D, а партия спаянных устройств придет
только в середине сентября. Какая ревизия там будет пока не знаю, но могу предположить
с большой долей вероятностью что именно из этих. Хотелось бы заранее подстелить соломку,
хотя с отключенным МАМ мы попробовали, не хватает производительности однозначно
zltigo
Цитата(Andy Mozzhevilov @ Aug 21 2007, 12:37) *
У меня к сожалению нет сейчас ревизии чипа C или D,

После опубликования бага имею в разработке пять экземпляров девайсов 2138 и 2148 с "нехорошими" ревизиями. С MAM=3 не уходил. Подготовил в конфигурационном EEPROM параметр для торможения, но пишу/отлаживаю на полном ускорителе. Как ни странно нималейших проблем. Крутится система, два сильно загруженных SPI, все внешние прерывания задействованы, внутри на прерываниях I2C, SPI, SPI на FIQ, RTC, один/два UART на полных 115200, всего остального тоже хватает. Кода в этих девайсах пока от 50 до 100K. Несколько работают уже круглосуточно под нагрузкой в реальной системе. Проблем нет.
SanyaKID
Попробовал с МАМCR=1 - на старте вылетает в Prefetch abort.
Кода у меня 33к. Забита почти вся RAM. Используется RTX и I2C.
А скорость без МАМ пока вообщем-то приемлема для данного проекта.
Andy Mozzhevilov
Цитата(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 ?
SanyaKID
Я юзаю KEIL. И насколько я понял все настройки там делаются в Reset_Handler'е
zltigo
Цитата(Andy Mozzhevilov @ Aug 21 2007, 14:10) *
Что имеется ввиду? настройка MAМTIM или MAMCR?

MAMCR, естественно sad.gif - третий полный вариант, т.е. = 2 smile.gif
Цитата
А 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
SanyaKID
Во, у меня примерно также. Только перед PLL еще VPBDIV настраивается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.