首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

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

2013-01-02 
帮忙看下这小段代码有什么问题,总是导致假死本帖最后由 EthanWT 于 2010-04-19 15:36:35 编辑  VxWorks fo

帮忙看下这小段代码有什么问题,总是导致假死
本帖最后由 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]);
}

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

是不是写的太快了,串口写死了?里面加点延迟看看?

热点排行