Closed dongly closed 3 years ago
v1.2还是v1.3
V1.3
ok
我用 system workqueue 写了一个自动同步,单用的话资源可能稍多,我的工程其他也用到system workqueue,所以内存占用少了点
#include "board.h"
#include <ipc/workqueue.h>
#include <rtthread.h>
#define DBG_TAG "sys.ntpsync"
// #define DBG_LVL DBG_LOG
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#ifdef RTC_SYNC_USING_NTP_USER
static struct rt_work work_ntp_sync;
static int rtc_ntp_sync_period = RTC_NTP_SYNC_PERIOD * RT_TICK_PER_SECOND;
static rt_bool_t init_ok = RT_FALSE;
extern time_t ntp_sync_to_rtc(const char *host_name);
static void ntp_sync_work_func(struct rt_work *work, void *work_data)
{
time_t now;
now = ntp_sync_to_rtc(NULL);
LOG_D("*work_data = %d\nntp = %d", *(rt_tick_t *)work_data, now);
// 当前时间 > 2021-5-1 0:00:00Z 即认为 NTP 获取成功
if (now > (time_t)1619827200)
{
LOG_I("NTP sync ok. Now is %s", ctime(&now));
init_ok = RT_TRUE;
rt_work_submit(work, *(rt_tick_t *)work_data);
}
else //未成功同步之前,每秒同步一次
{
rt_work_submit(work, 1000);
}
}
int rt_rtc_ntp_sync_init(void)
{
if (init_ok)
{
return 0;
}
rt_work_init(&work_ntp_sync, ntp_sync_work_func, &rtc_ntp_sync_period);
rt_work_submit(&work_ntp_sync, 1);
return RT_EOK;
}
INIT_APP_EXPORT(rt_rtc_ntp_sync_init);
#endif /* RTC_SYNC_USING_NTP_USER */
我之前在实验的时候这个默认线程大小是比较合适的,你是因为你内部用了workqueue导致的堆栈偏高的吗?
我多加一个配置选项可以让用户在env里边配置堆栈大小吧
这个不太清楚,有可能吧,我之前有些堆栈大小是合适的,后来不知什么时候,又不够大了. 另,可否未成功同步前,持续同步?有些应用是没有电池的,又想第一时间获取到正确的时间
我没懂你什么意思 如果你没有硬件RTC的话 我们这里有一个软件RTC 你可以开启NTP自动同步之后往软件RTC里边同步
就是用软件RTC时,若因网络故障不能在上电初同步ntp,网络恢复后,就不能立即获得正确的时间,要等很长一段时间,我想把这段时间缩短一点
请你详细描述一下,你的问题问的太笼统了。你是觉得NTP间隔一个小时同步时间很长是吗
我的设想是(可参考我上面的代码):
- 我的最终目标是:当网络正常时,以较短的时间(秒级的),通过NTP获取到正确的时间.
- 现时的方式,上电了等上几十秒才开始第一次同步,若这次不能正确同步,再要等上1小时.我觉得这样的方式不太好.
- 若机器的RTC的时间是正确,NTP间隔一个小时同步一次,一点也不长.但若当前时间不正确,1个小时就太长了.
我的设想是(可参考我上面的代码):
- 上电
- NTP同步,成功,转到 5
- 短延时 (如 1s)
- 转 2
- 长延时 (如 1小时)
- NTP 同步
- 转5
@armink 麻烦看一下这问题,ntp.c内不能探测网络连接状态,如果因为网络问题同步失败,只能以轮询的方式高频次调用NTP同步函数探测,直到同步成功,这种方法是不是有些不太好。这个问题是否应该留给用户自行解决?
这种就外部用户手动调用 NTP 同步函数就好了
RT-Thread 版本: master (5ba96109c60c4b1a) netutils 版本: ~V1.2~ V1.3 现象: 出现提示
warning: ntp_sync stack is close to end of stack address
,也出过堆栈溢出