[an error occurred while processing this directive]
|
Процессор ADSP 2185
Есть код вида:
-------------------8<------------------
int main()
{
while(1)
{
if(ibuf == ibuf_free) contiue;
x = buf[ibuf];
y = buf[ibuf+1];
iwait = buf[ibuf+2];
OutPortX(x,iwait);
OutPortY(y,iwait);
ibuf += 3;
//детали опущены
};
}
int *PFlag_Ctrl_mode = (int *)0x3FE6; // регистр управления доп.флагов
int *PFlags = (int *)0x3FE5; // регистр доп.флагов
int OutPortX(int data)
{
// asm volatile ("AX0=%0;"::"c"(data));
// asm volatile ("IO(0)=AX0;");
io_space_write(0x0, data);
*PFlag_Ctrl_mode = 3;
/* установка флагов для строба */
*PFlags = 0x01;
/* задеpжка строба */
asm volatile ("AX0=%0;"::"c"(l780.WaitStrob));
asm volatile ("CNTR=AX0;");
asm volatile ("DO outPort_WaitStrobX UNTIL CE;");
asm volatile ("outPort_WaitStrobX: NOP;");
*PFlags = 0x00;
/* Задержка */
asm volatile ("AX0=%0;"::"c"(wait));
asm volatile ("CNTR=AX0;");
asm volatile ("DO outPort_WaitX UNTIL CE;");
asm volatile ("outPort_WaitX: NOP;");
}
int OutPortY(int data)
{
//аналогично
}
-------------------8<------------------
Функции OutPortX и OutPortY записывают в порт 0 некие значения, выставляют строб через регистр доп.флагов и делают задержку. Причем выход всего этого наблюдается глазками в виде 2D картинки.
Буфер buf значений x, y и задержки заполняется с хоста, если буфер пустой - делается continue.
Теперь переходим к чудесам. Через много-много минут после старта, в зависимости от распложения звезд и фаз луны, получается такая вещь:
Буфер пустой. Записываем одну порцию данных.
OutPortY - Выполняется сразу и это видно глазками сразу.
OutPortX - тоже выполняется, но глазками этого не видно. Указатели буфера изменяются и буфер опять пустой. Этовидно с хоста - глазками в дебаговом выводе хостовой программы. После чего хостовая программа напрочь останавливается - на брекпойнте в отладчике и заведомо ничего не делает, прочих барабашек тоже не наблюдается.
Теперь обещанное чудо: через минуты 2-3 глазками видно что значение X на выводном устройстве меняется на заданное....
Че делать - ума не приложу.
Толи какая-то зука так хитро код ломает, толи чего с флагами происходит.
В VDSP 2.0 такого не наблюдалось, другой проект с более напряженными условиями по прерываниям под 3.5 работает без таких проблем.
E-mail: info@telesys.ru