This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C129ENCPDT:如何多次使用 SNTP 任务?

Guru**** 2616675 points

Other Parts Discussed in Thread: EK-TM4C1294XL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/783400/rtos-tm4c129encpdt-how-to-use-the-sntp-task-multiple-times

器件型号:TM4C129ENCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:TI-RTOS

您好!
我将 EK-TM4C1294XL 板与 TI-RTOS 版本2.16.1.14配合使用、并使用 https 示例。

在初始化 https 任务时,调用函数 startNTP (),并接收当前时间。 现在、我想在运行时更改 NTP 地址并使用此新 NTP 地址。 但每次我再次调用 startNTP 函数时、getaddrinfo 函数都会返回-2、并且我无法使用新的 NTP 地址。


要更新 NTP 地址、我需要做什么?

void startntp (void)(空)

   内转台;
   Int 电流位置;
   time_t ts;
   struct sockaddr_in ntpAddr;
   struct addrinfo 提示;
   struct addrinfo *Addrs;
   struct addrinfo *currAddr;
   Semaphore_Params semParams;


   //semaphore_pend (semNtpHandle、BIOS_WAIT_FOREVE);

   memset (&hinds、0、sizeof (struct addrinfo));
   hines.ai_family = AF_iNet;
   hints.ai_socktype = sock_DGRAM;



   RET = getaddrinfo (ntp_Hostname、ntp_port、NULL、Addr);
   如果(ret!= 0){
       printError ("startNTP:NTP 主机无法解析!"、ret);
       返回;
   }


   currPos = 0;

   对于(currAddr = Addr;currAddr!= NULL;currAddr = currAddr->ai_next)
   {
       if (currPos < ntp_servers_size)
       {
           ntpAddr =*(struct sockaddr_in *)(currAddr->ai_addr);
           memcpy (ntpServers + currPos、&ntpAddr、sizeof (struct sockaddr_in));
           currPos += sizeof (struct sockaddr_in);
       }
       否则{
           中断;
       }
   }

   freedrinfo (地址);

   RET = SNTP (seconds_get、seconds_set、timeUpdateHook、(struct sockaddr *)&ntpServers、ntpservers、 0);
   如果(ret =0){
       printError ("startntp:SNTP cannot be started!"、-1);
   }

   Semaphore_Params_init (semParams);
   semParams.mode = Semaphore_Mode_binary;
   SemHandle = Semaphore_create (0、SemParams、NULL);
   if (semHandle == NULL){
       printError ("startNTP:无法创建信标!"、-1);
   }

   sntp_forceTimeSync();
   bool 超时= Semaphore_pend (semHandle、1000);
   //超时=0 -> Keine NTP Verbindung
   //超时== 1 -> Erfoldreiche NTP Verbindung
   TS =时间(空);
   systime = ts;
   System_printf ("当前时间:%s\n"、ctim(&ts));
   system_flush();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    周一有人将回答您的问题。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Msark、

    SNTP 模块包含一个函数,用于在运行时动态更新 NTP 服务器列表:SNTP setServers()。 您不需要再次调用 startntp()。 该函数仅用于启动客户端任务。

    有关更多详细信息、请参阅 NDK API 参考指南。 它包含在 TI-RTOS 产品安装中。 首先打开 NDK 发行说明:

    tirtos_tivac_2_16_01_14/products/NDK_2_25_00_09/ndk_2_25_00_09_release_notes.html

    向下滚动到文档部分并单击 SNTP API 文档的链接。 然后单击 SNTP 客户端模块链接:

    文档
    SNTP API 文档
    SNTP 客户端

    此页面包含有用的信息、一些示例代码和一些 API 文档。 向下滚动到"更新服务器列表"部分。

    SNTP setServers()函数获取对象数组的指针和数组中项目数的计数。 向后滚动几个部分、了解如何设置此对象数组。

    使用套接字地址结构初始化服务器列表
    将服务器列表存储在连续内存块中

    该示例提供了有关使用 IPv4和 IPv6地址的详细信息。 如果您仅使用 IPv4地址、则并不复杂。 例如,如果只想指定一个 IPv4地址,请使用以下代码。 注意 SNTP 端口确实为123、但下面的 IP 地址只是一个示例;请将其替换为 NTP 服务器的实际 IP 地址。

    #include

    struct sockaddr_in ipv4addr[1];

    ipv4addr[0].sin_family = AF_iNet;
    ipv4addr[0].sin_port = htons (123);
    iNet_pton (AF_iNet、"192.168.1.100"、&(ipv4addr[0].sin_addr.s_addr));

    sntp_setServers((struct socaddr *) ipv4addr、1);

    必须将数组定义为'struct sockaddr_in"类型,但函数需要指向通用'struct sockaddr'类型的指针。 这就是为什么必须在函数调用中使用类型转换。

    此功能将用新列表替换 NTP 服务器的当前列表。 旧地址将被丢弃。

    如果您知道 NTP 服务器的 IP 地址、这就是您所需要的一切。 但是,如果您只有 NTP 服务器的主机名,则需要使用 getaddrinfo()来检索 IP 地址。 您报告了此函数失败时出现-2错误代码。 返回此代码的故障点有多个。 在 CCS 控制台中或 ROV 系统输出缓冲区中查找其他调试消息。 请告诉我们您的发现。

    ~Ramsey