首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

lwIP+ucos2移植于S3C2440过程(3)

lwIP+ucos2移植于S3C2440过程(3)

允许它们定义,没关系,跟系统内其它的定义不相冲突,如果全部换成一致也不见得好使用.   
因为分为不同的分块移植的.   
信号量操作函数   
邮箱操作函数:   
特别注意:投递到邮箱中的消息只能是一个指针.   
一:邮箱一次能够接收多条消息比仅接收一条消息更加有效.   
二:邮箱中的消息是一个指针.   
__ilvSetLwIP()   
实现网络驱动与LwIP的接口,是网络系统得以顺利运转的源动力,它会告诉LwIP网络数据的发送出口,建立网络数据的接收入口并实现   
接收入口与LwIP处理入口的对接.   
当底层网络收发设备进入正常工作状态,网络数据能够正常流入流出LwIP后,这个函数进行的工作会结束.   
我需要一款纯的Lwip源代码,可能都是别人移植了后,影响到我的思路.   
下载一个原版的后,不用再去查看别人移植的,现在的工作是怎样先把这个lwip先移植到uCos-ii里去,   
暂时还不让它跑起来,按照常规的想法是把其思路先移植上去再说.看看有什么效果.再实现驱动.   
采用一个干净的lwip源码是很有用处的.   
一:可以就此完全不用顾及别人的移植思路,   
二:自己移植出错容易找出来,   
三:用时会快一些.   
实际上这些都是在这里操作.   
LwIPEntry.c这个文件也像LwIP_main.c文件一样.是重中之重.   
没有把硬件东西提取来,有点过失,   
如果再把其中的东西提取来,就有点更直接的效果.   
ethernetif_init()初始化底层接口:   
Lwip作者已经帮我们完成大部分工作,我们只要把框架内完成与底层硬件相关的部分即可.   
ethernetif 是一个结构体:用来描述网络硬件设备(通常说的网卡)   
它唯一不可缺少的是网卡的MAC地址.   
ethernetif->ethaddr ====指针指向netif中保存的网卡MAC地址.   
low_level_output()     
与硬件联系的函数,   
指定任务优先级,最好定为最高优先级,如果确定存在更高优先级,一定要让更高优先级任务占用CPU使用权时间不能太长,   
否则将严重影响网络性能.   
ethernetif.c是硬件的抽象层.   
实现了它,不一定可以,还需要硬件驱动.   
lib_emac.c专门用来建立驱动函数:   
硬件驱动:它不仅包括EMACInit()   
EMACReadPacket() EMACSendPacket() 分别负责网络数据包的接收和发送.   
这个已经在处理硬件了.   
怎样使用硬件工人和顺利就得有这么一种慢慢使用的过程了.   
所以网卡的实现也只有三个函数吗?   
EMACInit()     
EMACReadPacket()   
EMACSendPacket()     
怎样把问题简化:   
1.lwip   
2.dm9000   
3.lwip->ucosii 这个可以暂时搞定: ---------------------返正先把这个搞定再说.-------------------   
4.lwip->dm9000   
lwip->dm9000详细问题,要解决几个问题:   
1.EMAC发送和接收中断处理函数 --dm9000看看中断处理函数.   
2.EMACSendPacket 发送   
找来找去没有发现什么新的东西可以模仿,不如自己写一个.   
首先把LwIP移植之后再说,其它的就不必太在意.   
先把一步做完,   
然后再考虑网络驱动的问题.   
文件结构也很重要,不然可能有一些会搞混乱.   
在此中间,焦海波采用了链表来构建邮箱,   
而我将采用另一种方式:队列,让队列给uCOS-II去处理更好一些.   
这样把LwIP实现了后,再就是硬件网卡驱动.   
首先添加LwIPEntry.c文件,   
看来我在dm9000 花费了太多心血,倒头来还只是一个linux版的,而且一点进展都没有,   
怎么办?   
我想把它搞掉.   
算是移植完成了,但是没有调试,因为可能还有许多错误,要清除这些错误,得一段时间.   
怎么把平台里的网络相关函数抽象出来?   
直接用到一些函数,可以用来发送Ping Webpage 之类,看看,可不可以脱离硬件函数.   
怎么办,ADS不可以直接加工程.   
是否需要有更多了解.   
我是怎么样把我所做的添加上去呢?   
难道像昨晚那样一个一个添加?   
其实文件夹跟本就不存于mcp工程里.   
编译已经成功,但是一些应该使用的功能可能还没有达到你的要求,   
现在的工作是怎样把相应的功能加进去,即是怎样把Lwip 栈协议加进去,   
实现通信.   
出现的另外一个问题,为何在外部的驱动,没法在lwip里调用,是否是因把dw9000加到了外面?   
现在的问题只是:驱动出现了问题,如果把驱动处理好   
可能一切都好办了.   
但驱动如何才能添加上去.   
因为其它的驱动看似很容易得到,但是不符乎我的芯片上的意思,   
我决问自己写dm9000的驱动.   
有文档,也有别人的例子,应该比较容易一些.   
编写驱动程序:   
注意处理器所用的C编译器使用"大端格式","小端格式"   
只有两个可以直接被除数处理器访问的寄存器,   
CMD 端口和DATA端口,   
(DM9000中有许多控制和状态寄存器) 访问这些控制,状态寄存器的方法:   
1.将寄存器的地址写到CMD端口   
2.从DATA端口读写寄存器中的数据.   
1-3   
新建一个试一试:   
全部用新的就可以了,自己新建一个即立成功.没有什么完成不了,   
可能还是因为宏的问题,   
所以从dm9000x.h里把不必要的东西都裁减掉.   
高位片选地址:   
DM9000地址端口= 高位片选地址+300H+0H   
DM9000数据端口= 高位片选地址+300H+4H   
DM9000的高位片选地址将是多少?  
0x90000A46   
现在已经编译通过,   
基本的修改已经完成,怎么让OS启动   
虽然已经移植完成了,但没有调试,没有看出来是否已经成功还没有定论   
肯定还会有问题:   
1.驱动dm9000虽然完成了,但没有测试,是否完备   
2.LwIP栈协议还不一定移植成功,因为申请的空间还不明确.   
3.添加的应用程序可能存在一定的问题,如果没有其它问题,应用程序都可以顺利执行.   
4.是否还需要添加httpd.c文件,让其当服务,用来访问,如果可以,则应该一试,以防备其它的不成功,采取这个可以能过,   
5.也算是网络通顺的一个实例.(但是有一个问题即是,这个是里面是否)   
移植的方式很多,但要想成,得有一个章程.   
如下是linux里的移植过程:   
sys_arch.c里有另一种操作:   
把有一些东西分开了,   
初始化网卡与网卡数据接收中断:   
extern void eth_init(void) ;     
extern void eth_rx(int irq,void*devid) ;     
而我自己移植里没有看到有那里初始化硬件,也没有看到那里调用其中的网卡接收中断数据函数   
网卡初始化.   
有low_level_init()是网卡初始化?不是,而网卡初始化是硬件文件里定义.   
实际上都写到这个文件里了,sys_arch.c   
1.初始化网卡和网络接口:   
    err_t init_ethernetif(struct netif*netif)   
        {   
        //初始化网卡   
        eth_init() ;   //当然在硬件文件里实现   
        ethernetif_init(netif);  //初始化网络接口,当然也会在硬件文件里实现,   
        return ERR_OK ;     
         }   
