пЕРЕПОЛНЕНИЕ сТЕКА
если перехватывать прерывания и использовать в вычислениях числа типа float,
то - [COLOR=red]internal stack overflow system halted[/COLOR],
увеличил стеки в config.sys и стек самой программы - не помогает.
Если сопроц. есть то все работает.
BC++3.1, model-large, test stack overflow-off, float-emulation.
Если сделать SS equal DS - always, то работает но бывют глюки.
но при компиляции проги задай компилятору емулировать сопроцессор. и все.
в результате твоя прога будет абсолютно независма от того, есть на сисетме сопроцессор или нет.
незнаю чего ты там делаешь.
но при компиляции проги задай компилятору емулировать сопроцессор. и все.
в результате твоя прога будет абсолютно независма от того, есть на сисетме сопроцессор или нет.
эмуляция-то включена, проблема в том что, если делать вычисления с плавающей точкой в обработчике прерывания, то происходит переполнение стека.
эмуляция-то включена, проблема в том что, если делать вычисления с плавающей точкой в обработчике прерывания, то происходит переполнение стека.
А что за прерывание?
Может эмулятор не правильно работатет?
На чем конкретно разваливается?
Очень похоже на то что где-то происходит рекурсия.
int 4a, прерывание от будильника. Если я правильно понял его генерирует биос после irq8, но рекурсии то не должнобыть.
Рекурсия может каким-нибудь образом возникнуть в твоем коде.
На сколько я понял, если взять обработчик и выкинуть, всю работу с float, то работает, а если добавить то не работатет? А пробовал сделать просто одну операцию (например умножение), поставить на нем точку останова и посмотреть, что происходит, но не из среды, а из TD?
Еще пропустил: "Если сделать SS equal DS - always, то работает но бывют глюки" - возможно стек портишь.
Можешь опубликовать код обработчика?
void interrupt far clock_interrupt(...)
{
enable();
_AH=RTC_CLEAR_ALARM; geninterrupt(0x1a);
char c[2],d[2]; int *cx=(int*)c,*dx=(int*)d;
_AH=RTC_GET_DATE; geninterrupt(0x1a); *cx=_CX; *dx=_DX;
year = 100*((c[1]&0x0f)+10*((c[1]&0xf0)>>4)) + (c[0]&0x0f)+10*((c[0]&0xf0)>>4);
month = (d[1]&0x0f)+10*((d[1]&0xf0)>>4);
day = (d[0]&0x0f)+10*((d[0]&0xf0)>>4);
_AH=RTC_GET_TIME; geninterrupt(0x1a); *cx=_CX; *dx=_DX;
hour = (c[1]&0x0f)+10*((c[1]&0xf0)>>4);
min = (c[0]&0x0f)+10*((c[0]&0xf0)>>4);
sec = (d[1]&0x0f)+10*((d[1]&0xf0)>>4);
//next second
if(sec>=59)
{ d[1]=0;
if(min>=59) {c[0]=0; c[1]=hour>=23?0:(((hour+1)/10)<<4)+(hour+1)%10;}
else c[0]=(((min+1)/10)<<4)+(min+1)%10;
}
else d[1] = (((sec+1)/10)<<4) + (sec+1)%10;
_DH=d[1]; _CX=*cx; _AH=RTC_SET_ALARM; geninterrupt(0x1a);
if(CF) return; CF=1;
int i,j; char ain[10];
for(i=0;i<ADSc;i++)
{
pAnalogDataSource->GetData(ain); //virtual
[COLOR=red]sscanf(ain,">%f",&V); //V = atof(&ain[1]);[/COLOR]
//P=(V*1000*vp)/svp;
//...
}
}
///////////////////////////////////////
уже в этом случае, то есть при преобразовании строки в float (sscanf(),atof()), происходит переполнение. А если float не использовать или использовать но не в обработчике, то всё ок.