novlev
Участник-
Постов
116 -
Зарегистрирован
-
Посещение
Весь контент novlev
-
BF518 - слетает программа
novlev опубликовал тема в Сигнальные процессоры и их программирование - DSP
Всем день добрый, прошу помощи у знающих. Прграмма может отработать сутки, двое.., а потом вылететь. Как вариант - портится стек, т к прерывания вложенные, может кто-то что-то не сохраняет, вот пример дизасма: /------------------------------------------------------------------- // Procedure statistics: // Frame size = 172 // Scratch registers used: {R0-R3,P0-P2,I0-I3,B0-B3,M0-M3,A0-A1,ASTAT0-ASTAT1,CC,AQ,LC0-LC1,LT0-LT1,LB0-LB1} // Call preserved registers used: {R4-R7,P4-P5,FP,SP,L0-L3,RETS,RETI} // Registers that could be clobbered by function calls: {R0-R3,P0-P2,I0-I3,B0-B3,M0-M3,A0-A1,ASTAT0-ASTAT1,CC,AQ,LC0-LC1,LT0-LT1,LB0-LB1,RETS,SEQSTAT,SYSCFG,USP} //------------------------------------------------------------------- // line ".\SHR-2.c":4310 LINK 0; [--SP] = RETI; [--SP] = ASTAT; [--SP] = (R7:0); [--SP] = P0; [--SP] = P1; [--SP] = P2; [--SP] = P4; [--SP] = P5; [--SP] = A0.W; [--SP] = A0.X; [--SP] = A1.W; [--SP] = A1.X; [--SP] = L0; [--SP] = L1; [--SP] = L2; [--SP] = L3; [--SP] = I0; [--SP] = I1; [--SP] = I2; [--SP] = I3; [--SP] = B0; [--SP] = B1; [--SP] = B2; [--SP] = B3; [--SP] = M0; [--SP] = M1; [--SP] = M2; [--SP] = M3; [--SP] = LC0; [--SP] = LC1; [--SP] = LT0; [--SP] = LT1; [--SP] = LB0; [--SP] = LB1; L0 = 0; L1 = 0; L2 = 0; L3 = 0; SP += -12; Это обаботчик тика таймера, в нем вызываются др подпрограммы. Может надо все регистры сохранять? Как отлавливать подобные ошибки? -
Продлема решилась странно... /* When Compiler Optimization is active, hardware loops are setup for a while loop */ /* The Loop Count Registers (LC0/LC1) are not necessarily cleared */ sysreg_write(reg_LC0,0); sysreg_write(reg_LC1,0); Эти строки приводили к паузе только на одной железяке. Это строки из кода инициализации, там оптимизатор выключен. Но в основном коде включена максимальная оптимизация по размеру. Может кто объяснит мне темному...
-
Спасибо за ответ, пробовал из spi внутренней, там все норм запустилось. Разводка норм, звона на линиях нет... Именно пауза, без обращений на внешнюю шину...просто что-то ждет.
-
Всем доброе утро! Может кто сталкивался - не стартует программа, пытается вычитать из внешней параллельной флешки и замирает, если через отладчик запустить - все работает и читает, если изменить код инициализации - добавить маркеров пинами - то они все отлавливаются осмыслографом, и иногда через паузу загружается процессор, а иногда так и висит...
-
Вышла студия - VisualDSP++ 5.1.0.
-
Отвечу сам себе - проблема в конвеере команд и прерываниях. Конвеер умудрялся выполнить 2 раза чтение, те железяка отработала клоки и прочее и ушла по прерыванию, а вернулась тудаже - и по новой. Решение - запретить прерывания...если можно. Сейчас пробую дма типа память- память, возможно тоже решение, если нельзя запрещать. Это применительно к bf518f.
-
Доброго времени суток. Может кто сталкивался, как правильно читать пакеты меньше 64 байт на этой микрухе, просто статусные регистры говорят о 64 байтах для всех пакетов, которые меньше 64, но при этом в самом фифо уже норм пакеты, т е не добитые нулями. Как правильно читать в таком случае, не портя фифо?
-
Начните с простого - проверте качество сигналов на шине, я сейчас с этим столкнулся. По быстрому можно проверить сбросив частоту периферии до 80, потом на 100 проверить -у меня на 80 сразу все заработало, что натолкнуло на мысль - идти искать норм осциллограф и смотреть фронты.
-
Проблема была в железе :) Гигагерцовый осмыслограф все показал и рассказал. Пара дорожек звенели, терминаторы были далеко от абонента. Вывод - надо внимательнее проверять шину на предмет отраженных сигналов. Напишу подробнее: в мурзилке на MT48LC8M16A2 есть строки "VDDQ Supply DQ power: Isolated DQ power on the die for improved noise immunity. VSSQ Supply DQ ground: Isolated DQ ground on the die for improved noise immunity." - вот в этом месте земля была через дроссель к основной подключена. В этом и была причина, убрав дроссель получили норм фронты.
-
Спасибо за участие в решениип роблемы, когда я определюсь - все заработает, к этому и иду.
-
Этот адрес вылета не имеет значения, это плод криво залитого кода из-за фиговой инициализации айсом озухи, на реальной железяке инит код норм все делает, - телевизор же работал без сбоев. Сейчас картина уже другая, вылет по реальному адресу, 0х208 - это буду смотреть, что именно не нравится (на демо борде работал и на этом адресе).
-
Запустил код на демоборде - все работает. Оказывается она норм инициализирует озу. А если пристегнуть кастом борд xml к моей железяке - значения в регистры попадают, но в сд стате висит ошибка, т е озу фигово инициализировалась. Вопрос - в чем может быть причина такого поведения?
-
Ну пичальки никакой не вижу, а код ошибки - Instruction fetch CPLB miss 0x2C E CPLB miss on an instruction fetch. Не пойму, что не так с сгенерированой таблицей. Может не в таблице дело? Приведу и таблицу. Что странно - адрес вылета - 0100002E, он вроде как для моего процессора находится в области "резерв". В мимуляторе отработало все как надо... но ему доверять...
-
Даташиты прочитаны, именно из них следует, что визард сам сгенерит несколько масок настройки кеша, и он это делает, и забьет цплд таблицы - и это он делает. Но код вылетает. никаких линухов никто запускать не будет, это гиблый путь. Специфика работы - никакого чужого кода.
-
cplb_miss_without_replacement - откуда ноги уэто йоштбки растут, кто-нибудь сталкивался?
-
Я принудительно линковал все дма во внутреннюю озу, во внешней только картинки и кусок кода, в инит коде я все настраивал под свое железо, рам тестировал долго и нудно, сбоев не было. ДМА в приоритете уже, выставлял с самого начала. Спасибо за ответ. Мне кэш данных и не нужен, только команд, добить бы его... А с кодом в озу можно вести отладку? У меня постоянно вылетает программа в анноу эксепшн, или еще куда.
-
Спасибо, это дело изучу. Программа не влезает в память программ - так и есть, просто много взвалили на железяку, там пара изернетом с птп, нтп, кучей всяго другого, другое оптические интерфяки, жпс глонасс и все не вспомню. Вот чтоб этим всем рулить - надо гуюю, больше всего места скушала программа ее инициализации. Ради спортивного интереса, пересобрал код инициализации с другими параметрами озу, увеличил время на запись (а вдруг) - продвинуласть программа дальше... чо за нах происходит. Терминаторы есть, шина не звенит.
-
Ну...проблем с размещением нет и работой гуи, там все норм как для второго класса безопасности. Проблема с исполнением кода из внешнего озу.
-
Не очень понял о чем Вы, но огромное спасибо, что отозвались. Поясню что я творю. Есть интерфейс для тыкательного экрана, у него есть экраны с контролами, строками и прочим. Key2->normAddr = (unsigned short*)&button2_n[0]; Key2->actAddr = (unsigned short*)&button2_p[0]; Key2->height = 32; Key2->width = 32; Key2->x = 36-(Key2->width)/2; Key2->y = 91-(Key2->height)/2; Key2->pressed = false; Key2->pClick = &CheckControlTouch; Key2->pReDraw = &ReDrawControl; Key2->pAction = &DigitKeyPressed; Key2->refreshed = false; Key2->type = t_button; Key2->digitNumber = 1; Key2->data = (void*)&two; Вот такая простыня - присваивание обработчиков кнопке, рисовалок и и прочего. К сожалению это надо для всех делать - отсюда и простыня. Плюс надо перкинуть картинки кнопок и цифр из пзу в озу, чтобы городить изображение. Вот этот код я хочу разместить во внешем озу, там что-то около твсячи строк - инициализация гуи. Эти константы - продукт линкера, каждый раз меняются (если править код) - пожтому просто массивом хранить не выйдет. tmpValu4e = (unsigned short*)&litButInc_n[0]; for(f=0; f<384; f++) { *tmpValu4e++ = *addrP++; } - а так я картинки перекидываю, таких блоков кода тоже прилично, в памяти программ проца им тоже места не хватило... Да и файловой системы нет у меня, это программа самодельная, без линухов.
-
Если в визарде указать и кэш данных - ничего не работает, если без него - часть кода работает. Кто работал с кодом из озу, подскажите. - иожет надо программно еще настраивать что-то, может визарда встроенного не достаточно? Может есть ограничение на размер кода в озу? Насовал в простыню кода, между циклами копирования данных сунков - код заработал (не до самого конца, но продвинулся), похоже время надо ему было, или синхронизировать кэш. Но послушать человека, который с этим работал, очень хочется.
-
Код есть, и он работает. Мне не очень понятно почему не все исполняется из внешней памяти.. та часть которая работает - долго исполняется, возможно есть какие-то критерии для написания кода...или прагмами надо говорить что-то линкерам/компиляторам...
-
На текущий момент часть проблем решиласть пересборкой проекта, основная простыня кода выполняется, но участок кода, где копируются данные по указателю, который хранится в озу процессора, не идет... tmpValu4e = (unsigned short*)BDigits[0]; for(f=0; f<1457; f++) { *tmpValu4e++ = *addrP++; }
-
Добро времени суток! Проблема заключается в следующем: Программа стала огромной, даже оптимизатор не ужимает ее...вылез я из памяти программ, да еще и под конец сроков работ. Подскажите как правильно разместить код в озу (16М его аж там) и заставить его исполняться. Если просто через #pragma section("sdram0") разместить и галочкой сказать - используй кэш коменд, - ничего не происходит, кроме ошибки при первой записи в регист указателя. Смущает, что на шине с озу сидит дма отображалки экрана, и пара изернетов... не тесно ли там им будет? Выручайте...
-
Прошелся я по всей программе в отладчике. Вывод - какой-то он хитрый, работает код как надо, но часто отображаются левые значения, особенно если внешнее ОЗУ есть. При отрисовке все выводится с нужных адресов...
-
sizeof(digit) = 00000008; #pragma pack(1) typedef struct _digit { fontData* mormAddr; unsigned short height; unsigned short width; } digit; #pragma pack() уже через псевдоним попробовал, определил свойт тип для указателя на беззнаковый шот. Похоже проблема где-то в другом месте, щас раскопаю все сначала...