2010年(49)
分类: 嵌入式
2010-09-07 11:50:44
参考wr_net_stack_programmers_guide_
参考END驱动程序motcpmend.c和motcpmhdlcend.c
以HDLC END驱动为例
1 内存池的建立
在motCpmHdlcEndLoad函数中会调用motCpmHdlcInitMem,motCpmHdlcInitMem函数将会负责建立内存池。
motCpmHdlcInitMem在建立内存池后,会为RxBd申请cluster内存区域,cluster的大小是用户指定的,我们的驱动都是分配大概一个帧长。例如1520。
2 收帧
收到帧产生中断,当然hdlc驱动似乎不需要帧中断,只需要RXBD中断,因为rxbd的内存区域大小绝对能包含一个hdlc帧。
motCpmHdlcHandleInt调用motCpmHdlcRecv,motCpmHdlcRecv会建立MBLK-CBLK-cluster结构,但是巧妙的是cluster就是rxbd使用的那个cluster,这样直接挂接避免了复制。此时,只需要给rxbd分配一个新的cluster即可。
3 发帧
收到来自上层的pmbld指针,先申请一个cluster,将pmblk用netMblkToBufCopy函数复制到cluster,然后把txbd的数据指针指向这个cluster。设置txbd的控制字段,使其发送出去。
当发送完成后,将会产生发送完成中断,在中断中释放先前申请的cluster。