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.

[参考译文] LAUNCHXL-CC1310:使用某些 POSIX 时钟资源时遇到奇怪的锁定

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1429168/launchxl-cc1310-strange-lockup-when-using-some-posix-clock-stuff

器件型号:LAUNCHXL-CC1310
Thread 中讨论的其他器件:CC1310

工具与软件:

我正在使用库存的 sensor_CC1310_LAUNCHXL_tirtos_ccs 示例项目。  为了查看通过 RF 发送消息的频率、我想在 Board_Lcd_ 357eString*函数中添加一个时间戳(我不使用 LCD...只是使用 UART)。  因此、在内核配置文件中添加了相应的#define 以及 POSIX 支持之后、我将它添加到了 sensor.c 中 Sensor_init 的顶部:

#ifdef DEBUG_PRINT_TIMESTAMP
#define STARTTIME 1729719936
Seconds_set(STARTTIME);
struct timespec ts;
ts.tv_sec = STARTTIME;
ts.tv_nsec = 0;
clock_settime(CLOCK_REALTIME, &ts);
#endif

然后、我将以下代码添加到 board_LCD.c:

#if defined(DEBUG_PRINT_TIMESTAMP)
#include <stdio.h>
void print_timestamp(void)
{
    char buf[81];
    uint32_t t;

    t = Seconds_get();
    time_t t1 = time(NULL);
#if 0    
    struct tm *ltm;
    char *curTime;
    ltm = localtime(&t1);
    curTime = asctime(ltm);
    strcpy(buf,curTime);
#else
    Util_ltoa(t1, (uint8_t *)buf, 10);
#endif
    t = strlen((char *)buf);
    buf[t] = ':';
    buf[t+1] = ' ';
    buf[t+2] = 0;
    System_printf((xdc_CString)buf);
}
#endif

该代码从 Board_Lcd_ schueString 和 Board_Lcd_ schueStringValue 调用。

这是一个奇怪的部分...其实、它运转正常。 它在每个输出 UART 字符串的前面添加一个数字时间戳(虽然这是自1900年1月1日 以来的秒数、很有意思)。

如果我尝试通过翻转#if 0,使用 localtime (), asctime ()的东西,它没有 worky。 它会不断复位。  当我通过调试器运行它时、我得到常量:

Cortex_M3_0:GEL 输出:内存映射初始化完成。
Cortex_M3_0:GEL 输出:电路板复位完成。
Cortex_M3_0:错误:(错误-1170 @ 0x0)无法访问 DAP。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、并/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包20.0.0.3178)
Cortex_M3_0:停止目标 CPU 时出现故障:(错误-2064 @ 0x0)无法读取器件状态。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、并/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包20.0.0.3178)
Cortex_M3_0:错误:(错误-1170 @ 0x0)无法访问 DAP。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、并/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包20.0.0.3178)
Cortex_M3_0:停止目标 CPU 时出现故障:(错误-2064 @ 0x0)无法读取器件状态。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、并/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包20.0.0.3178)

我的行为是否有误?  我看到很多示例代码、几乎具有相同的功能...

