[ZLG-MCU] uc/os-ii下的LM3S的UART问题 急急急 等待回复

[复制链接]
 楼主| wahahaabc 发表于 2008-5-18 22:15 | 显示全部楼层 |阅读模式
UART发送使用查询式发送,也就是调用库函数UARTCharPut(),源代码如下:<br />void&nbsp;CommSendData(&nbsp;INT8U&nbsp;ch,&nbsp;const&nbsp;INT8U&nbsp;*ptr,&nbsp;INT16U&nbsp;nBytes&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(ch)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;=&nbsp;COMM1_BASE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base&nbsp;=&nbsp;COMM2_BASE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;nBytes--&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UARTCharPut(&nbsp;base,&nbsp;*(ptr++)&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />UART接收采用中断方式,系统开辟一个软件接收FIFO,用一个计数型信号量跟踪这个软件接收FIFO中的有效数据个数,其流程如下:<br />(1)产生串口接收中断<br />(2)读取接收到的字符<br />(3)如果软件接收FIFO没有满,将读取到的字符放入软件接收FIFO中<br />(4)OSSemPost(计数型信号量)<br /><br />在一个任务中,就可以按以下方式取出接收到的数据:<br />(1)OSSemPend(计数型信号量)<br />(2)如果步骤(1)成功,读取软件接收FIFO中的数据<br /><br />现在问题描述如下:<br />用LM3S8962的两个UART,波特率115200,使用“捷通串口调试软件V4.1”,将串口调试软件设置为“发送周期:10ms,连续不断的自动发送”,一次发送的数据量是100个字节,之所以在10ms的周期内发送100个字节,是因为115200的波特率的通讯量极限差不多是每秒10K/S,10ms发送100个字节,则1s就发送10K字节。<br /><br />打开两个“捷通串口调试软件”,每个调试软件对应到LM3S8962的一个UART,按上面的设置不断的连续发送数据,LM3S8962将接收到的数据在从相应的串口发送回来,这样发送一段时间以后,其中一个UART就会再也接收不到数据,而另一个串口还是可以正常收发。???????<br /><br />出现这种情况以后,仔细调试发现。那个接收不到数据的串口的软件FIFO计数值是满的(例如:软件FIFO的大小为100,则软件FIFO计数值就是100),而那个计数型信号量却为0,这样,当产生接收中断以后,发现软件FIFO是满的,则丢弃刚收到的数据,而在一个任务中要执行下面的操作才能接收到数据:<br />(1)OSSemPend(计数型信号量)<br />(2)如果步骤(1)成功,则从软件FIFO中取出数据<br />因为此时计数型信号量为0,所以任务无法从软件FIFO中取数,而任务不取数,则发送接收中断以后,接收中断有发现软件fifo是满的,有不会将数据放入软件fifo。正确的情况是计数型信号量的值应该和软件FIFO中的有效数据个数完全一致。<br />请问这是什么原因引起的??????<br /><br />代码如下:<br />///////////////&nbsp;产生接收中断以后,调用该函数将刚接收到的数据放入软件FIFO///////////////<br /><br />void&nbsp;&nbsp;CommPutRxChar&nbsp;(INT8U&nbsp;ch,&nbsp;INT8U&nbsp;c)<br />{<br />#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_SR&nbsp;&nbsp;cpu_sr;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_SEM_DATA&nbsp;sem;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;COMM_RING_BUF&nbsp;*pbuf;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(ch)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Obtain&nbsp;pointer&nbsp;to&nbsp;communications&nbsp;channel&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf&nbsp;=&nbsp;&Comm1Buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf&nbsp;=&nbsp;&Comm2Buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pbuf-&gtRingBufRxCtr&nbsp;&lt&nbsp;COMM_RX_BUF_SIZE)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;See&nbsp;if&nbsp;buffer&nbsp;is&nbsp;full&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf-&gtRingBufRxCtr++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No,&nbsp;increment&nbsp;character&nbsp;count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(pbuf-&gtRingBufRxInPtr++)&nbsp;=&nbsp;c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Put&nbsp;character&nbsp;into&nbsp;buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pbuf-&gtRingBufRxInPtr&nbsp;==&nbsp;&pbuf-&gtRingBufRx[COMM_RX_BUF_SIZE])&nbsp;{&nbsp;/*&nbsp;Wrap&nbsp;IN&nbsp;pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf-&gtRingBufRxInPtr&nbsp;=&nbsp;&pbuf-&gtRingBufRx[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemPost(pbuf-&gtRingBufRxSem);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Indicate&nbsp;that&nbsp;character&nbsp;was&nbsp;received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />///////////&nbsp;任务调用下面的函数从软件fifo中取数////////////////////<br /><br />INT8U&nbsp;&nbsp;CommGetChar&nbsp;(INT8U&nbsp;ch,&nbsp;INT16U&nbsp;to,&nbsp;INT8U&nbsp;*err)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oserr;<br />&nbsp;&nbsp;&nbsp;&nbsp;COMM_RING_BUF&nbsp;*pbuf;<br />#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_SR&nbsp;&nbsp;cpu_sr;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_SEM_DATA&nbsp;sem;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(ch)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Obtain&nbsp;pointer&nbsp;to&nbsp;communications&nbsp;channel&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf&nbsp;=&nbsp;&Comm1Buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;COMM2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf&nbsp;=&nbsp;&Comm2Buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*err&nbsp;=&nbsp;COMM_BAD_CH;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NUL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;OSSemPend(pbuf-&gtRingBufRxSem,&nbsp;to,&nbsp;&oserr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;for&nbsp;character&nbsp;to&nbsp;arrive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oserr&nbsp;==&nbsp;OS_ERR_TIMEOUT)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;See&nbsp;if&nbsp;characters&nbsp;received&nbsp;within&nbsp;timeout*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*err&nbsp;=&nbsp;COMM_RX_TIMEOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No,&nbsp;return&nbsp;error&nbsp;code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NUL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if(oserr&nbsp;==&nbsp;OS_ERR_NONE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf-&gtRingBufRxCtr--;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Yes,&nbsp;decrement&nbsp;character&nbsp;count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemQuery(pbuf-&gtRingBufRxSem,&nbsp;&sem&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;pbuf-&gtRingBufRxCtr!=sem.OSCnt&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FAIL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;*(pbuf-&gtRingBufRxOutPtr++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Get&nbsp;character&nbsp;from&nbsp;buffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pbuf-&gtRingBufRxOutPtr&nbsp;==&nbsp;&pbuf-&gtRingBufRx[COMM_RX_BUF_SIZE])&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wrap&nbsp;OUT&nbsp;pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf-&gtRingBufRxOutPtr&nbsp;=&nbsp;&pbuf-&gtRingBufRx[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*err&nbsp;=&nbsp;COMM_NO_ERR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(NUL);<br />}
zlgarm 发表于 2008-5-19 08:35 | 显示全部楼层

检查

检查<br />1)&nbsp;OS_CRITICAL_INT_PRIO&nbsp;是否等于0。<br />2)&nbsp;任务堆栈和主堆栈是否溢出。<br /><br />(zlgarm_zsg)
 楼主| wahahaabc 发表于 2008-5-19 10:20 | 显示全部楼层

