当前位置:  技术问答>linux和unix

请大家看看这段串口代码在运行时占用100% Cpu资源的问题!

    来源: 互联网  发布时间:2015-09-22

    本文导语:  代码如下,该代码因为比较长,所以简化了一下,只帖出关键部分。该程序在Linux下已经编译通过并可以运行,经验证接收到的数据也正确,但是占用系统资源为100%,请问能优化一下吗?我还要在接收数据的同时处...

代码如下,该代码因为比较长,所以简化了一下,只帖出关键部分。该程序在Linux下已经编译通过并可以运行,经验证接收到的数据也正确,但是占用系统资源为100%,请问能优化一下吗?我还要在接收数据的同时处理数据。

/* Open serial port ComPort at baudrate baud rate. */  
INT32 OpenComPort (INT32 ComPort, INT32 baudrate, INT32 databit,const char *stopbit, char parity) 
{
}

/* close serial port by use of file descriptor fd */ 
void CloseComPort ()
{
    /* flush output data before close and restore old attribute */ 
    tcsetattr (fd, TCSADRAIN, &termios_old);
    close (fd);
}

INT32 ReadComPort (void *data, INT32 datalength)
{
    INT32           retval = 0;
    FD_ZERO (&fs_read);
    FD_SET (fd, &fs_read);

    tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
    tv_timeout.tv_usec = TIMEOUT_USEC;
    retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
    if (retval) {
        return (read (fd, data, datalength));
    }
    else
        return (-1);
}

/* send file const char *pathname */
INT32 SendFile ()
{
    while (1) { 
        SetPortSig ();
    }                           /* end of while (1) */

    fflush (stdout);
    fflush (stderr);
    close (fd);
    return (0);
}

static void signal_handler_IO (int status)
{
    char            recvbuf[CHAR_MAX];
    int             iReadCount = 0;
    iReadCount = ReadComPort (recvbuf, sizeof (recvbuf));

    printf ("nRead = %d", iReadCount);
    
    static int      ii = 0;
       if (ii++ > 1000) {
       close (iFile);
       return;
       }
       write (iFile, recvbuf, iReadCount); 
}

static int SetPortSig ()
{
    sigaction_io.sa_handler = signal_handler_IO;
    sigemptyset (&(sigaction_io.sa_mask));
    sigaction_io.sa_flags = 0;
    sigaction_io.sa_restorer = NULL;
    sigaction (SIGIO, &sigaction_io, NULL);

    /* allow the process to receive SIGIO */
    if (-1 == fcntl (fd, F_SETFL, O_ASYNC))
        return (-1);
    if (-1 == fcntl (fd, F_SETOWN, getpid ()))
        return (-1);
    /* Make the file descriptor asynchronous (the manual page says only
       O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
    return (0);
}

int main ()
{
    if (OpenComPort (0, 115200, 8, "1", 'N')) {
        fprintf (stderr,
                 "Make sure /dev/ttyS0 not in use or you have enough privilege.n");
        exit (-1);
    }

    SendFile ();
    CloseComPort ();
    exit (0);
}


|
~~~snip~~~
    while (1) { 
        SetPortSig ();
    }                           /* end of while (1) */
~~~snip~~~

这里是个死循环,当然会把CPU给用光了
循环一次睡个10毫秒吧

|
while (1) { 
        SetPortSig ();
    }     

fflush (stdout);
    fflush (stderr);
    close (fd);
    return (0);

没细看 不过怀疑上面while(1){} 后面的程序执行不到 while 内不加延迟是个不好的习惯
如果真的需要时时不停 至少也需要等等什么需要的资源做个信号量什么的

|
同意,如果SetPortSig不是阻塞的话,自然就会占用率100%了……

|
忙等,换

|
-_-b

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • RH9下装了wine-2005011,运行qq提示说有问题。大虾帮忙看看。
  • 不能运行编译出来的程序,请大家帮忙看看
  • 运行JAVA的出错信息,麻烦各位帮我看看
  • 为什末我的程序不能运行?大家帮忙看看!
  • 各位师兄师姐再帮忙看看为什么下面的代码运行时出错?
  • javac不能运行问题!!wjmmml给看看呀!
  • linphonec编译通过,但是运行的时候却提示很多错误......请高手看看
  • 书上的一个shell,运行不过,帮忙看看,小女在此谢过!!!
  • 我刚开始学着写makefile文件,可是第一次就运行不过去,请大家帮忙看看
  • 请高手帮我看看,运行出错的SQL Exception
  • 帮忙看看数据库的程序,运行不出来
  • 用VMWare运行 Linux的兄弟近来看看,帮忙~~~~~多谢!
  • 大家来帮我看看这个简单的pipe应用,有什么问题.运行结果怪怪的
  • 进来看看,怎样监控一个程序开始运行的消息?
  • <Thinking in Java>的例子,运行出问题,帮我看看是什么问题...
  • 运行一个RMI时报了以下的异常,请各位高手看看可能是什么原因?
  • 请大家帮我看看这样做来确保UNIX某程序同时只有一个进程运行可以吗?
  • 帮我看看java为什么不能运行(源代码)
  • 师傅们,帮我看看这段代码把,我用jb运行时他只向数据库中添加了两条记录。
  • 帮忙看看为何Servlet不运行?
  • 简单!看看这个方法!简单!看看这个方法!
  • linux高手看看
  • 好消息,近来看看......
  • 我想看看有关Linux和Unix的源码,有什么好的建议
  • 想看看linux的内核源代码!从哪里开始!给点建议!!
  • 我初学JAVA,大家愿意交朋友的进来看看!留QQ的给分啊!
  • 关于全选的问题大家帮忙看看~
  • jsp论坛,大家快去看看,解决树形目录http://52jsp.126.com
  • 各位大侠,小侠,快过来看看。
  • 看过操作系统设计与实现的进来看看
  • 请进来看看!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3