[经验分享] 【平头哥RVB2601创意应用开发】使用体验07 -- 基于NTP的代码追踪

sonicfirr   2022-4-15 09:04 楼主

上篇的NTP使用记录已经篇幅很长了,所以将后续的代码追踪过程再记录一篇。也是出于好奇,对NTP的实现过程进行了代码分析,暂有一处不解,文中细表。

1、从lwip API开始追溯

NTP测试Demo中明显使用了lwip API,包括connectsendclose等接口。

 

image-20220415090342-1.png  

7-1 NTP Demo中的lwip接口使用

 

索性尝试从send接口开始追溯,通过CDK中按住“Ctrl键”左键点击send标识符,成功跳转到坑点。

 

image-20220415090342-2.png  

7-2 IDE帮着做得跳转不准确

 

接着,试着全文件搜索send(”,加一个左圆括号去除单独出现send的情况。可是只能搜到一个结果,那么依据经验判断send并不是定义的函数原型,可能是宏定义。

 

image-20220415090342-3.png  

image-20220415090342-4.png  

7-3 进行全文件字符串搜索

 

带着宏定义的判断继续搜索#define send”,怕默认搜索路径不全面,手动添加了整个pack目录,结果搜了个寂寞。

 

image-20220415090342-5.png  

image-20220415090342-6.png  

7-4 #define send关键字检索无结果

 

于是,改为搜索connect接口。超链接跳转一下就到了乍一看很靠谱的位置。

 

image-20220415090342-7.png  

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();
}

image-20220415090342-8.png  

7-6 条件宏值为2

 

image-20220415090342-9.png  

7-7 符合条件的代码有更大惊喜

 

2、从List文件开始追溯

符合这个条件编译的宏定义中,send却是另外标识符的宏替代。上述过程说得简单,其实搞起来也花了两个多小时,于是决定改变思路——转看编译生成的List文件。

 

image-20220415090342-10.png  

image-20220415090342-11.png  

image-20220415090342-12.png  

image-20220415090342-13.png  

image-20220415090342-14.png  

image-20220415090342-15.png  

image-20220415090342-16.png  

7-8 追溯结果

 

实际的追溯结果是预料到的,因为NTP的实现就是修改了w800_api.c中的bug,唯一不解的是w800的接口是如何映射到lwip协议栈的。

追踪<send>位置的c代码,发现是sal_send()函数的定义代码。接着再搜索sal_send,最大惊喜来了!

 

image-20220415090342-17.png  

image-20220415090342-18.png  

image-20220415090342-19.png  

7-9 再追溯结果

 

这个惊喜直接让我放弃了,难道是C语法了解还不足吗?send怎么也成了sal_send的替代了,还是这里的宏要反着去理解?要是有明白的朋友,恳请帮我指出吧!

此篇到此结束,后面准备进行NTPRTC的初始化。

回复评论 (6)

分析代码辛苦了。我去发了工单,也按工单的操作了,还是没有解产,后面从我的服务返回时间解决了。希望你把这个问题反馈给阿里,看他们有什么更好的修改。
点赞  2022-4-15 15:27

分析的很仔细.

点赞  2022-4-15 19:08
引用: lugl4313820 发表于 2022-4-15 15:27 分析代码辛苦了。我去发了工单,也按工单的操作了,还是没有解产,后面从我的服务返回时间解决了。希望你把 ...

反应过了,发给我一个文档,是修改ntp bug的。感觉还是有坑。

点赞  2022-4-15 23:35
sonicfirr 发表于 2022-4-15 23:35 反应过了,发给我一个文档,是修改ntp bug的。感觉还是有坑。

楼主这么晚还在努力更新,给一个大大的赞

点赞  2022-4-15 23:43
引用: lugl4313820 发表于 2022-4-15 23:43 还没休息呀,看来这个板子实在折磨人呀。

说来好笑,AliOS最早出过一块开发板STM32L476的,昨天在闲鱼上看到有人出,底下一堆人跟帖骂板子的——主要是骂开发环境。

看来这是个历史问题了。

点赞  2022-4-16 09:50
引用: sonicfirr 发表于 2022-4-16 09:50 说来好笑,AliOS最早出过一块开发板STM32L476的,昨天在闲鱼上看到有人出,底下一堆人跟帖骂板子的&mdash ...

接了任务吹了一下牛,这板子的外设资源太紧张了。唉!

点赞  2022-4-16 11:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复