- UID
- 1029342
- 性别
- 男
|
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移植工作做成功,做到最简单.
我让他全部是光光的,什么都没有,也不另添加什么新文件进去.
两个工程都基本完成,再烧到板子里试,看能不能跑起来,如果能,说明是两者都没破坏, |
|