上篇的NTP使用记录已经篇幅很长了,所以将后续的代码追踪过程再记录一篇。也是出于好奇,对NTP的实现过程进行了代码分析,暂有一处不解,文中细表。
NTP测试Demo中明显使用了lwip API,包括connect、send、close等接口。
图7-1 NTP Demo中的lwip接口使用
索性尝试从send接口开始追溯,通过CDK中按住“Ctrl键”左键点击send标识符,成功跳转到坑点。
图7-2 IDE帮着做得跳转不准确
接着,试着全文件搜索“send(”,加一个左圆括号去除单独出现send的情况。可是只能搜到一个结果,那么依据经验判断send并不是定义的函数原型,可能是宏定义。
图7-3 进行全文件字符串搜索
带着宏定义的判断继续搜索“#define send”,怕默认搜索路径不全面,手动添加了整个pack目录,结果搜了个寂寞。
图7-4 #define send关键字检索无结果
于是,改为搜索connect接口。超链接跳转一下就到了乍一看很靠谱的位置。
图7-5 connect关键字检索结果
看到这些宏的编译条件,于是做了一个判断,通过在board_yoc_init()中添加printf语句,使得启动时输出这个条件宏“LWIP_COMPAT_SOCKETS”的值。
void board_yoc_init()
{
board_init();
event_service_init(NULL); //initialize event service for network events
console_init(CONSOLE_UART_IDX, 115200, 128);
ulog_init();
aos_set_log_level(AOS_LL_DEBUG);
LOGI(TAG, "Build:%s,%s\n",__DATE__, __TIME__);
printf("-----> LWIP_COMPAT_SOCKETS: %d <-----\n", LWIP_COMPAT_SOCKETS);
/* load partition & init kv function */
aita_InitKV();
/* set cycle timer for polling job */
aita_InitTimer();
/* initialize wifi network */
aita_InitNetwork();
board_cli_init();
}
图7-6 条件宏值为2
图7-7 符合条件的代码有更大惊喜
符合这个条件编译的宏定义中,send却是另外标识符的宏替代。上述过程说得简单,其实搞起来也花了两个多小时,于是决定改变思路——转看编译生成的List文件。
图7-8 追溯结果
实际的追溯结果是预料到的,因为NTP的实现就是修改了w800_api.c中的bug,唯一不解的是w800的接口是如何映射到lwip协议栈的。
追踪<send>位置的c代码,发现是sal_send()函数的定义代码。接着再搜索sal_send,最大惊喜来了!
图7-9 再追溯结果
这个惊喜直接让我放弃了,难道是C语法了解还不足吗?send怎么也成了sal_send的替代了,还是这里的宏要反着去理解?要是有明白的朋友,恳请帮我指出吧!
此篇到此结束,后面准备进行NTP对RTC的初始化。
引用: lugl4313820 发表于 2022-4-15 15:27 分析代码辛苦了。我去发了工单,也按工单的操作了,还是没有解产,后面从我的服务返回时间解决了。希望你把 ...
反应过了,发给我一个文档,是修改ntp bug的。感觉还是有坑。
sonicfirr 发表于 2022-4-15 23:35 反应过了,发给我一个文档,是修改ntp bug的。感觉还是有坑。
楼主这么晚还在努力更新,给一个大大的赞
引用: lugl4313820 发表于 2022-4-15 23:43 还没休息呀,看来这个板子实在折磨人呀。
说来好笑,AliOS最早出过一块开发板STM32L476的,昨天在闲鱼上看到有人出,底下一堆人跟帖骂板子的——主要是骂开发环境。
看来这是个历史问题了。
引用: sonicfirr 发表于 2022-4-16 09:50 说来好笑,AliOS最早出过一块开发板STM32L476的,昨天在闲鱼上看到有人出,底下一堆人跟帖骂板子的&mdash ...
接了任务吹了一下牛,这板子的外设资源太紧张了。唉!