📄 getinput.c
字号:
/* DSP32c c-code to support circular input FIFO 8-10-94 LMS
10-31-94 CAC adapted to CAC boards
*/
/* length of integer input sample buffer */
#define FIFO_LENGTH 0x800
#define FIFO_LENGTH_BYTES 0x1000
#define FILL_FIFO 100
void in_int_enable();
extern short in_fifo_buffer[];
extern short *in_pout;
/* global interrupt on flag */
int in_int_flag = 0;
asm float pop_fifo()
{
r4e = in_pout
r2e = *r4
r4e = *r4
a0 = float(*r2)
r4e = r4 + 2
r3e = in_fifo_buffer + FIFO_LENGTH_BYTES
r4e - r3
r3e = in_fifo_buffer
if (ge) r4e = r3
r2e = in_pout
*r2 = r4e
}
asm int get_pin()
{
r1e = r20
}
asm int get_pout()
{
r1e = in_pout
r1e = *r1
nop
}
float getinput()
{
register float x;
register short *pin, *pout;
register int samples_in_buff;
/* if this routine has never been called then start up interrupts */
if (!in_int_flag)
in_int_enable();
/* keep checking the in and out pointer until there are some samples in FIFO */
/* find number of samples in FIFO, take care of circular buffer problems */
pout = (short *) get_pout();
do {
pin = (short *) get_pin();
if (pin >= pout)
samples_in_buff = pin - pout;
else
samples_in_buff = pin + FIFO_LENGTH - pout;
} while(samples_in_buff < FILL_FIFO);
/* read and convert to float */
x = pop_fifo();
return(x);
}
/* interrupt enable function */
void in_int_enable()
{
/* enable real-time serial input interrupts and serial input */
asm("r1 = ibuf");
initialize_ioc();
asm("r1 = pcw; nop; r1 = r1 | 0x1000; pcw = r1 ");
in_int_flag = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -