3.freertos学习stm32f2驱动STM32F2x7以太网FreeRTOS下问_第1页
3.freertos学习stm32f2驱动STM32F2x7以太网FreeRTOS下问_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32F2x7 以太网 FreeRTOS 下驱动问题的说明STM32F2x7 FreeRTOS 下网络压力测试错误无法恢复一.前言很多朋友反映 ST 官网的例程 stsw-stm32060(也就是 STM32F2x7 的以太网例程)中的 FreeRTOS 驱动有问题,表现为在网络压力测试下向 STM32 进行测试,过段时间后会出现无法恢复的网络延时,甚至出现不通(网络不通的情况,注意不是超时)。事实上,ST 的工程师已经发现了这个 bug,他们在 stsw-stm32070(STM32F4x7 的以太网例程,不过 STM32F2x7 还没有更新这个驱动)中修复了这个 bug。但是许多朋友并

2、不知道这件事,这篇文档就是对这个问题进行一些说明,另外将新的驱动移植到了 STM32F2x7 中(暂时就叫做STM32F2x7_ETH_LwIP_V1.2.0(RC)) :-D。二Stsw-stm32060 中产生原因解释这个问题前,首先要对 ST 的驱动程序进行一些说明,以太网的数据是通过 FIFO 送入 DMA 缓冲区的,lwip 的底层输入函数(ethernetif_input 进程)将数据从 DMA 缓冲区拷贝到协议栈缓冲区,数据由协议栈自行处理(tcp_ip 进程)。1. 以太网的 DMA 有两个拥有者主机:数据可以被处理;DMA 自身:只有在这种情况下DMA 可以接收数据并产生中断

3、。特别需要注意的当 DMA 描述符所对应的缓冲区满的时候,该描述符会为主机所拥有;驱动程序是将数据拷贝到 lwIP 的数据缓冲区后将该 DMA 拥有者置为 DMA 自身。2. ST 的例程是采用中断机制来处理以太网的数据接收FreeRTOS 下使用 Counter Semaphore 来对中断进行描述(Counter Semaphore 的增长是在中断处理函数中的),中断服务程序(ethernetif_input,后文称这个函数为 ISR,但这个任务并不在中断处理函数中,这个任务平常是阻塞的,只有得到信号量后才会运行)仅处理一个以太网 packet。正常情况下,在数据包到达 STM32 的以太

4、网接收缓冲区时,会进入中断,中断程序会将 CounterSemaphoare+1,从而触发中断服务程序 ISR(ethernetif_input)对这个包进行处理。但是,如果有数据包送到接收缓冲区,但是没有及时产生中断的话(在操作系统中这是非常容易引起的,比如更高级的中断或者临界代码,这些操作都会掉其它中断)。此时就会发生一种奇怪的现象,即 Counter Semaphore 的值与数据缓冲区的 packet不对应。如下图所示这个时候网络状况就非常糟糕了,实际的ISR 程序执行的非常晚,表现的方式就是大量的的延时甚至是 Timeout。见下图。Counter Semaphore3567815D

5、MA BufferData1Data2Data3Data4Data5Data6Counter Semaphore123456DMA BufferData1Data2Data3Data4Data5Data6但这还不是最糟糕的,一旦 DMA Buffer 满了,同时 Counter Semaphore 中没有任何可用信号量。按照刚才提到的,DMA 是无法再接收数据并产生中断了(RBUS = 1),即无法进入中断处理函数,从而的响应就不是 timeout,而是 IP 无法到也无法触发触发中断服务程序。网络就表现为断线。此时达(我在写这篇文档时候没出现这个情况,所以没有截图,但是以前是遇到过的)。三.

6、 Stsw-stm32070 的改进1. ethernetif_input 中处理多个以太网 packet,即只要进入这个程序,就会将以太网的缓冲处理完。sic struct pbuf * low_level_input(struct netif *netif)if (p != NULL)DMARxDesc = frame.descriptor; bufferoffset = 0;for(q = p; q != NULL; q = q-next) /* 处理完缓冲区*/* 将缓冲区归还给 DMA,从而允许新的中断产生 */ DMARxDesc =frame.descriptor;for (i=

7、0; iSeg_Count; i+)DMARxDesc-Sus = ETH_DMARxDesc_OWN;DMARxDesc = (ETH_DMADESCTypeDef *)(DMARxDesc-Buffer2NextDescAddr);DMA_RX_FRAME_infos-Seg_Count =0;/* 出错处理,置位 RBUS */if (ETH-DMASR & ETH_DMASR_RBUS) != (u32)RESET)ETH-DMASR = ETH_DMASR_RBUS;ETH-DMARPDR = 0;2. FreeRTOS 下中断采用二值信号量来触发阻塞任务。void ETH_IRQH

8、andler(void)./* 中断后二值信号量,从而唤醒任务 */if ( ETH_GetDMAFlagSus(ETH_DMA_FLAG_R) = SET)xSemaphoreGiveFromISR( s_xSemaphore, &xHighriorityTaskWoken );大家可以简单分析一下,在这种情况下,是不会出现 stm32060 中的。丢包和延时仍然是可能出利用新的驱动做的测试,2 个tester(10ms, 1kbytes),同时还打开 http 服务(事(1s, 1000bytes),这个测试压力比许多应用要大很现的。这是实上已经 http 已经完全没有响应了)和 cmd 的多,stm32F4x7(168MHz)仍然能保持网络的畅通性。四. 结语可以看出新的驱动确实较之过去有了明显的。由于 STM32F4 和 F2 的以太网外设是一样的,所以驱动也

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论