原创 搞定了coldfire v1开发板的mqx以太网驱动

2010-12-23 16:57 2965 7 8 分类: MCU/ 嵌入式

NSCF51AC-R1开发板其他工作早就做完了,但板子上的那个enc28j60的驱动一直没搞定,从而导致tcp/ip跑不了。MQX有自己的tcp/ip协议栈和相应的以太网驱动框架。先写了个,测试发现IRQ中断总是不触发,后来看mqx手册,发现irq这类NMI中断是不能用_int_install_isr安装中断服务程序的,必须用_int_install_kernel_isr,但kernel isr不能调用任何mqx函数,我的理解这是基本上没什么用的了,但我没试验,也可能我理解错误,要不然这个kernel isr等于是没有任何意义了。


不管是那种情况,总之是发现一个奇怪问题,中断总是不触发,原因不明,我后来没仔细跟踪,这个或许还是要花点时间来跟踪下的,不然总是不知道原因。


随后采用了个方案,用软件定时器来模拟中断,就是定时查询寄存器标志位,判断是否有数据包接收或者发送是否完成,这个开始很好,ping很正常,连续ping上万次都全ok,可是一跑web server,就发现马上跑飞,系统彻底死掉。原先以为是定时器周期太长或太短导致,试验了几种周期,但均不理想。


于是换了个做法,在enc28j60初始化时创建了个高优先级的任务,该任务poll寄存器标志,然后休眠,再poll,休眠时间是1ms,这样似乎好点,但仍出现运行web server时候系统跑飞的问题。


最后找到原因,是因为接收buffer只有一个,而不采用中断方式处理数据还是慢的,导致客户端大量的数据包拥挤着来不及处理,接收buffer在不断的倒来倒去的过程中,上层的协议栈会方位无效的buffer,导致跑飞,现在是用了4个小buffer,2个大buffer,根据接收到的数据包的大小,分别放在小buffer或大buffer中,驱动中维护了一个类似链表的东西来管理这些buffer,这样就没有跑飞的现象了。但web server时不时仍会死掉,跟踪发现,总是分配tcb失败,这个最后修正的办法是修改了enc28j60接收数据包函数的bug(这个跟u-boot和linux下的enc28j60不一样,主要是mqx的架构跟他们不一样的,直接拿来用似有bug),并把软件定时器的周期调小了点,从原先的5ms调到2ms,测试发现还算正常,没发现什么问题。


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-7-15 10:45

与中断触发的方式相比,查询的效率总是低的,占用了过多的CPU资源,导致性能低下。

相关推荐阅读
用户1361860 2012-06-28 23:44
Nicrosystem Freescale Kinetis教程---SDHC
这是研究生翻译的SDHC的中文文档,里面很多句子不通,但我现在没时间去修改了。先放出来,应该还是会有一点作用  ...
用户1361860 2012-06-26 12:39
Nicrosystem Freescale Kinetis教程--低功耗定时器
Freescale Kinetis内部集成了一个独特的低功耗定时器,它可以在系统处于低功耗模式下,仍然以极低功耗运行,可以用于在适当时候唤醒系统进入正常工作模式  ...
用户1361860 2012-06-24 22:11
Nicrosystem Freescale Kinetis教程----RTC实时时钟
Nicrosystem的飞思卡尔kinetis教程之片上RTC  ...
用户1361860 2012-06-22 10:21
TI C2000微控制器指南
这是官方的C2000的介绍,C2000做电机控制那是业界最好的。  ...
用户1361860 2012-06-20 23:52
Nicrosystem Freescale Kinetis教程--PIT定时器教程
这是PIT定时器的教程,PIT是 Kinetis支持的另一种定时器,相对于上一讲的flextimer要简单。 今晚赶到北京,到宾馆发一篇博客  ...
用户1361860 2012-06-19 13:15
Nicrosystem Freescale Kinetis教程--Flextimer教程
Kinetis的Flextimer定时器教程 kinetis集成了众多功能各异的定时器,flextimer是其中最为复杂的一个  ...
我要评论
1
7
关闭 站长推荐上一条 /3 下一条