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

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


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

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

回复评论 (2)

for(i = 0;i < strlen(snd);i++) /* 发送ACK */
        sysOutByte(0x3f8,snd);

是不是写的太快了,串口写死了?里面加点延迟看看?
点赞  2010-4-19 15:55
以前在写的时候都加延迟,但是后来特意试过,发现没有延迟也一样写,所以就把延迟去掉了。
点赞  2010-4-19 16:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复