1.Strtoul函数和strtok_r函数解析及使用方法。
函数名:stroul
函数原型:unsigned long stroul(const char* str,char** endptr,int base);
函数功能:将字符串转换成unsigned long型
参数说明:str为要转换的字符串,endptr为第一个不能转换的字符的指针,base为字符串str转换时所用的进制,范围为2~36。
函数返回值:返回转换后的无符号长整型数,如果不能转换或者str为空,则返回0.
函数名:strtok_r
函数原型:char* strtok_r(char *str,const char *delim,char **saveptr)
函数功能:将字符串进行分割
参数说明:str为要分解的字符串,delim为分隔符字符串,char **saveptr是一个指向char *的指针变量,用来在strtok_r函数内部保存切分时的上下文,以应对连续调用分解相同源字符串。
2.MDIO是如何访问到phy的
板子里有一个交换机,需要驱动它,我们对设备进行操作的时候,一般会先找到这个设备挂在了我们地址线的哪一个地址上,比如你操作板子上的GPIO,GPIO的config,data寄存器的地址是可以通过手册查到的。那么外接了一个交换机,交换机上面又有phy,有交换机的port,有sgmii,那么我们怎么对齐进行配置呢?
这时候就有一个公共的协议接口,硬件设计人员在设计的时候,会将他们的控制通过这个公共的接口连接起来。本端的cpu只需要通过配置你的这个接口的寄存器,就能对挂载的设备进行配置了。这里以mdio访问外部的phy为例子。
MDIO的寄存器都是根据标准统一的。
假设你的MDIO模块的基地址为0x20000000,那么依据这些偏移量就能访问mdio对应的子模块,对外部的phy的访问,起初需要注意的寄存器就是ALIVE和LINK寄存器,如果硬件没有问题的话,这里会看到ALIVE和LINK的32位中的某一位会被置位,MDIO的地址是串行地址,也就是说,ALIVE这个32位寄存器的第8位被置1,说明在MDIO的8位置上有一个phy是可以进行访问的。
然后通过对下面的USERACCESS寄存器写地址和写值的方式,去进行远端的配置,这里的地址是0~31,也就是挂载32个设备,当然也是可以扩展的。
如果对端的寄存器不止32个,那就有一个叫做页机制的东西会进行地址扩展,那时候就要先往22寄存器写页号,再往对应的寄存器号中写值,这样就可以通过MDIO对phy完成配置了。
3.ICMP 和 IGMP
ICMP是网际控制包协议,它的功能是:差错报告和查询
ICMP发送的ICMP包并不能直接交到下1层,必须在加IP的包头!
ICMP的包分两类:1是差错报告包2是查询包
差错报告包的形式分为:1)终点不可达2)源点抑制3)超时4)参数问题5)改变路由
查询包的形式分为:1)回送请求和回答2)时间戳3)地址掩码4)路由器询问和通告协议。
IGMP是网络组管理协议。主要用于建立和管理多播组,对IP分组广播进行控制。IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。
IGMP包结构 :
版本:IGMP的版本,值一般为0x1h;
类型:IGMP消息的类型。 0x1h类型称为主机成员请求,在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告,在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。
未用:未用的域名被发送者置零且被接收者忽略。
检验和:IGMP头的一个16位检验和。
组地址:主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中,组地址被全置零,而且硬件级的多路广播地址被用来标示主机组。
1、组播:单方发信息多方接收!单对多的数据传输形式为组播!
2、组播路由器:有着转发组播包能力的路由器!
4.什么是VLAN,有什么作用?
VLAN的意思是虚拟局域网,对于这个概念我理解的不是很到位,但是在配置交换机的时候,VLAN的实现可以让我配置不同的端口之间的通信,比如端口1,4配置成一个网,端口2,5,6配置成一个网,这样我一个交换机就配出了两个局域网,广播包发出来之后,不会再所有的端口上产生,让我路由到不同的地方去了,实现了隔离。
5.串口线也分直连和交叉吗?
分,简单识别方法:两头母口是交叉,一公一母是直连。但是有的时候,两头目的也是直连的。最近调试一个板子,串口死活没有输出,后来用分而治之的方法,定位到我的线有问题!可是我的线在另外一个板子上是好的啊,后来看了下原理图,原来他们的串口的tx和rx是反的,于是一查,原来两头母的,也有直连的叫直连延长线,换了个交叉线就OK啦。