2620|2

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

帮忙看下这小段代码有什么问题,总是导致假死 [复制链接]

  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. }
复制代码

最新回复

以前在写的时候都加延迟,但是后来特意试过,发现没有延迟也一样写,所以就把延迟去掉了。  详情 回复 发表于 2010-4-19 16:04
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(高级)

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

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

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
以前在写的时候都加延迟,但是后来特意试过,发现没有延迟也一样写,所以就把延迟去掉了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表