当前位置: 代码迷 >> VxWorks >> 有关信号量,内存划分的有关问题
  详细解决方案

有关信号量,内存划分的有关问题

热度:534   发布时间:2016-04-28 11:31:41.0
有关信号量,内存划分的问题
下面是一个串口接收数据的程序,我希望在接收当前数据的过程中,如果再来一组数据,需要把当前的数据接收完毕之后再接收后来的数据,保证数据正确性,用了2进制信号量

semRecv = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
int tyRecv(int fd)
{
int readCnt0;
char rd;
char buff[512];
int i;
semRecv = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
FOREVER

{

i=0;
taskDelay(50);
ioctl(fd,FIONREAD,(int) &readCnt0);
semTake(semRecv, WAIT_FOREVER);
if(readCnt0>0)
{
while(readCnt0>0)
{
read(fd,&rd,1);
readCnt0--;
buff[i++]=rd;
}
buff[i]='\0';
printf("%s\n",buff);
 
}
semGive(semRecv); 
}

}

但是接收数据的时候如果同时来了两个数据,还是一起显示出来了,并没有分2次显示
请问问题是出在哪里了?
另外,再问一个问题,我想把采集到的数据放到内存中的一个固定地址,需要怎么做?

------解决方案--------------------
   硬件的串口接收缓冲区接收数据是硬件自动完成的。信号量在这里使用不太合适。当前一组数据接收完之后,如果你没能及时显示,后一组数据也会接收完毕。一旦你显示第一组数据,那么第2组数据也会紧接着显示,形成两组同时显示的效果。而信号量的逻辑并没有任何错误。
   如果你希望每次写到某个固定的物理地址,那么可以强制性的将一个数组定义到某一绝对地址的内存上,这要求你知道该段内存存在。并且访问该段内存或数组时,需要像访问外设一样来进行访问,也就是要用驱动函数。因为,操作系统禁止用户直接访问硬件设备。
  相关解决方案