LWIP提供了观察和调试协议栈内部的方法。LWIP关于调试的内容在debug.h和stats.h文件中可见。
为了实现重定向 printf()函数,我们需要重写 fputc() 这个 c 标准库函数,因为 printf()在 c 标准库函数中实质是一个宏,最终是调用了 fputc()这个函数的。重定向的这部分工作,由 usart.c 文件中的 fputc(int ch, FILE *f) 这个函数来完成。
#define LWIP_ERROR(message, expression, handler) \
do { if (!(expression)) { \
LWIP_PLATFORM_ASSERT(message); handler;}} while(0)
实际就是
LWIP_ERROR(message, expression, handler)
{
if (!(expression))
{
LWIP_PLATFORM_ASSERT(message);
handler;
}
}
而LWIP_PLATFORM_ASSERT(message)在cc.h中定义
#define LWIP_PLATFORM_ASSERT(x) \
do \
{ printf("Assertion \"%s\" failed at line %d in %s\n",\ x, __LINE__, __FILE__); \
} while(0)
#endif
当expression不成立,则输出出错位置的行号与文件。同时调用处理函数函数。在lwip中
handler一般为 return sth;
#define LWIP_DEBUGF(debug, message) do { \
if ( \
((debug) & LWIP_DBG_ON) && \
((debug) & LWIP_DBG_TYPES_ON) && \
((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_ MIN_LEVEL)) { \
LWIP_PLATFORM_DIAG(message); \
if ((debug) & LWIP_DBG_HALT) { \
while(1); \
} \
} \
} while(0)
//---LWIP_DEBUGF(debug, message)为debug.h中实现的宏定义。
//---实际就是
LWIP_DEBUGF(debug, message)
{
if (((debug) & LWIP_DBG_ON) && ((debug) & LWIP_DBG_TYPES_ON) &&
((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL))
{
LWIP_PLATFORM_DIAG(message);
if ((debug) & LWIP_DBG_HALT)
{
while(1);
}
}
}
1)调试系统有三个开关
LWIP_DBG_ON 调试总开关
LWIP_DBG_TYPES_ON 调试类型开关
LWIP_DBG_MASK_LEVEL 调试水平
* - 0 all
* - 1 warning
* - 2 serious
* - 3 severe
2)LWIP_PLATFORM_DIAG(message)函数在cc.h定义
#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0)
#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \
LWIP_PLATFORM_ASSERT(message); } while(0)
LWIP_PLATFORM_ASSERT(message)在cc.h文件由用户定义
#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \
LWIP_PLATFORM_ASSERT(message); } while(0)
在stat.c文件中定义了如下统计信息
struct stats_ {
#if LINK_STATS
struct stats_proto link;
#endif
#if ETHARP_STATS
struct stats_proto etharp;
#endif
#if IPFRAG_STATS
struct stats_proto ip_frag;
#endif
#if IP_STATS
struct stats_proto ip;
#endif
#if ICMP_STATS
struct stats_proto icmp;
#endif
#if IGMP_STATS
struct stats_igmp igmp;
#endif
#if UDP_STATS
struct stats_proto udp;
#endif
#if TCP_STATS
struct stats_proto tcp;
#endif
#if MEM_STATS
struct stats_mem mem;
#endif
#if MEMP_STATS
struct stats_mem memp[MEMP_MAX];
#endif
#if SYS_STATS
struct stats_sys sys;
#endif
};
上述统计信息,除stats_sys,其余在相应宏开关打开后,统计信息由协议栈自动完成,而对于stats_sys统计信息的实现,可在sys_arch关于信号量和有限的申请释放函数中实现。
1、在stats.h 添加如下代码,/—add sun—/便是添加的代码
#if SYS_STATS
#define SYS_STATS_INC(x) STATS_INC(sys.x)
#define SYS_STATS_DEC(x) STATS_DEC(sys.x)
#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)
/*---add sun---*/
#define SYS_STATS_SEM_AVAIL(t,x) (lwip_stats.sys.sem.t=x)
#define SYS_STATS_MBOX_AVAIL(t,x) (lwip_stats.sys.mbox.t=x)
#define SYS_STATS_INC_USED(t) do { ++lwip_stats.sys.t.used; \
if (lwip_stats.sys.t.max < lwip_stats.sys.t.used) { \
lwip_stats.sys.t.max = lwip_stats.sys.t.used; \
} \
} while(0)
/*---add sun---*/
#else
#define SYS_STATS_INC(x)
#define SYS_STATS_DEC(x)
#define SYS_STATS_DISPLAY()
/*---add sun---*/
#define SYS_STATS_INC_USED(t,x)
#define SYS_STATS_SEM_AVAIL(t,x)
#define SYS_STATS_MBOX_AVAIL(t,x)
/*---add sun---*/
#endif
struct stats_syselem { //---添加变量avail表示协议栈总共多少个信号量
/*---add sun---*/
STAT_COUNTER avail;
/*---add sun---*/
STAT_COUNTER used;
STAT_COUNTER max;
STAT_COUNTER err;
};
struct stats_syselem { //---添加变量avail表示协议栈总共多少个邮箱
/*---add sun---*/
STAT_COUNTER avail;
/*---add sun---*/
STAT_COUNTER used;
STAT_COUNTER max;
STAT_COUNTER err;
};
2、在stats.c中stats_display_sys()添加如下代码,显示协议栈总共的邮箱和信号量个数。
LWIP_PLATFORM_DIAG(("sem.avail: %"U32_F"\n\t", (u32_t)sys->sem.avail));
LWIP_PLATFORM_DIAG(("mbox.avail: %"U32_F"\n\t", (u32_t)sys->mbox.avail));
3、在sys_arch.c
3.1 sys_init函数添加关于信号量和邮箱统计信息的初始化
SYS_STATS_MBOX_AVAIL(avail,OS_MAX_QS);
SYS_STATS_MBOX_AVAIL(used,0);
SYS_STATS_MBOX_AVAIL(max,0);
SYS_STATS_MBOX_AVAIL(err,0);
SYS_STATS_SEM_AVAIL(avail,OS_MAX_EVENTS-OS_MAX_FLAGS);
SYS_STATS_SEM_AVAIL(used,0);
SYS_STATS_SEM_AVAIL(max,0);
SYS_STATS_SEM_AVAIL(err,0);
3.2 mbox分配与释放
在邮箱分配成功后添加:
SYS_STATS_INC_USED(mbox);
在邮箱释放成功后:
SYS_STATS_DEC(mbox.used);
3.3 sem分配与释放
在信号量分配成功后添加:
SYS_STATS_INC_USED(sem);
在信号量释放成功后:
SYS_STATS_DEC(sem.used);
4、在lwipopts.h打开相应宏开关,并在任务中调用相关stats_display()函数就可在串口调试中看到LWIP的统计信息了。
5、在LWIP的1.4版本中提供了shell.c代码
代码运行界面如图所示
其中的stat的命令也同样可查询lwip状态。
shell里面的功能暂时还不怎么会用!
shodan介绍与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道。Shodan可以说是一款“黑暗”谷歌,一刻不停的在寻找着所有和互联网关联的服务器、摄像头、打印机、路由器等等。每个月Shodan都会在大约5亿个服务器上日夜不停地搜集信息。对于我们学习安全人员是个收集信息的好工具,如果落入坏人之手的话,那真是一个可怕的东西。官网:https://www.shodan.io/使用教程命令解析例hostname搜索指定的主机或域名hostname:“_shodan
关于RT thread系统节拍时钟的配置 -----本文基于rt-thread-3.1.3版本编写首先,使用RTthread OS时,要配置(或者明白)它的系统节拍rt_tick(划重点)。系统节拍系统节拍是特定的周期中断,可以看是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms,系统节拍率越快,系统的额外开销就越大,从系统启..._rt_tick_per_second
一、安卓手机安装tasker软件增强工具官网:https://tasker.joaoapps.com/网上也有中文版的,自行搜索1.打开tasker界面,点击右下加号2.点击配置文件类型,选择事件3.选择事件类型,点击电话4.点击收到短信5.在发件人和内容中填写过滤条件,比如:10086发来的,内容是验证码,然后直接点击左上角的返回按钮自动保存6.然后新建任务,给任务起一个名字保存7.选择操作类别..._爬虫手机验证码登录
Internal Server ErrorThe server encountered an internal error or misconfiguration and was unable to complete your request.Please contact the server administrator at [email protected] to inform them of t...
目录Servlet介绍静态资源和动态资源HttpServletRequest对象HttpServletResponse对象解决请求和响应乱码:Servlet介绍Servlet是Server Applet的简称,称为服务端小程序,是JavaEE平台下的技术标准,基于Java语言编写的服务端程序。Web容器或应用服务器实现了Servlet标准所以Servlet需运行在Web容器或应用服务器中。Servlet主要功能在于能在服务器中执行并生成数据。Servlet使用单进程多线程方式运行。Servlet是可以接
<button type="primary" bindtap="getoption">确定</button> data: { }, methods: { getoption(e) { this.triggerEvent('index', {i:1})//triggerEvent广播数据 index为广播事件 } } <share bind:index="getoption"></share> getoption._wx:for 父传子
一、glance组件1.实验目的①安装控制器必备组件②部署共享服务③在控制器配置镜像存储、网络、计算和Dashboard服务2.glance的安装与配置2.1 glance安装(1)创建数据库(2)创建keystone认证的用户①创建用户②授予glance权限,创建glance服务③将glance服务注册到keystone(3)安装glance服务2.2 配置glance-api服务(1)配置数据库连接(2)配置keystone(3)配置image存储位置,_glance实验步骤
Python中想要使用matplotlib使用颜色图,线框和轮廓绘制表面。 像这样:请注意,不是与xy平行的平面中的contour,而是关于图像中3D和白色的contour。如果用幼稚的方法绘制所有这些东西,我将不到轮廓(参见下面的代码和图像)。如果在表面添加透明度,我可以看到contour但它看起来真的很混乱(参见下面的代码和图像)import numpy as npfrom mpl_toolk..._python ax.contour
1.准备工作Opencv库的编译与安装 具体过程见:https://blog.csdn.net/u014337397/article/details/80895940Opencv环境配置 参考博客:https://blog.csdn.net/cv_you/article/details/773416312.测试平台测试平台 Linux版本:Ubuntu 18.04 LTS...
矩估计法_矩估计法
1.直方图均衡显示直方图plt.hist(im.flatten(),128)#基于CV2的直方图均衡,返回图像def Histo(imagePath): image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) eq = cv2.equalizeHist(gr...
嵌入式WEB Server的应用 Ver1.0 by tian 2009-5-28Ver2.0 by tian 2009-6-4 转载请注明出处:http://blog.csdn.net/AIXT2006/archive/2009/06/04/4242480.aspx1 Mini_httpd-1.191.1 下载与编译http:/