专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VxWorks

帮忙看下这小段代码有什么有关问题,总是导致假死

发布时间:2010-06-14 16:44:36 文章来源:www.iduyao.cn 采编人员:星星草
帮忙看下这小段代码有什么问题,总是导致假死
VxWorks for Pentium,P4的BSP,跑在虚拟机上。程序中需要操作串口,由于BSP中的串口驱动与实际硬件不匹配,导致write()无法使用,所以用sysOutByte()直接对串口进行写操作。
  程序本身是处理数据的,根据收到的不同数据头区分其类型,然后采取不同的处理。有两个任务:一个是接收任务,Select()阻塞在串口,有数据就读入;另一个是用户交互程序,用户可以输入一些指令什么的。都是无限循环任务,前者的优先级设定更高一些。
  下面这段代码位于接收任务中,收到数据后的处理若不加这段代码就正常,两个任务都持续运行。接收任务阻塞在Select()处的时候,用户交互程序是可以运行的。一旦加了最后发送ACK的那个For代码,在接收过一次数据后程序就卡住了,但又不像死机,似乎卡在了接收任务中,去掉后程序又正常了。但是不能不加这些代码,否则无法发送ACK。
  个人觉得逻辑应该没有问题,既然导致假死,是否有一些机制上的问题?还请各位指教。

C/C++ code

if(macrcv[0] == 'D') /* 如果首字符为D,macrcv是一个存放接收数据头的字符串 */
{
    readcnt = 6; /* 读取6个字节,调试时针对调试信息设定的 */
    bzero(indata,100); /* 初始化数据缓冲区,indata存放接收的数据(不包括数据头) */
    read(fd,indata,readcnt);
    printf("\nRead: %s",indata); /* 读取后显示在屏幕上 */

    bzero(snd,10); /* 下面这部分是发送一个ACK信息,包含本地笔终端的地址,确认收到信息 */
    snd[0] = 'A';
    snd[1] = macrcv[2];
    snd[2] = addr;
    snd[3] = macrcv[2];
    for(i = 0;i < strlen(snd);i++) /* 发送ACK */ 
        sysOutByte(0x3f8,snd[i]);
}


------解决方案--------------------
for(i = 0;i < strlen(snd);i++) /* 发送ACK */ 
sysOutByte(0x3f8,snd[i]);

是不是写的太快了,串口写死了?里面加点延迟看看?
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: