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.

[参考译文] LP-AM261:以编程方式在 PRU 上加载 C 应用程序时出现问题(卡在_TI_decompress_lzss 中)

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1556023/lp-am261-problems-when-loading-c-application-on-the-pru-programmatically-stuck-in-__ti_decompress_lzss

器件型号:LP-AM261


工具/软件:

您好!

使用 PRUICSS_loadFirmware () 从 R5 以编程方式加载我的 C PRU 应用程序时遇到一些问题
从 JTAG 加载时、相同的应用程序也可以运行。
我构建了另一个小的 C 应用程序、它只会打开/关闭 LED、当我从 R5  PRUICSS_loadFirmware () 加载它时、它运行正常。
但当我从 R5 加载我的另一个应用程序并在 PRU 上加载符号时,它似乎在连续调用__TI_decompress_lzss (),我不明白为什么。
我从 JTAG 加载时没有这个问题,而我的其他“ LED 闪烁“应用程序在从  PRUICSS_loadFirmware () 加载时没有出现相同的问题。

您能帮我弄清楚发生了什么吗?

此致
Daniel

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

    尊敬的 Daniel:

    感谢您分享详细信息、

    请允许我重现此问题并调试问题、我将尝试在下周初恢复。

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

    尊敬的 Daniel:

    我无法重现此图、

    您是否在工程设置的 ARM 链接器选项中正确设置了 PRU 工程的入口点? 看起来缺少了这个。

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

    尊敬的 Daniel:

    明天我将查看您共享的项目、放弃星期一提供的最新更新

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

    你好、Nilabh!
    我已经取得了一些进展、  向 PRU 链接器标志添加了--ram_model、并通过添加 .text:_c_int00*>  0x0 修改了 PRU 链接器命令脚本、     第 0 页在部分的顶部{
    所以现在我可以从 R5 在 PRU 上加载代码并按预期执行。

    但现在对共享存储器的访问已停止工作、因此当我  从 PRU 将 0x55555555 写入共享存储器时、只从 R5 读取 0。  

    /* Specify the sections allocation into memory */
    SECTIONS {
    
        .text:_c_int00* >  0x0,         PAGE 0
        .text           >  PRU_IMEM,    PAGE 0
        .bss            >  PRU0_DMEM_0, PAGE 1
        .stack          >  PRU0_DMEM_0, PAGE 1
        .data           >  PRU0_DMEM_0, PAGE 1
        .cinit          >  PRU0_DMEM_0, PAGE 1
        .rodata         >  PRU0_DMEM_0, PAGE 1
    }
    

    ******************************************************************************
                         PRU Linker PC v2.3.3                      
    ******************************************************************************
    >> Linked Fri Sep  5 13:17:14 2025
    
    OUTPUT FILE NAME:   <PRU_0.out>
    ENTRY POINT SYMBOL: "_c_int00_noinit_noargs"  address: 00000000
    
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
    PAGE 0:
      PRU_IMEM              00000000   00003000  000002f0  00002d10  RWIX
    
    PAGE 1:
      PRU0_DMEM_0           00000000   00002000  00000144  00001ebc  RWIX
      PRU0_DMEM_1           00002000   00002000  00000000  00002000  RWIX
    
    PAGE 2:
      PRU_SHAREDMEM         00010000   00008000  00000000  00008000  RWIX
    
    
    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    .text:_c_int00* 
    *          0    00000000    0000001c     
                      00000000    0000001c     rtspruv3_le.lib : boot.c.obj (.text:_c_int00_noinit_noargs)
    
    .text      0    0000001c    000002d4     
                      0000001c    00000080     main.obj (.text:send_pixel)
                      0000009c    00000078     main.obj (.text:send_frame)
                      00000114    00000068     main.obj (.text:send_zero)
                      0000017c    00000064     main.obj (.text:send_one)
                      000001e0    00000040     main.obj (.text:delay_ms)
                      00000220    0000002c     main.obj (.text:error)
                      0000024c    00000028     main.obj (.text:main)
                      00000274    00000024     main.obj (.text:send_reset)
                      00000298    00000020     main.obj (.text:init)
                      000002b8    0000001c     main.obj (.text:wait_for_interrupt)
                      000002d4    0000000c     main.obj (.text:send_interrupt_to_r5)
                      000002e0    00000008     rtspruv3_le.lib : exit.c.obj (.text:abort)
                      000002e8    00000008                     : exit.c.obj (.text:loader_exit)
    
    .stack     1    00000000    00000100     UNINITIALIZED
                      00000000    00000004     rtspruv3_le.lib : boot.c.obj (.stack)
                      00000004    000000fc     --HOLE--
    
    .data      1    00000100    00000044     
                      00000100    00000020     main.obj (.data:blank_frame)
                      00000120    00000020     main.obj (.data:red_frame)
                      00000140    00000004     main.obj (.data)
    
    .cinit     1    00000000    00000000     UNINITIALIZED
    
    MODULE SUMMARY
    
           Module         code   ro data   rw data
           ------         ----   -------   -------
        .\
           main.obj       708    0         68     
        +--+--------------+------+---------+---------+
           Total:         708    0         68     
                                                  
        C:\App\ti\ti-cgt-pru_2.3.3\lib\rtspruv3_le.lib
           boot.c.obj     28     0         0      
           exit.c.obj     16     0         0      
        +--+--------------+------+---------+---------+
           Total:         44     0         0      
                                                  
           Stack:         0      0         256    
        +--+--------------+------+---------+---------+
           Grand Total:   752    0         324    
    
    
    SEGMENT ATTRIBUTES
    
        id tag      seg value
        -- ---      --- -----
         0 PHA_PAGE 1   1    
         1 PHA_PAGE 2   1    
    
    
    GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name 
    
    page  address   name                  
    ----  -------   ----                  
    0     000002e8  C$$EXIT               
    1     00000100  __TI_STACK_END        
    abs   00000100  __TI_STACK_SIZE       
    abs   ffffffff  __c_args__            
    0     00000000  _c_int00_noinit_noargs
    1     00000000  _stack                
    0     000002e0  abort                 
    1     00000100  blank_frame           
    0     000001e0  delay_ms              
    0     00000220  error                 
    0     00000298  init                  
    0     0000024c  main                  
    1     00000120  red_frame             
    0     0000009c  send_frame            
    0     000002d4  send_interrupt_to_r5  
    0     0000017c  send_one              
    0     0000001c  send_pixel            
    0     00000274  send_reset            
    0     00000114  send_zero             
    1     00000140  shared_mem            
    0     000002b8  wait_for_interrupt    
    
    
    GLOBAL SYMBOLS: SORTED BY Symbol Address 
    
    page  address   name                  
    ----  -------   ----                  
    0     00000000  _c_int00_noinit_noargs
    0     0000001c  send_pixel            
    0     0000009c  send_frame            
    0     00000114  send_zero             
    0     0000017c  send_one              
    0     000001e0  delay_ms              
    0     00000220  error                 
    0     0000024c  main                  
    0     00000274  send_reset            
    0     00000298  init                  
    0     000002b8  wait_for_interrupt    
    0     000002d4  send_interrupt_to_r5  
    0     000002e0  abort                 
    0     000002e8  C$$EXIT               
    1     00000000  _stack                
    1     00000100  __TI_STACK_END        
    1     00000100  blank_frame           
    1     00000120  red_frame             
    1     00000140  shared_mem            
    abs   00000100  __TI_STACK_SIZE       
    abs   ffffffff  __c_args__            
    
    [21 symbols]
    

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

    尊敬的 Daniel:

    由于发布活动、我无法调试此问题、请留出更多时间重新进行观察。

    我将尝试在星期五之前分享更多详细信息。

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

    您好:Nilabh、

    我认为我的问题可能与以下事实有关: PRUICSS_loadFirmware () 仅将数据加载到 PRU 的指令 RAM 中。 我在另一个线程中发现了这一点“但是、使用 MCU+ PRUICSS 驱动程序加载 C 代码时可能会出现问题。 修复待办事项列表中的行为。 如果您遇到问题、请联系我们。“

    AM2432:PRU 中的 am2432 乘法 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

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

    尊敬的 Daniel:

    我将与团队合作以获取有关 API 启用的时间表、我会让您随时在此处发布。

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

    您好:Nilabh、
    这让我们在我正在处理的项目中做了很多工作、因此我迫不及待地想要您更改 API 并提供另一个版本的 SDK。
    您能给我提供一种权变措施吗?

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

    尊敬的 Daniel:

    很抱歉、我们的内部团队正在处理修补程序、您可以在本周结束前与您分享这些修补程序。

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

    以下是从 R5F 加载 C 程序的方法。 大部分都是不言自明的

    #ifdef TEST_C_LOAD
         /* Can NOT use PRUICSS_loadFirmware as it assumes entry point as 0x0 and also does not load .cinit sections */
         PRUICSS_disableCore(gPruIcss0Handle, PRUICSS_PRU0);
         /* Load .cinit section, offset (third parameter) below is .cinit  offset in DMEM from PRU map file */
         status = PRUICSS_writeMemory(gPruIcss0Handle, PRUICSS_DATARAM(PRUICSS_PRU0), 0x144U, (uint32_t *)pr1_pru1_led_strip_1, sizeof(pr1_pru1_led_strip_1));
         DebugP_assert(status != 0);
         status = PRUICSS_writeMemory(gPruIcss0Handle, PRUICSS_IRAM_PRU(PRUICSS_PRU0), 0x0U, (uint32_t *)pr1_pru1_led_strip_0, sizeof(pr1_pru1_led_strip_0));
         DebugP_assert(status != 0);
         PRUICSS_resetCore(gPruIcss0Handle, PRUICSS_PRU0);
         /*Set the PC to entry point _c_int00_noargs  from PRU map file, convert to word address (/4) and enable PRU */
         HW_WR_REG32_RAW(((uint32_t)(gPruIcss0Handle->hwAttrs->pru0CtrlRegBase) + CSL_ICSS_M_PR1_PDSP0_IRAM_CONTROL), ((0x458/4) << 16U) | 0x2U);
    #else

    在上述情况下、可使用 HexPRU CCS 扩展(或通过命令行为.cinit 段创建数据数组)  生成 pr1_pru1_led_strip_0(.text 段)和 pr1_pru1_led_strip_1 (.cinit)。 指定.cinit 以加载数据段的偏移(选择 ROM 模型时)和入口点(_c_int00 _noargs 的偏移) 也非常重要、因为这会初始化栈并切换到 Auto init、然后切换到 main

    如何从映射文件查找.cinit 加载偏移量和入口点

    更干净的方法是使用 PRU 汇编语言工具 v2.1(修订版 A) 12.3 与 ARM 可执行文件链接。 都需要尝试这种方法

    我们还将研究使用 loadFirmwarewithEntryPoint API 扩展 pruicss 驱动程序

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

    您好  Pratheesh、
    终于,谢谢你!

    /丹尼尔

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

    如果  通过 在 linker.cmd 脚本中设置“.text:_c_int00 _noargs 结束偏移量 0x0、是否可以跳过入口点的设置?  

    /丹尼尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     通过设置“.text:_c_int00 _noargs > 0x0、page 0“
    强制_c_int00 _noargs 结束偏移 0x0

    您好 Daniel

    是的、这也有效、这样、您可以使用 现有的  PRUICSS_loadFirmware API 本身。

         /* Load .cinit section, offset (third parameter) below is .cinit  offset in DMEM from PRU map file */
         status = PRUICSS_writeMemory(gPruIcss0Handle, PRUICSS_DATARAM(PRUICSS_PRU0), 0x144U, (uint32_t *)pr1_pru1_led_strip_1, sizeof(pr1_pru1_led_strip_1));
         DebugP_assert(status != 0);
         status = PRUICSS_loadFirmware(gPruIcss0Handle, PRUICSS_PRU0, pr1_pru1_led_strip_0, sizeof(pr1_pru1_led_strip_0));
         DebugP_assert(SystemP_SUCCESS == status);

    其他用户的 linker.cmd 参考

    /*指定段分配到存储器中*/
    Sections{
    .text:_c_int00*> 0x0、第 0 页
    .text > PRU_IMEM、第 0 页
    .bss > PRU0_DMEM_0、第 1 页
    .stack > PRU0_DMEM_0、第 1 页
    .data > PRU0_DMEM_0、第 1 页
    .cinit > PRU0_DMEM_0、第 1 页
    .rodata > PRU0_DMEM_0、第 1 页
    }

    此致

    Pratheesh

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

    您好 Daniel、

    能否让您 将.map 文件与 --ram_model 和--rom_model 的链接器值共享 ? 我想在这两种情况下检查第一个初始化数据的 DMEM 偏移量。 如果您不想公开发布、请随时向我发送直接消息。

    此致、

    Nick

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

    你好、Nick!
    我已通过私人邮件向您发送了信息。

    /丹尼尔