Login
Username:

Password:

Remember me



Lost Password?

Register now!

Sections

Who's Online
93 user(s) are online (78 user(s) are browsing Forums)

Members: 0
Guests: 93

more...

Headlines






how to work properly with device when you need query every 5 seconds
Home away from home
Joined:
2007/9/11 12:31
From Russia
Posts: 7041
The question comes up after finding that when you need one time in a 5-second query something from a serial device, then if you open-close device for every query, then you have 100% CPU load hit on that time. I.e there is init code:

BOOL initX5000serial(struct DockyData *dd)
{
    
BOOL res FALSE;
    
int8 err 0;

    
dd->port IExec->AllocSysObject(ASOT_PORTNULL);
    if(
dd->port)
    {
        
dd->req IExec->AllocSysObjectTags(ASOT_IOREQUESTASOIOR_Size,sizeof(struct IOExtSer),
                                            
ASOIOR_ReplyPort,dd->portTAG_DONE);
        if(
dd->req)
        {
            
            if(
IExec->OpenDevice("serial.device"1, (struct IORequest*)dd->req0) != -1)
            {
                
// Set parameters to address MCU 
                
dd->req->IOSer.io_Command SDCMD_SETPARAMS;
                
dd->req->io_Baud      38400// 38400 Baud
                
dd->req->io_ReadLen   8;     // 8 bit data
                
dd->req->io_WriteLen  8;     // 8 bit data
                
dd->req->io_StopBits  1;     // 1 Stop bit
                
dd->req->io_SerFlags &= ~SERF_PARTY_ON// No Parity
                
dd->req->io_SerFlags |= SERF_XDISABLED// No Flow Control
                
err IExec->DoIO( (struct IORequest*)dd->req );
                if(
err == IOERR_SUCCESS)
                {
                    
res TRUE;
                }
            }
        }
    }
    return(
res);
}



There is de-init code:

void closeX5000serial(struct DockyData *dd)
{
    if(
dd->dev_open) { IExec->CloseDevice( (struct IORequest*)dd->req ); dd->dev_open FALSE; }
    if(
dd->req) { IExec->FreeSysObject(ASOT_IOREQUESTdd->req); dd->req NULL; }
    if(
dd->port) { IExec->FreeSysObject(ASOT_PORTdd->port); dd->port NULL; }
}



Now if we do something like:

dd->dev_open initX5000serial(dd);
  if(
dd->dev_open)
  {
   
QueryTemp(dd);
   
QueryVoltFan(dd);
  }


We then hit 100% CPU loading every time we query our stuff.

If I remember right, it is correct to open/close the device for every query, right? And it should be not opened all the time?

Any advice is welcome, thanks!

_________________
Join us to improve dopus5!
zerohero's mirror of os4/os3 crosscompiler suites
   Report Go to top

Re: how to work properly with device when you need query every 5 seconds
Just popping in
Joined:
2008/9/20 23:50
Posts: 65
@kas1e

Whether you should leave a device open or not depends on the use case. Could other programs need to access it in between your accesses? Will your having the device open block other accesses? (I'm too lazy to read the serial.device AutoDoc right now )

Again, I'm not sure of the use case. My guess is you have custom monitoring hardware attached to one of the X5000's serial headers. Or is it standard? Ideally, there would be a hardware monitor API that would share out this information to multiple listeners. Then it wouldn't matter much if the "API" blocked other direct access to the serial device.

   Report Go to top





[Advanced Search]



Powered by XOOPS 2.0 © 2001-2016 The XOOPS Project