RE:2楼

(1)OS_CRITICAL_INT_PRIO定义在os_cpu_a.asm中,其值如下:<br />OS_CRITICAL_INT_PRIO&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;5)<br />ZLG公司的移植代码的OS_CRITICAL_INT_PRIO值默认为0,这个偶没有对其更改<br /><br />(2)偶原来也是怀疑“任务堆栈和主堆栈溢出”,于是将任务堆栈和主堆栈都定义的很大,还是同样的问题,程序中定义的堆栈大小如下:<br />UART0任务大小:4096<br />UART1任务大小:4096<br />主堆栈大小(startup.s文件):Stack&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4096<br />并且在UART0和UART1任务中并没有定义太多的局部变量,应该不会造成任务堆栈溢出<br /><br />不知还有什么原因会造成这种问题?请各位大侠多指教
 楼主| wahahaabc 发表于 2008-5-19 13:32 | 显示全部楼层

怎么没人

  
zlgarm 发表于 2008-5-19 18:36 | 显示全部楼层

ARM7出现过

相似的问题,我在ARM7上遇到过。我的情况是波特率为115200时,速度太高了,UCOS-II关了中断做其他事情去,来不及接收。建议你把波特率调小点试试看。<br /><br />(zlgarm_zsg)
 楼主| wahahaabc 发表于 2008-5-26 15:02 | 显示全部楼层

RE:5楼

(1)“建议你把波特率调小点试试看”<br />因为通信协议要求的波特率为115200,且通讯协议不由我们控制,所以,波特率无法更改。<br />(2)“相似的问题,我在ARM7上遇到过。我的情况是波特率为115200时,速度太高了,UCOS-II关了中断做其他事情去,来不及接收”<br />在波特率很高时,如果没有流控,来不及接收只能导致丢失数据。偶的情况和zlgarm大侠的情况不一样,描述如下:<br />“打开两个“捷通串口调试软件”,每个调试软件对应到LM3S8962的一个UART,按上面的设置不断的连续发送数据,LM3S8962将接收到的数据在从相应的串口发送回来,这样发送一段时间以后,其中一个UART就会再也接收不到数据,而另一个串口还是可以正常收发。???????”<br />“UART就会再也接收不到数据”
zlgmcu 发表于 2008-5-26 17:54 | 显示全部楼层

利用FIFO中断接收,可以有效减少中断处理的次数

如果没有FIFO,则每接收一个字节的数据都要中断处理一次,如果系统正忙于其它事情,则可能造成数据丢失。<br /><br />如果利用FIFO,则可以在连续接收多个字节的数据时才中断处理一次,大大减少了丢数据的可能性。接收FIFO未填满而后续数据长时间不来时,也会产生超时中断,能有效避免接收无响应的情况。<br /><br />详见这里的UART原理、用法、库函数及例程:<br />【Luminary开发工具及开发指南】<br /><a href="http://www.zlgmcu.com/luminary/exploitation_guide.asp" target=_blank>http://www.zlgmcu.com/luminary/exploitation_guide.asp</a><br /><br />(zlgmcu_wdx)
 楼主| wahahaabc 发表于 2008-5-27 08:34 | 显示全部楼层

RE:7楼

偶一直都是使用FIFO,接收和发送都是使用中断
john1337 发表于 2011-4-9 09:20 | 显示全部楼层
发送没必要用中断,只需阻塞发送就可以了,不然会加大中断进入的频繁程度,可能会导致你上面遇到的情况。
chenyelong 发表于 2011-4-9 12:31 | 显示全部楼层
刚学习ARM
hxy6951 发表于 2011-4-9 17:53 | 显示全部楼层
会不会是存数据指针和取数据指针初始化的问题
-自己人 发表于 2011-4-9 18:55 | 显示全部楼层
裸机的调试通过没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

627

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

119

主题

627

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部