|
Здравствуйте!
Используем в своих проектах контроллер RTU188bs с проц. RDC ,биос 2.4 от 31.08.05.
На всех контроллерах проевляется следующая ошибка:
при записи данных(переодически 1 в час) в FDD в нормальном режиме наблюдается
задержка 3-4 сек (наверно связанная со стиранием страницы), через некоторое случайное время пауза при записи проподает, хотя данные нормально пишутся и читаются, но если сбросить контроллер все
записанные данные(после проподания паузы) проподают!
Для записи данных использую функции ReadRam и WriteRam, для инициализации InitBackupRam.
В проекте используются прерывания 0x11(COM2),0x12(Timer1),0x14(COM1).
#include <sys\stat.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#define MaxAdrRam 60000
#define lenbuf 100
int handle=0; //handle of file
//=======================================================
//============= CloseFile =========
// close file 'flash.dat'
//in:
//out:
void far CloseFile(void)
{
close(handle); // close file
}
//=======================================================//================== flush
// save data from dos buffer in FDD
//in:
//out: 1 - err write file
// 0 - OK
BYTE flush(int handle)
{
int duphandle;
/* make a duplicate file handle */
duphandle = dup(handle);
/* close the duplicate handle to flush the DOS buffer */
if (close(duphandle)==-1) return True;
else return False;
}
//=======================================================
//========================== InitBackupRam
// open and creat file 'flash.dat'
//in:
//out: 1 - err write file
// 0 - OK
BYTE far InitBackupRam(void)
{
DWORD i,Max_i;
BYTE buf[lenbuf];
if ((handle=open("data.dat", O_RDWR|O_BINARY))==-1)
{
_fmode = O_BINARY;
handle=creat("data.dat", S_IREAD |S_IWRITE);
//clear buffer
for (i=0;i<lenbuf;i++) buf=0;
Max_i=MaxAdrRam/lenbuf;
// save file
for (i=0;i<Max_i;i++) write(handle, buf, lenbuf);
close(handle);
handle=open("data.dat", O_RDWR|O_BINARY);
}
return 0;
}
//=======================================================
//============================ ReadRam
// Read data in FDD
//in: linaddr - adres in flash
// ptr - pointer data
// qty - caunt data
//out: >0 - err read
// 0 - Ok
BYTE far ReadRam(WORD linaddr, BYTE *ptr, WORD qty)
{
int result=False;
if (handle==-1) result=True;
else //set offset
{
result=lseek(handle, linaddr, SEEK_SET);
if (result==-1) result=True;//return True;
else
{
ResetTimeWDT();
result=read(handle, ptr, qty);
if (result==-1) result=True;//return True;
}
}
return result;
}
//=======================================================
//========================== WriteFlash
// Write data in FFD
//in: linaddr - adres in flash
// ptr - pointer data
// qty - caunt data
//out: >0 - error write
// 0 - Ok
BYTE far WriteRam(WORD linaddr, BYTE *ptr, WORD qty)
{
int result=False;
if (handle==-1) result=True;
else //set offset
{
result=lseek(handle, linaddr, SEEK_SET);
if (result==-1) result=True; //return True;
else
{
ResetTimeWDT();
result=write(handle, ptr, qty);
if (result==-1) result=True;
else flush(handle);
}
}
return result;
}
|