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,测试发现还算正常,没发现什么问题。
用户377235 2013-7-15 10:45
与中断触发的方式相比,查询的效率总是低的,占用了过多的CPU资源,导致性能低下。