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