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.

[参考译文] DCA1000EVM:总线错误(转储内核)、使用 CLI 应用程序在 Linux 上捕获原始数据

Guru**** 2528120 points
Other Parts Discussed in Thread: DCA1000EVM, IWR6843ISK-ODS

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/986628/dca1000evm-bus-error-core-dumped-using-cli-application-to-capture-raw-data-on-linux

器件型号:DCA1000EVM
主题中讨论的其他器件: IWR6843ISK-ODS

您好!

我尝试使用 DCA1000EVM CLI 应用程序从 DCA1000EVM 捕获原始数据。

Windows 上的 mmWave_studio_02_01_01_00\mmWaveStudio\PostProc 中的预编译版本适用于我使用的硬件。 (IWR6843ISK-ODS)

现在、我想使用参考代码通过 Linux 系统捕获原始数据。 我使用安装了 Ubuntu 18.04的 Nvidia Xavier NX 板。

如果我编译并尝试使用应用程序、我会收到以下输出:

用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode make
文件夹发布不存在
mkdir -p 版本
g++-g -std=c++11 -w -shared -o Release/libRF_API.so -FPIC -pthread RF_API/*。cpp Common/Valid_Utils/validate_params.cpp Common/OSAL_Utils/osal_linux.cpp
g++-g -static-libgcc -static-libstdc++-std=c++11 -Wall -o Release/DCA1000EVM_CLI_Control CLI_Control/cli_control_main.cpp Common/JSON_Utils/dist/jsoncpp.cpp Common/Validate_Utils/validate_params.cpp Common/OSAL_Utils/osal_linux.cpp -I Common/DCA1000_API/。 -i 公共/JSON_Utils/dist/json/。 -I 通用/. -i Common/Valid_Utils/。 -i 公共/OSAL_Utils/。 -L 版本/. LRF_API
cli_Control/CLI_control_main.cpp:在函数‘SInt32 ValidateJsonFileData (SINT8*、UINT16)’中:
cli_Control/CLI_control_main.cpp:190:8:警告:‘%s’指令将高达254字节的数据写入大小为227的区域[-Wformat-overflow=]
SINT32 ValidateJsonFileData (SINT8 * configFile、UINT16 u16CmdCode)
^~~~~~~~~~~~~~~~~~~~μ A
cli_Control/CLI_control_main.cpp:669:20:注:‘Sprintf’将45到299个字节之间的输出输出到大小为255的目标位置

~~~~~~~μ A ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A
gsStartRecConfigMode.s8FileBasePath、CLI_JSON_REC_INVALID_FILE_BASE_PATH_ERR);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A
g++-g -static-libgcc -static-libstdc++-std=c++11 -Wall -o Release/DCA1000EVM_CLI_Record CLI_Record/cli_record_main.cpp Common/JSON_Utils/dist/jsoncpp.cpp Common/Validate_Utils/validate_params.cpp Common/OSAL_Utils/osal_linux.cpp -pthread -i_DCA1000/ Common_Utils/。 -i 公共/JSON_Utils/dist/json/。 -I 通用/. -i Common/Valid_Utils/。 -i 公共/OSAL_Utils/。 -L 版本/. LRF_API
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode CD 发行版/
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release sudo chmod +x DCA1000EVM_CLI_Control
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release sudo chmod +x DCA1000EVM_CLI_Record
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release 导出 LD_library_path=$LD_library_path:$pwd
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release ./DCA1000EVM_CLI_Control FPGA ./test_config.json

FPGA 配置命令:成功
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release ./DCA1000EVM_CLI_Control 记录./test_config.json

配置记录命令:成功
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release ./DCA1000EVM_CLI_Control START_RECORD ./test_config.json
#选项“-x”已被弃用,可能会在较新版本的 gnome-terminal 中删除。
#使用“--”终止选项,然后将命令行置于该选项之后执行。

Start Record (开始记录)命令:Success (成功)
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release ./DCA1000EVM_CLI_Control stop_record ./test_config.json

停止记录命令:超时错误! 无法读取记录进程状态。 [错误-4068]
用户@BJNX-1:~/Desktop/ReferenceCode/DCA1000/SourceCode/Release ./DCA1000EVM_CLI_Record start_record ./test_config.json

Start Record (开始记录)命令:Success (成功)
总线错误(转储内核)


当我尝试使用控制应用程序启动记录(并从 mmWave Studio 触发电路板)时、它会创建一个空的.bin 和日志文件。 第二个终端窗口会打开一小部分。
控制应用程序不报告任何错误。
如果我尝试在 Record 应用程序中使用 start_record、它将打印"总线错误(转储内核)"
我认为控制应用程序没有显示该错误、因为它在记录终端中显示了一秒钟的时间。

我遵循了此案例的故障排除指南并提高了电池组 Delay_us 时间。 这n´t 什么都没有改变。

我尝试通过增加 CLI_CONTRAL_MAIN.cpp 中第194行中的 s8DebugMsg 变量大小来修复警告。 它修复了警告、但不影响任何其他内容。

如果我尝试使用 gdb 进行调试、则这是输出:


(gdb)运行 start_record ./test_config.json
正在启动程序:/home/user/Desktop/ReferenceCode/DCA1000/SourceCode/Release/DCA1000EVM_CLI_Record start_record ./test_config.json
[使用 libthread_db 启用的线程调试]
使用主机 libthread_db 库"/lib/aarch64-linux-gnu/libthread_db.so.1。
[新线程0x7fb7b541c0 (LWP 12807)]
[新线程0x7fb73531c0 (LWP 12808)]
[新线程0x7fac3161c0 (LWP 12809)]
[新线程0x7晶圆厂151c0 (LWP 12810)]
线程4 "DCA1000EVM_CLI_"接收到信号 SIGBUS、总线错误。
[切换到线程0x7fac3161c0 (LWP 12809)]
__pthread_cond_wait_common (abstime=0x0,mutex=0x7fb7f903ec 、COND = 0x7fb7f903bc )、位于 pthread_COND_WAIT.c:397
397 pthread_cond_wait.c:无此类文件或目录。


有人能帮我找出问题所在吗?


提前感谢

Hans-Peter

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

    您好、这里:

    以下位置提供了一些用户指南和开发人员指南:

    C:\ti\mmwave_studio_02_01_00\mmWaveStudio\ReferenceCode\DCA1000\Docs

    最棒的

    Zigang

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

    您好!

    感谢您的快速响应。 我知道这些指南、但无法从中找到解决方案。

    在平均时间内、我能够进一步跟踪误差:

    函数调用 StartRecordData()是出现问题的步骤。 (请参阅《DCA1000EVM CLI 软件开发人员指南》、第14页图4和 CLI_RECODE_MAIN.cpp)

    在此函数中、创建了多个线程。 RF_API.CPP 中对象 objUpdDataRecv 的最后一个(Thread_WriteDatatoFile ())似乎会触发该问题。

    该线程的第一步是调用对象 osalObj 的 WaitForSignal()函数。 但我无法从那里进一步跟踪它。 如果我尝试单步执行此函数、则错误会立即发生。  

    我仍然无法确定如何解决此问题。

    此致

    Hans-Peter

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

    你好

    您能否 在基于 x86的系统上尝试此操作。

    想知道基于 Nvidia 的平台是否导致软件包中的二进制文件出现问题。

    谢谢、

    Vaibhav

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

    您好!

    是的、我在基于 x86的系统上尝试过它、它运行良好。 该软件包中不包含二进制文件。

    同时,我自己也解决了这个问题。 我将简要说明我为使其运行所做的工作。 在将来的更新中包含类似的修复可能是有道理的。

    SIGBUS 错误是由与 pthread 函数相关的未对齐内存访问引起的。 我不清楚为什么必须对齐这些函数的存储器、因为通常情况下、arm64v8支持未对齐的存储器访问。 这可能是由该库中更深的机器命令引起的。

    在几个头文件中有一条语句:(例如 RF_API.h)

    /** To avoid structure padding                                               */
    #pragma pack (1)

    由该语句引起的、没有与架构的64位内存对齐。 这会间接触发问题、但会减少使用的存储器、并可能减少其他一些更高的用途。

    无论您希望保留这些语句、都需要将其固定在两个位置、在这两个位置会发生错误:

    在 osal.h 中、结构 OSAL_SIGNAL Handle_TYPE 包含一个 pthread_COND_t (48b)、pthread_mutex_t (48b)和一个 bool (1B)变量。 总之、该结构采用97Bytes。 这需要与104个字节对齐、例如通过以下修改:alignas (8)

    /** Structure definition for event handle (Linux)       */
    typedef struct alignas(8)
    {
        /** Condition variable handle  */
        OSAL_CONDN_HANDLE_TYPE condnVar;
    
        /** Mutex variable handle      */
        OSAL_MUTEX_HANDLE_TYPE mutexVar;
    
        /** Signalled state flag       */
    
        bool bSignalled;
    }OSAL_SIGNAL_HANDLE_TYPE;

    recorddatarecv.h 中的是具有大量变量的类。 其中两个是先前更改的结构的事件结构。 我假设事件结构已经与104B 对齐。 这些结构从1299B 和1403B 的偏移开始。 偏移量需要对齐。 最简单的方法是简单地将事件结构移动到存储器的开头。 由此、它们从偏移0B 和104B 开始:

    (左-右原  -修改)

    class cUdpDataReceiver
    
    {
    
    	/** Data type index										*/
    
        UINT8 u8DataTypeId;
    
    
    
        /** Record data file pointer                            */
    
        FILE *pRecordDataFile;
    
    
    
        /** Record data file path                               */
    
        SINT8 strRecordFilePath[MAX_NAME_LEN * 2];
    
    
    
        /** Record data file name                               */
    
        SINT8 strFileName1 [MAX_NAME_LEN * 3];
    
    
    
        /** Socket state                */
    
        bool bSocketState;
    
    
    
        /** Thread state                */
    
        bool bThreadState;
    
    
    
        /** First packet state          */
    
        bool bFirstPktSeqSet;
    
    
    
        /** File Data count             */
    
        UINT32 u32DataCount;
    
    
    
        /** File count                  */
    
        UINT32 u32DataFileCount;
    
    
    
    	/** File writing - Loop index	*/
    
        UINT32 u32ByteIndex;
    
    
    
        #ifndef POST_PROCESSING
    
    
    
        /** File write completion wait event                    */
    
        OSAL_SIGNAL_HANDLE_TYPE sgnFileWriteCompletionWaitEvent;
    
    
    
        /** File write init wait event                          */
    
        OSAL_SIGNAL_HANDLE_TYPE sgnFileWriteInitWaitEvent;
    
    
    
        /** Buffer 1 empty flag                                 */
    
        bool bBuf1Empty;
        
    ...
    class cUdpDataReceiver
    
    {   
    
        #ifndef POST_PROCESSING
    
    
    
        /** File write completion wait event                    */
    
        OSAL_SIGNAL_HANDLE_TYPE sgnFileWriteCompletionWaitEvent;
    
    
    
        /** File write init wait event                          */
    
        OSAL_SIGNAL_HANDLE_TYPE sgnFileWriteInitWaitEvent;
    
    
    
        #endif
    
    
    
    	/** Data type index										*/
    
        UINT8 u8DataTypeId;
    
    
    
        /** Record data file pointer                            */
    
        FILE *pRecordDataFile;
    
    
    
        /** Record data file path                               */
    
        SINT8 strRecordFilePath[MAX_NAME_LEN * 2];
    
    
    
        /** Record data file name                               */
    
        SINT8 strFileName1 [MAX_NAME_LEN * 3];
    
    
    
        /** Socket state                */
    
        bool bSocketState;
    
    
    
        /** Thread state                */
    
        bool bThreadState;
    
    
    
        /** First packet state          */
    
        bool bFirstPktSeqSet;
    
    
    
        /** File Data count             */
    
        UINT32 u32DataCount;
    
    
    
        /** File count                  */
    
        UINT32 u32DataFileCount;
    
    
    
    	/** File writing - Loop index	*/
    
        UINT32 u32ByteIndex;
    
    
    
        #ifndef POST_PROCESSING
    
    
    
        /** Buffer 1 empty flag                                 */
    
        bool bBuf1Empty;
        
    ...

    经过这些修改后、它对我来说是可行的。

    我希望通过这篇文章、我可以为其他人节省大量工作、使 CLI 工具在基于 ARM64的系统上运行。

    此致

    Hans-Peter