
ti被硬件置1的情况是,当串行发送缓冲寄存器内的数据被通过txd( p3.1 )发送完毕时( 不同的串口方式置1条件不同 )不是指将数据存入串行发送缓冲器中时ti会被置1,同理ri被置1的情况是当rxd( p3.0 )接收到数据将此数据按位存入串行接收缓冲寄存器内完毕时( 不同串口方式置1的条件不同 )不是指从串行接收缓冲寄存器读完数据时ri会被置1。于逻辑线程对数据的处理方式,这个独立发送线程也维护一个消息队列,逻辑线程要发数据时也只是把数据加入到这个队列中,发送线程循环取包来执行send调用,这时的阻塞也就不会对逻辑线程有任何影响了。之前发过一个帖子,当我是用stm32的spi1(主)和spi2(从)互相通信并将结果通过串口发出的时候,出现的现象是spi1发送spi2接收正常,但是spi2发送spi1接收却接收不到数据,在群里找大神请教了一下问题所在,解释的原因是因为当spi1先发送,那么当spi1发送完毕后,sclk是处于空闲状态的,这时候spi2是无法发送出数据的.我把程序改为spi2先发,然后spi1再发,然后spi1接收,然后spi2接收,这样一来程序就接受正常了.通过这个实验得出的结果是:主spi的sclk只有在发送的时候是有波形的,但是当接收的时候,主设备sclk是没有波形的,我已经在实验中用示波器看过,while循环中只有spi接受函数的时候sclk没有变化一直是低电平,while循环中只有spi发送函数的时候sclk才有波形,所以如果让spi2(从)可以正常的发送给spi1(主),必须spi2(从)先发送然后spi1(主)在发送,这样主就可以提供给从一个时钟信号用来发送.但是疑问又来了,当stm32和外设at45db161进行spi通信读写flash的时候,我看程序是主设备(stm32的spi1)在发送完读取命令后,就没有在发送数据了,然后就开始一直读取at45db161中的数据,居然是可以读取成功的,就是说在和at45db161读取数据的时候,主设备发送完读取命令就没有在发送任何数据而是不断的只读取数据了,那么这时候sclk是从哪里来的呢。
系统一开始运行很正常,但是当接收到第299个数据包时,就发生异常,查看程序日志,得知原来自接收到299个数据包后,就不再解析接收到的数据。我本以为是网络的问题,于是,重启下程序,结果异常发生在了同样的位置。这时,我猜想可能是代码的问题,找到相关代码pthread_create内存泄露,如下:
while (1)

{
len = recvfrom(sock, buf, MAXPACKETSIZE,
0,(struct sockaddr *)&c_addr, &addr_len);

…….
targ = (struct threadarg *)malloc(sizeof(struct threadarg));
memset(targ, 0, sizeof(struct threadarg));
![]()
targ->len = len;
targ->ip = (int)c_addr.sin_addr.s_addr;
memcpy(targ->buffer, buf, len);

printf(”received\n”);
//注:targ程中会被free掉。
pthread_create(&tid, NULL, insertToList, (void *)targ);
}
而pthread_create函数创建失败最可能的原因应该就是系统资源不足,根据经验,线程的默认堆栈大小是1mbpthread_create内存泄露,就是说,系统每创建一个线程就要至少提供1mb的内存,那么,创建线程失败,极有可能就是内存不够用了。使用pthread_create()函数创建线程时,函数第二个参数为null,则使用线程属性的默认参数,其中非分离属性需要程序退出之前运行pthread_join把各个线程归并到一起。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为eagain和einval.前者表示系统限制创建新的线程,例如线程数目过多了。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-108466-1.html
业界良心
朋友来了有好酒