2.初始化lwip   
    void sys_init(void)   
    {    //这里所做的一切都是一样的.没什么可以大作文件,看看即可.   
        netif_init() ;   
        mem_init() ;     
        memp_init() ;     
        pbuf_init() ;         
        .....   
        //这里把接收网卡数据的线程,创建起来.这里使用单独的线程执行ethernetif_input() ;   
        sys_thread_new(ethernet_rev,(void*)0,TCPIP_THREAD_PRIO) ;     
    }   
//那我看看我的移植,没有初始化硬件.   
我认为焦海波之做法不可靠,他把邮箱分成多个邮箱,再用链表链起来,   
而其实可以采有和OS系统里创建队列,只建起队列即可,操作也在对队列实行   
没有必要再去创建多个邮箱链表.   
总感到别扭,为什么采用那种方式?   
是否可以改革,把之前的所想的都改掉呢?   
如果可以通了,就好.但关键是不知道是否能通啊.   
dm9000.c里实际上也只是有三个函数:   
重要的三个函数:   
DM9000_init()     
eth_rx()     
eth_send()     
而给出定义为外部变量时也采用了同样的方式:   
extern DM9000_init()     
extern eth_rx()     
extern eth_send   
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
//一直没有bootloader ,所以重新找了一个.   
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
虽然移植完成了,但是测试时候,连lcd,com都没有成功,怎么办?   
是否因为调用了OS里的sys_thread_new 之后,也把其中的任务破坏了?   
是否还有一种可能是因为双重使用了ethernet.c而另一个只是用了一个名字为:   
ethernetif.c   
所以要么就此脱离移植笔录,   
要么全部按移植笔录来操作,而不另外添加任务新东西.   
怎样保持一个干净的东西,需要对此做一些修整.   
可以把DM9000里的驱动先加进去,而不使用LwIP看结果如何.   
在DM9000.c里设一些可以返回值Uart_printf() ; 这样的函数,让其运行过来,看看结果如何?   
即调试一样的.如果DM9000驱动成功,再把LwIP加进去.   
先让这个跑起来:myucos.rar   
是否思路不清晰,造成了多加了一些任务?   
只专门研究-lwip1.1.3   
要不把驱动放到里去让其运行,看看结果,把它的每个函数都加进去试.   
ADS1.2是否可以不需要平台调试呢?   
先来看看模拟平台.模拟平台没办法测试丢弃.   
再把LwIP移植工作做成功,做到最简单.   
我让他全部是光光的,什么都没有,也不另添加什么新文件进去.   
两个工程都基本完成,再烧到板子里试,看能不能跑起来,如果能,说明是两者都没破坏,
继承事业,薪火相传
返回列表