[an error occurred while processing this directive]
|
Я "накололся" на этом же. Целую неделю "парился", пока понял, откуда "ноги растут". А времени было "в обрез". Ко всему прочему, это был мой первый опыт программирования DSP.
Вобщем, DspLib для 5509 написана "криво". Она не отлаживалась на реальных задачах. Например, функция firdec не работает даже в прилагаемом примере, если параметр децимации D установлен равным 2 (а это наиболее частый в практике случай!). А про использование этих функций в режиме, когда могут срабатывать обработчики прерываний действительно приводит к краху.
Теперь к делу. Благодаря моему коллеге, я справился с глюком в функциях fir и fir2. Что касается firinterp, то времени отладить ее у меня не было. Исправить нужно следующее:
Перед всеми обращениями к регистрам ST0 и ST2 необходимо запретить прерывания и после этого опять включить. Кое-что об этом сказано в эррате CPU_75.
Например, в функциях fir и fir2 есть такая строка:
AND #001FFh, mmap(ST0_55) ;clear all ACOVx, TC1, TC2, C
Вместо нее надо написать:
BSET INTM ; errata CPU_75
nop6
AND #001FFh, mmap(ST0_55) ;clear all ACOVx, TC1, TC2, C
BCLR INTM ; errata CPU_75
Здесь nop6 - это 6 подряд инструкций NOP.
Подобным образом нужно "обрамить" и следующие строки:
1) AND #07A00h, mmap(ST2_55) ;clear ARMS, RDM, CDPLC, AR[0-7] LC
2) OR #ST2mask, mmap(ST2_55) ;config circ/linear pointers
3) AND #0FE00h, mmap(ST2_55) ;clear CDPLC and AR[7-0]LC
Ко всему прочему, нет нужды сохранять в стеке рег. ST3_55, т.е. строки
PSH mmap(ST3_55)
и
POP mmap(ST3_55)
можно убрать.
Я исправил эти файлы и все заработало. Вместо всей библиотеки, я подключаю к проекту только нужные исправленные ассемблерные файлы - так мне удобнее.
А вообще глюки есть даже в таких функциях как сложение и вычитание векторов: add и sub.
E-mail: info@telesys.ru