[转]Xilinx Zynq-7000-ZC702-EVM-xzynq-zc702上运行QNX-PL串口设备驱动遇到的问题

141 篇文章 22 订阅
106 篇文章 5 订阅

如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意

声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即予以改正

锋影

email:174176320@qq.com

 

在ZedBoard上开发基于QNX操作系统PL部分UART设备驱动的过程中遇到了一点问题,问题原因不明但总结下来给大家提供参考,也以便以后对QNX的进一步了解后回顾这些问题。

硬件平台:MIZ702完全兼容ZedBoard
HOST:Windows QNX Momentics IDE
功能:ZYNQ芯片的PL部分实现一路UART,并编写QNX下设备驱动。

 

在读串口时,申请了动态内存保存从串口读到的数据,然后再填充IOV,返回给Client。代码如下:

int io_read(resmgr_context_t *ctp,io_read_t *msg,RESMGR_OCB_T *ocb)
{
int nleft;
int nbytes;
int nparts;
int status;

if((status = iofunc_read_verify(ctp,msg,ocb,NULL))!=EOK)
return(status);
if((msg->i.xtype &_IO_XTYPE_MASK)!= _IO_XTYPE_NONE)
return (ENOSYS);

char* buffer = (char *) malloc(msg->i.nbytes);
memset(buffer,0,msg->i.nbytes);

ocb->attr->nbytes = XUartLite_Recv(UartLite,buffer,msg->i.nbytes);
nleft = ocb->attr->nbytes - ocb->offset;
nbytes = min(msg->i.nbytes,nleft);
printf ("receive %d bytes = '%s' expected read %d \n", nbytes, buffer,msg->i.nbytes);

if(nbytes>0)
{
//set up the return data IOV
SETIOV(ctp->iov,buffer,nbytes);
//set up the number of bytes (returned by client's read())
_IO_SET_READ_NBYTES(ctp,nbytes);

//advanced the offset by the number of bytes
//returend to the client

//ocb->offset +=nbytes;
nparts = 1;
}else
{
//they've asked for zero bytes or they've already previously read everythin
_IO_SET_READ_NBYTES(ctp,0);
nparts = 0;
}

//mark the access time as invalid (we just accessed it)
if(msg->i.nbytes > 0)
ocb->attr->flags |= IOFUNC_ATTR_ATIME;
free(buffer);
return(_RESMGR_NPARTS(nparts));
}

动态内存的大小是以read消息中期望读到的数据长度来决定的,若用cat 命令读取设备驱动信息 即

cat /dev/uartlite

系统会报错:Server fault on msg pass
若在Client中用read读 /dev/uartlite 则没有问题,这个问题的原因是cat 中 read命令中的长度参数是32768,read函数中的长度没有这么大。

总结一下就是:动态申请的内存过大则会导致消息传递错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值