谢谢。

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

    Dave、您好!

    从一开始看起来、好像是在缓冲区溢出运行。 您可以首先尝试为变量分配存储器。

    我正在调试您的解决方案、但我想我遗漏了您的一些更改。
    您能否提供所有这些问题以便我重现错误?

    此致、
    等等

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

    唯一的其他更改是 board_lcd.c 中的 Board_Lcd_ string*函数:

    /*!
     * Write a string on the LCD display.
     *
     * Public function defined in board_lcd.h
     */
    void Board_Lcd_writeString(char *str, uint8_t line)
    {
    #if defined(BOARD_DISPLAY_USE_UART)
    #if defined(DEBUG_PRINT_TIMESTAMP)
        print_timestamp();
    #endif
        System_printf(str);
        System_printf("\r\n");
    #endif
    
    #if defined(BOARD_DISPLAY_USE_LCD)
        if(hDisp != NULL)
        {
            Display_control(hDisp, DISPLAY_CMD_TRANSPORT_OPEN, NULL);
            Display_print0(hDisp, line, 0, str);
            Display_control(hDisp, DISPLAY_CMD_TRANSPORT_CLOSE, NULL);
        }
    #endif /* BOARD_DISPLAY_USE_LCD */
    }
    
    /*!
     * Write a string and value on the LCD display.
     *
     * Public function defined in board_lcd.h
     */
    void Board_Lcd_writeStringValue(char *str, uint16_t value, uint8_t format,
                                    uint8_t line)
    {
        int len = strlen(str);
        memset(lcdBuf, 0, MAX_LCD_BUF);
        memcpy(lcdBuf, str, len);
        Util_itoa(value, &lcdBuf[len], format);
    
    #if defined(BOARD_DISPLAY_USE_UART)
    #if defined(DEBUG_PRINT_TIMESTAMP)
        print_timestamp();
    #endif
        System_printf((xdc_CString)lcdBuf);
        System_printf("\r\n");
    #endif
    
    #if defined(BOARD_DISPLAY_USE_LCD)
        if(hDisp != NULL)
        {
            Display_control(hDisp, DISPLAY_CMD_TRANSPORT_OPEN, NULL);
            Display_print0(hDisp, line, 0, (char *)lcdBuf);
            Display_control(hDisp, DISPLAY_CMD_TRANSPORT_CLOSE, NULL);
        }
    #endif /* BOARD_DISPLAY_USE_LCD */
    }
    

    但是、您是对的。  将函数顶部的变量声明为"固定的"一切。  请注意自己...

    谢谢!

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

    "好了,好了。  我说得太快了。  仍进行以下更改:

    #if defined(DEBUG_PRINT_TIMESTAMP)
    #include <stdio.h>
    void print_timestamp(void)
    {
        uint32_t t;
        time_t t1;
        struct tm *ltm;
        char *curTime;
        char buf[81];
    
        t = Seconds_get();
        t1 = time(NULL);
    #if 1
        ltm = localtime(&t1);
        curTime = asctime(ltm);
        strcpy(buf,curTime);
    #else
        Util_ltoa(t1, (uint8_t *)buf, 10);
    #endif
        t = strlen((char *)buf);
        buf[t-1] = ':';
        buf[t] = ' ';
        buf[t+1] = 0;
        System_printf((xdc_CString)buf);
    }
    #endif

    我已经在收集器示例中进行了相同的更改、它实际上运行良好。

    我还将"char buf[81]"从那里拉出来到一个静态数组中、以查看堆栈是否被隐藏、但这并没有改变行为。

    我想知道这是否与"struct tm"和/或"char *"有关、它在本地时间和 asctime 调用中分配和使用?

    或者、希望我只是做一些愚蠢的事情。

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

    Dave、您好!  

    我觉得仍然存在内存问题。 您是否考虑过使用 localtime_r()、它是线程安全的、并使用用户提供的缓冲区来获得可静态定义的结果?
    我建议您实施 Asctime ()的替代方案,因为这里也是内部分配的内存,可能会中断代码。

    此致、
    等等

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

    嗯...*_ r () time 函数在 CCS 环境中似乎不可用?

    未解析的符号 localtime_r、首先在中引用

    您是否在您的环境中给出了一个镜头?

    谢谢

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

    Dave、您好!

    我的 Bad 值、我没有先测试实现情况。 它的确没有包括在内。

    我现在正在使用您的最新实现运行一些测试、并且我可以重现 DAP 访问错误。
    我还不清楚到底是什么原因造成的。

    您可以尝试改用第二个选项、并使用基于字符数组的运算对其进行格式化。

    此致、
    等等

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

    我认为使用32位与64位模式的过程中有一些有趣之处...我看到了一些关于告诉编译器要使用哪个时钟版本的文章(我忘记了宏)。 很多关于 epoch 不同的函数,等等的东西  对于许多人使用的产品来说、似乎过于复杂、但在使用这些组件的生产产品中可能通常不会如此。

    感谢您观看!

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

    Dave、您好!

    我不确定这一点。 但一般而言、我们还提供另一个选项来为您添加时间戳调试输出、您可以在项目属性->调试: https://software-dl.ti.com/ccs/esd/documents/users_guide/ccs_debug-main.html#misc-other-options 中将其激活 

    您是否已经了解了它?

    此致、
    等等

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

    我还没有看到...谢谢。

    实际上、99%的时间都没有在调试器下运行这些目标。  时间戳是一种粗糙的"何时发生"在几天的时间。

    作为一个有趣的一边,似乎 seconds_get()(1970 epoch )和 time(NULL)(1900 epoch )没有返回相同的值。

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

    Dave、您好!

    我再次检查了我们的 Mac 层实现,有默认的时间戳,你可以用它打印出来。 你是否检查过以下线程中建议的实现:

    https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/736993/rtos-cc2652r-bug-report-the-timestamp-of-macmcpsdatacnf_t-in-simplelink_zigbee_sdk_plugin_2_20_00_06-is-invalid

    https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/839444/ccs-cc1310-rf_getcurrenttime-pdataind--timestamp-pdataind--timestamp2

    您可以使用文件搜索(Ctrl+h)来搜索"时间戳"变量。

    此致、
    等等

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

    这是所有伟大的信息...我的大担忧是真正更多的锁定在这个阶段的游戏。 seconds_get()目前运行良好、我只是不会使用漂亮的 time 函数。

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

    Dave、您好!  

    如果我 错过了什么、我会感到抱歉。

    您能否再次解释剩余的"锁定"问题?

    此致、
    等等

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

    "Cortex_M3_0:错误:(错误-1170 @ 0x0)无法访问 DAP。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、并/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包20.0.0.3178)"。  您说您甚至复制了它。

    如果我不在调试器中运行代码、我的目标只是不断复位。

    谢谢。

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

    Dave、您好!

    在使用 localtime()和 asctime()时可以复制它。

    但是、当我使用此配置中的函数时:

    void print_timestamp(void)
    {
        uint32_t t;
        time_t t1;
        char buf[81];
    
        t = Seconds_get();
        t1 = time(NULL);
    #if 0
        ltm = localtime(&t1);
        curTime = asctime(ltm);
        strcpy(buf,curTime);
    #else
        Util_ltoa(t1, (uint8_t *)buf, 10);
    #endif
        t = strlen((char *)buf);
        buf[t-1] = ':';
        buf[t] = ' ';
        buf[t+1] = 0;
        System_printf((xdc_CString)buf);
    }


    它运行无错误。

    您是否进行了我的示例中没有的任何其他修改?

    此致、
    等等

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

    不。。就像你说的,它运行没有错误,当不使用 localtime 和 asctime。  我想使用它们;-) 它们是相当标准的操作。

    谢谢。

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

    Dave、您好!

    我正在考虑是否有办法在嵌入式 RTOS 环境中使用这些函数、但这些函数不是标准函数。

    如果您查看推荐的标准、就可以在此处找到一个供 cc1310实现具有格式化输出的实时时钟的示例项目: https://dev.ti.com/tirex/explore/node?node=A__ADyXJdDRtNfrNfBnPIYDxw__com.ti.SIMPLELINK_CC13X0_SDK__eCfARaV__LATEST 我认为最好在这个项目之后实施时钟、因为它会为您提供您需要的格式化输出。

    此致、
    等等

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

    尊敬的 Theo:

    我很欣赏这个链接...我没有在我的应用程序中使用 C++。  但是、我们进展得有些偏离轨道。 我在许多嵌入式 RTOS 环境中使用了标准时间填充(time ()、asctime ()、localtime ()、ctime)已有很多年了。 尤其是支持 POSIX 的系统。

    我现在的解决方案显示时间实际上很好、所以不需要替代方案。 我只是想让大家对我使用 SDK 的内置功能时创建的锁定/"无法访问 DAP"更感兴趣。  似乎你自己已经重新创建了这个问题,所以祝你好运与修复!  我认为"修复"不会是"使用其他功能"、因为这些功能非常标准。

    此致、

    ——Dave

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

    Dave、您好!

    我只能保证我们推荐的实现方案能够正常工作。 无论如何、我都会跟研发部门跟进这一点、并在未来更新该主题。

    我很高兴你有一个解决你的情况清楚知道.

    此致、
    等等