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.

[参考译文] TM4C129XNCZAD:如何在使用(IAR)调试器运行时设置 Unix 时间 epoch

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/589980/tm4c129xnczad-how-does-the-unix-time-epoch-get-set-when-running-with-the-iar-debugger

器件型号:TM4C129XNCZAD
Thread 中讨论的其他器件:SYSBIOS

我正在使用 DK-TM4C129X、并使用 IAR 和 I-jet JTAG 进行调试。

我正在研究如何在 TI-RTOS 内初始化系统时间、以便当我从 time.h 中调用 C 库"time"函数时、它返回1970年以来的秒、且精度合理。 系统时间将根据通过其中一个 UART 接收的命令进行设置。

为了启动、我调用了 time 函数、并使用以下函数打印结果:

   TIME_t my_TIME =时间(空);
   
   printf ("time:%s\r\n、ctime (&my_time));

令我惊讶的是、与我在笔记本电脑上开发的时间相比、控制台打印出来的时间非常准确。 这最初是令人惊讶的、因为 DK-TM4C129X 上没有可跟踪时间的硬件或电池。 很明显、IAR 调试器必须根据笔记本电脑的时间来设置时间、如果我在没有连接 I-jet JTAG 的情况下运行应用、上面的相同代码会显示"Wed Dec Dec 31 23:59:59 1966"、这正是我所期望的。

是否有任何有关如何通过调试器初始化系统时间的说明、以及进行此初始化的实际上是 TI-RTOS 插件? 我认识到这可能是要询问 IAR 的问题、但我最初没有在 IAR 工具或有关此主题的文档中看到任何内容。 我很好奇、因为我正在尝试准确执行调试器当前的操作、并希望了解调试器是如何完成的。

FWiw、在 TI-RTOS 中、设置系统时间的方法似乎是通过 seconds_set 函数。 我没有在 TI-RTOS .cfg 文件中明确包含 seconds 模块、因此我想知道这是通过另一个模块隐式包含的、还是调试器完全使用其他方法来设置系统时间。

提前感谢。

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

    sjf、

    为了跟踪线程、我将在这里写更多内容。 我也知道这种行为是意料之外的、我很想看到回复。

    您是否确实暗示您从未通过 UART 发送时间设置? 这是进入代码内部设置的唯一方法吗?

    或者、IAR 调试器是否假设值"似乎接近1970、因此该 MCU 需要调整 epoch "?

    我曾经希望实现某种自动宏、它将记录编译的时间和日期、以便可以通过这些变量跟踪器件上的固件版本。 这是回到 MSP430和 IAR 中的解决方案-但是变量/值是在编译之前写入代码中的、而不是通过磁力发送到 MCU。

    此致

    布鲁诺

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

    [引用 user="sjf"]我没有在 TI-RTOS .cfg 文件中明确包含 seconds 模块,因此我想知道这是否通过另一个模块隐式包含, 或者调试器是否完全使用其他方法来设置系统时间。[/quot]可在  IAR 网站上使用 C 标准库时间和时钟函数找到、该网站介绍了在调试器下运行时如何提供时间信息。

    我尚未检查 IAR 调试器的工作方式、但 CCS 具有 CIO 机制 、当程序在调试器下运行时、会调用时间库函数、例如 time()通过使目标在断点上停止来从主机读取时间、 然后、CCS 调试器为目标提供主机时间、并由调试器恢复目标。 请注意、在进行此类调用时、由于在断点处停止、目标可能会暂停数十毫秒、然后由调试器自动恢复。

    而当目标未在调试器下运行时、则不会设置时间。

    可能 IAR 实现了类似的功能。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    切斯特、您好!
    感谢您提供信息!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为这就是答案。 上面链接的 IAR 网站(使用 C 标准库...) 表示连接调试器时时间可用(但不解释时间的来源)、在查看 IAR 提供的一些源代码时、有一个文件夹包含启用半主机时使用的代码。 在此文件夹中,有一个源文件,其中包含 time()函数的实现,该实现似乎是从调试器基础结构中检索本地 PC 时间。

    这一点现在已经很清楚了。 感谢您的回答。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在这种情况下、我有不同的看法、因此有一个问题:您的应用程序是否总是 以脐带方式链接到调试器/半主机? 如果不是、日期/时间将在哪里?如何(如果您需要在您的应用程序/项目中)? 您是否在没有 IAR/调试器的情况下在另一台计算机中检查了电路板?  

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

    您好、Petrei、

    这条线程已经发展很长-切斯特(再次)提供了"重提"- IIRC -海报打算"借用/模拟 IAR 的代码方法"-将这一能力添加到他的项目中-当"脐带被切断!"

    海报的成功-或缺乏成功-最好了解并欣赏...

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

    不需要、我的应用程序在正常运行期间不需要调试器/JTAG、并且在调试器断开连接的情况下、TIME()返回-1。

    当前日期和时间信息将在通过 UART 或以太网从另一系统接收到的命令中提供。 收到命令后、使用 mktime 函数将日期和时间转换为从1970年1月1日起的秒数、然后调用 seconds_set 函数以设置 TI-RTOS 内的时间:

    #include

    #include

    void set_system_time (struct myCMD* cmd)

       time_t time_seconds;
       struct tm time_info ={0};

       time_info.tm_year = cmd->datetime.year - 1900;
       time_info.tm_mon = cmd->datetime.month - 1;
       time_info.tm_mday = cmd->datetime.day;
       time_info.tm_hour = cmd->datetime.hours;
       time_info.tm_min = cmd->datetime.minutes;
       time_info.tm_sec = cmd->datetime.seconds;

       time_seconds = mktime (&time_info);

       seconds_set (time_seconds);


    在使用 seconds_set 函数之前、必须将 seconds 模块添加到 TI-RTOS .cfg 文件中:

       VAR 秒= xdc.useModule('ti.sysbios.hal.Seconds');

    seconds 模块的文档指出,专用 time()函数应链接到应用程序中,该应用程序应根据 seconds_set 函数设置的值返回1970年1月1日以来的秒数,但这对我来说目前不起作用。 time 函数当前返回-1、这表示从 IAR 运行时链接的 time()。 现在,我使用 seconds_get 函数获取时间,但这不是最佳选择,因为我尝试重用大量代码来使用 time()函数,而不必更改此代码。

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

    您好!

    [引用 user="sjf"]但这目前对我不起作用

    供您了解:CCS/TI 使用1900年1月1日的时间周期、而 IAR/其他公司使用1970年1月1日的时间周期、因此可能存在问题。 但是、Tiva 在 Tiva/utils/ustdlib.c 和.h 文件中有几个例程、其中 time epoch 也是1970年。

    (PC/Microsoft Time epoch 为1601年1月1日!!!!)。 您需要一个分辨率设置为1秒的计时器、以便独立于 UART/Ethernet 工作...