Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


программирование прерываний на С для DSP

Вы не вошли.

 Поиск | Регистрация | Вход 

Evgeny
03.05.2001 14:24:50
#1

Гость

программирование прерываний на С для DSP

Прошу прощения, может это уже слишком специфический вопрос...

Итак, есть библиотека Си для 21xx, там есть функция

void (*interrupt(int, void (*func)(int)))(int);

т.е. при прерывании вызывается функция void func(int), про которую
в документации скромно умалчивается, и в частности, про назначение параметра фунции

второй вопрос - достаточно ли вызова interrupt для установки обработчика прерываний или таки надо еще устанавливать Prog_Flag_Comp_Sel_Ctrl ?

VM
04.05.2001 13:51:08
#2

Гость

Re: программирование прерываний на С для DSP

1) void (*interrupt(int, void (*func)(int)))(int);
Скорее всего, имеется в виду поинтер на обработчик пользователя

2) См. Пример для VisualDSP (моргание пином "флаг0" по таймеру):

#include <misc.h>
#include <signal.h>

int cntTimerInt=0;

void hndlTimer (int sig)
{
static int flag=0;
  switch (flag) {
     case 0: {asm("SET FL0;"); flag=1; break;}
     case 1: {asm("RESET FL0;"); flag=0; break;}
  }
cntTimerInt++;
}

void main(void)
{
timer_off();
timer_set(2941,0,1);
interrupt(SIGTIMER, hndlTimer);
timer_on();
}

Evgeny
05.05.2001 16:48:57
#3

Гость

Re: программирование прерываний на С для DSP

Работает...до тех пор, пока с PC
не  сделаешь пару раз
       set_var(b, L_COMMAND, cmd);
       plx_command(b);

установка
   interrupt(SIGINT2,HandleInt2);
толку не дает, пока не
не изменишь заголовок  2181_HDR.DSP по образу и подобию L-Card/'овского биоса (вполне возможно, что криво :-[ ),
но после этого прерывание по таймеру перестает работать и начинаются прочие глюки...
Попробовал было их описать,  но получается больно длинно...
Может быть найдется пример для IRQ2 ?

PS: кстати, а где б взять 2185_HDR.DSP и все прочее ? или это только в самом большом и последнем VisualDSP ?

VM
05.05.2001 19:00:22
#4

Гость

Re: программирование прерываний на С для DSP

1) А можно подробнее?

2.1) Я бы в симуляторе посмотрел, что там "С" делает, и почему обработчик не вызывается.
2.2) "С" диспетчеризирует прерывания! Т.е. по приходу прерывания вызывается диспетчер "С", а он, в свою очередь вызывает обработчик, который установил пользователь(вся цепочка от запроса на прерывание до "CALL UserHandler" на VDSP - порядка 70 инструкций). Если напрямую поменять вектор прерывания (,и если я правильно понял манипуляции с 2181_HDR.DSP), то диспетчер "C" вызываться не будет, соответственно не будут вызываться обработчики, установленные ф-ей interrupt(..).
2.3) Глючить может в зависимости от содержимого обработчиков, которые прописываются вручную. "С" устанавливает жесткие правила на использование регистров(если обработчик на АСМе, то надо это учитывать)

Evgeny
06.05.2001 03:10:15
#5

Гость

Re: программирование прерываний на С для DSP

дык когда пишешь просто
   interrupt(SIGINT2,HandleInt2);
то в симуляторе все правильно...т.е. в бейкпойнт в обработчике прерывания попадаю.
я подумал что это какие-то особенности реализации IRQ2 на плате

2.2) ох и нифига себе... глазками-то я смотрел, но команды не считал..
70*30 это получается 2 мкс....

Evgeny
07.05.2001 01:10:28
#6

Гость

Re: программирование прерываний на С для DSP

Здравствуйте,
подробное письмо ушло мылом.

Такое  впечатление, что у компиляторов 5.1-6.1 есть проблемы...
или у меня...
Вот решил по образу стандартного биоса сделать интерфейс с PC через переменные в фиксированных адресах памяти,
подцепил файл var.h, добавил подчеркивание к имени переменных, добавил .global, в cишном файле обозвал эти переменные
как volatile extern int, попробовал - вроде бы работает, но дальше началось...даже без irq2
ааааа!!!
вот так всегда.... вот последня мысля  в голову пришла - добавить стека. Помогло! получается, что 200 слов из доков - этого мало...
Так почему эмулятор об этом как партизан молчит ????
Нет слов в адрес Аналог дивайса, и его  мамы...

Хотя с IRQ2 пока проблема остается..

SY,
EK

Evgeny
08.05.2001 00:42:40
#7

Гость

Re: программирование прерываний на С для DSP

До меня дошло...
это компилятор, причем на ровном месте, причем, видимо это этот самый O2 level который отключить невозможно....
----------------

FAQ #: DSP0122
                                                   
    Q. Can I enable/disable optimization with the G21 C compiler?

    A. The compiler always runs with optimization enabled. You can not disable
    optimization. The optimization is set at the -02 level, therefore you do not need to use
    the -O2 switch when invoking G21.

    This FAQ last updated: 12/01/2000
-------------------
...нет слов

VM
08.05.2001 13:30:49
#8

Гость

Re: программирование прерываний на С для DSP

А при чем здесь оптимизация,- нужный код искажается ?

Evgeny
09.05.2001 14:50:27
#9

Гость

Re: программирование прерываний на С для DSP

угу, искажается...
специально выкачал самое распоследнее с
ftp://ftp.analog.com/pub/dsp/tools/Visu … xTools.exe
поставил (отделная поэма) - там оптимизация по умолчанию отключается...
Но там тоже какая-то засада... даже простейшая Си-шная программа:
/************************/
#include <signal.h>

void InitDSP(void);
void hndlTimer (int sig);

main()
{
  InitDSP();

   while (1)
   {;
   };
}

void InitDSP(void)
{  timer_off();
   timer_set(3333,0,1);
   interrupt(SIGTIMER, hndlTimer);
   timer_on();
}

int cntTimerInt=0;
static int flag=0;

void hndlTimer (int sig)
{
   switch (flag)
   {
       case 0:
         flag=1; break;
       case 1:
         flag=0; break;
   }
   cntTimerInt++;
}
/*******************/
При запуске в отладчике ругается
Warning: PMOVLAY or DMOVLAY register should be set to 0, 1, or 2. At Address ...

Если посмотреть, что там пишется, то обнаружится что пишется константа 0x1f

8-(((

VM
10.05.2001 12:12:05
#10

Гость

Re: программирование прерываний на С для DSP

Откомпилированный, рабочий, пример выслан по почте.

1) Проверте тип процессора, указываемый при создании своего проекта.
2) Проверте тип процессора при создании сессии дебагера.
(должны совпадать)

Evgeny
11.05.2001 14:51:56
#11

Гость

Re: программирование прерываний на С для DSP

Прошу прощения - не дошло,
Нельзя ли повторить на evgen[At]laser.ru ?

(приходится таким вот образом спасаться от спаммеров :-(  )

SY,
EK

Evgeny
19.05.2001 13:34:00
#12

Гость

Re: программирование прерываний на С для DSP

Итак, дело было не в бобине...
...а в bin3pci.exe и  SIZE=0x4000

Похоже, что все заработало - и прерывания от таймера, и IRQ2,
причем не только для Visual DSP, но и для v5.1 (хотя оно как-то кривее)
Теперь возникают другие вопросы, но об этом отдельно...

BerSerKer
05.07.2003 10:18:24
#13

Гость

Re: программирование прерываний на С для DSP

Так в чём же было дело то ???