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.

[参考译文] AM2632:我在复制示例并将代码放入 TCMA 时遇到问题

Guru**** 2524550 points
Other Parts Discussed in Thread: AM2632, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1411886/am2632-i-encountered-a-problem-while-copying-the-example-and-putting-the-code-into-tcma

器件型号:AM2632
主题中讨论的其他器件: SysConfig

工具与软件:

我想将计算代码放置在 TCMA 中、并根据示例例例例程进行了以下修改:

添加了代码:

.TI.local:{}>> R5F_TCMA | R5F_TCMB | OCRAM  

.TI.onchip:{}>> OCRAM | FLASH

.TI.offchip:{}> flash

放置在以下代码之前:

/* C++项目所需的部分/

组{

.arm.exidx:{}palign (8)/ C++异常处理需要/

.init_array:{}palign (8)/包含在 main /之前调用的函数指针

fini_array:{}palign (8)/包含在 main */}> OCRAM 之后调用的函数指针

在编写函数时、将其声明为:  

(__LW_AT__因为我的程序目前使用的是定点计算、所以转换为浮点是一项艰巨的任务、所以我暂时使用了 AM2632)上的 DSP IQmath 库

_iq24 attribute((local(1))) _IQ24mpy1(_iq24 A, _iq24 B)
{
_iq24 result;
asm volatile(
"smull   r2, r3, %1, %2
"
"lsr     r2, r2, #24
"
"lsr     r3, r3, #8
"
"add     %0, r2, r3
"
: "=r" (result)
: "r" (A), "r" (B)
: "r2", "r3", "cc"
);
return result;
}

当我运行它时、代码仍然在 RAM 中执行、而不是在 TCMA 中执行。TCMA 中的执行可通过反汇编检查地址来验证。

_IQ24mpy1():
7004dd74:FB802307 smull R2、r3、r0、r7
7004dd78:EA4F6212 LSR.w R2、R2、#0x18
7004dd7c:EA4F2313 LSR.w R3、R3、#8
7004dd80:EB020003 add.w r0、R2、R3

我比较了 示例的 linker.cmd 与我的项目、它们几乎完全一样。  我的调试构建生成的映射文件不包含函数_iq24mpy1、而示例例例例程生成的映射文件包含以下代码段。

.irqstack 
*          0    70057a08    00000100     UNINITIALIZED
                  70057a08    00000100     --HOLE--

.fiqstack 
*          0    70057b08    00000100     UNINITIALIZED
                  70057b08    00000100     --HOLE--

.svcstack 
*          0    70057c08    00001000     UNINITIALIZED
                  70057c08    00001000     --HOLE--

.abortstack 
*          0    70058c08    00000100     UNINITIALIZED
                  70058c08    00000100     --HOLE--

.undefinedstack 
*          0    70058d08    00000100     UNINITIALIZED
                  70058d08    00000100     --HOLE--

.init_array 
*          0    70040000    00000000     UNINITIALIZED

.TI.local 
*          0    00000040    00001c06     
                  00000040    00000802     basic_smart_placement.o (.text.annotated_function_f2)
                  00000842    00001002     basic_smart_placement.o (.text.annotated_function_f3)
                  00001844    00000402     basic_smart_placement.o (.text.annotated_function_f4)

我的地图文件包含以下内容:

.irqstack 
*          0    70059ca0    00000100     UNINITIALIZED
                  70059ca0    00000100     --HOLE--

.fiqstack 
*          0    70059da0    00000100     UNINITIALIZED
                  70059da0    00000100     --HOLE--

.svcstack 
*          0    70059ea0    00001000     UNINITIALIZED
                  70059ea0    00001000     --HOLE--

.abortstack 
*          0    7005aea0    00000100     UNINITIALIZED
                  7005aea0    00000100     --HOLE--

.undefinedstack 
*          0    7005afa0    00000100     UNINITIALIZED
                  7005afa0    00000100     --HOLE--

.init_array 
*          0    70040000    00000000     UNINITIALIZED

.trigText 
*          0    00000040    00000594     
                  00000040    00000594     mathlib.am263x.r5f.ti-arm-clang.release.lib : ti_arm_trig.obj (.trigText)

.trigData 
*          0    000005d8    000000b0     
                  000005d8    000000b0     mathlib.am263x.r5f.ti-arm-clang.release.lib : ti_arm_trig.obj (.trigData)

为什么? 如何将我的代码放入 TCMA?

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

    尊敬的 Zhou:

    您可以参阅以下内容、了解有关如何从 TCM 运行代码的详细指南: (+)[常见问题解答] E2E-AM263X:如何使用 linker.cmd 文件将代码添加到中-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI MCU-PLUS-SDK 支持论坛

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

    尊敬的 Zhou:  
    您能告诉我您使用的 SDK 版本和 syscfg 版本吗?

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

    尊敬的 Nilabh:

    9.2.0.56和1.20.0

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

    您好、Hilabh:

    "马上试用

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

    您好、Hilabh:

       我提到了您提供的链接、并进行了与示例例例例例程序中几乎相同的更改、但仍然不起作用。

       我在 CMD 文件中进行了一些修改、定义了 ti_arm 库中使用的区域 trigData 和 trigText、发现我可以随意地将它们配置为在 TCMA 或 TCMB 中。 但是、即使我尝试了所有代码优化级别、我自己定义的.armiqmath 也不会在 TCM 中生成。

       我怀疑这可能与 ti_arm 库相关。 如果我在 TCMB 中分配 TRIGText 和 TRIGData、代码会在到达对 ti_arm_sin 函数的调用时抛出异常。 检查后、汇编地址跳转到 TCMA 中的一个位置、其中没有 trigText 和 trigData。 只有在 TCMA 中分配了 trigText 和 trigData 或者根本没有分配时、代码才会正常运行。

        .vectors  : {    } > R5F_VECS   , palign(8)
    
    	GROUP : {
    
    
    	}  > R5F_TCMA
    
    	GROUP : {
    	.trigData : {} palign(8)
    	.trigText :{}palign (8)
    	.armiqmath : {    } palign(8)
    	}  > R5F_TCMB
    
        GROUP  :   {
        .text.hwi : {    } palign(8)
        .text.cache : {    } palign(8)
        .text.mpu : {    } palign(8)
        .text.boot : {    } palign(8)
        .text:abort : {    } palign(8)
        } > OCRAM
        
        
        
    static inline __attribute__((__section__(".armiqmath"),always_inline))_iq24 _IQ24mpy1(_iq24 A, _iq24 B)
    {
        _iq24 result;
        __asm__ volatile(
            "smull   r2, r3, %1, %2\n"
            "lsr     r2, r2, #24\n"
            "lsr     r3, r3, #8\n"
            "add     %0, r2, r3\n"
            : "=r" (result)
            : "r" (A), "r" (B)
            : "r2", "r3", "cc"
        );
        return result;
    }

       我使用 CCS12.7.0提供了我的项目。 此外、如果我要将所有使用的 IQMath (Q=24)函数(乘法、除法、sin、cos、平方根)放在 TCMA 中、应如何继续?

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

    尊敬的 Zhou:

    需确认的几件事情1

    1.你写的代码 armiqmath 码在从 MSRAM(除 TCM 之外的任何地方)执行时是否可以正常工作,只是为了确认码没有问题?

    2.您使用的是 SDK 中的哪个示例?

    3.您能将整个地图文件发送给我吗  

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

    尊敬的 Nilabh:  

        因假期而延迟响应、我们深表歉意。  

        1.是的,它在 OCRAM 中正常工作,我得到了正确的答案我的函数。

        2.我没有用例子。 我使用了自己的项目。   我比较的示例是\examples\kernel_nortos\basic_smart_placement 中的 basic_smart_placement。

        3.我会将 MAP 文件发送给 TI 工程师 、看看他们是否可以转发给您。  此映射文件是非工作用例。 无论我如何修改它、我都无法将定制的"armiqmath"分配到 TCMA、因此我也没有可正常工作的映射文件。

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

    尊敬的 Zhou:

    我将努力在下周星期三之前回到这个话题。

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

    static __attribute__((__section__(".text.armiqmath"))_iq24 _IQ24mpy1 (_iq24 A、_iq24 B)

    _iq24结果;
    __ ASM_易失性(
    "smull R2、R3、%1、%2\n"
    "LSR R2、R2、#24\n"
    "LSR R3、R3、#8\n"
    "添加%0、R2、R3\n"
    :"=r"(结果)
    :"r"(A)、"r"(B)
    :"R2"、"R3"、"cc"
    );
    返回结果;
    }

    尊敬的 Zhou:

    我能够在 TCM 中使用上述语法获得该函数

    此外、我建议阅读此内容、以了解有关编译器内联功能和段放置的更多详细信息

    将它们配置为 TCMA 或 TCMB。 但是、即使我尝试了所有代码优化级别、我自己定义的.armiqmath 也不会在 TCM 中生成。[/QUOT]

    另外、我看到、当我们内联函数时、行为是在中的映射文件中不可见、如下所示:

    software-dl.ti.com/.../function_attributes.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    然而、我自己定义的.armiqmath 不会在 TCM 中生成、即使我尝试了所有代码优化级别。

    如果您删除该内联、我们可以在映射文件中看到它。 进行内联时、所有定义都将替换为汇编代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
       我怀疑这可能与 ti_arm 库有关。 如果我在 TCMB 中分配 TRIGText 和 TRIGData、代码会在到达对 ti_arm_sin 函数的调用时抛出异常。 检查后、汇编地址跳转到 TCMA 中的一个位置、其中没有 trigText 和 trigData。 只有在 TCMA 中分配了 TRIGText 和 TRIGData 或者根本未分配时、代码才会正常运行。

    这一点对我来说不是很清楚、但我能说的是 triText 和 trigData 只是链接器组、因此您不会在反汇编中看到它们。

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

    尊敬的 Nilabh:

      如电子邮件中所述、即使在直列和始终直列溢出后、我仍然没有达到预期的结果。  编译后、我检查了内存分配、但 TCMA 中没有内容。

      我使用了以下软件环境:CCS12.8.0 SysConfig 1.21.999 SDK10.0.0.37优化:s.

      此外、我对 SDKPATH\examples\kernel_nortos\basic_smart_placement 处的示例程序 basic_smart_placement 进行了以下修改。

      我对 annoted_function_f2函数进行了以下修改、修改了该函数以接受参数并为其设置返回值。

    int __attribute__((local(2))) annotated_function_f2(int A, int B)
    {
        int result;
        __asm__ volatile(
            "smull   r2, r3, %1, %2\n"
            "lsr     r2, r2, #24\n"
            "lsr     r3, r3, #8\n"
            "add     %0, r2, r3\n"
            : "=r" (result)
            : "r" (A), "r" (B)
            : "r2", "r3", "cc"
        );
        return result;
    }

    我几乎没有对其他部分进行任何更改,只有构造的变量才能确保编译成功通过。

    void __attribute__((local(1))) annotated_function_f1(void)
    {
        calRes = annotated_function_f2(5, 5);
        annotated_function_f3();
        annotated_function_f4();
    }
    

    编译后、我检查了内存分配、发现修改后的 annoted_function_f2在 TCMA 中不存在。

    TCMA 中存在我未修改的函数 annoted_function_f3和 annoted_function_f4。

    同样、我无法在映射文件中找到 annoted_function_f1和 annoted_function_f2函数;只有 annoted_function_f3和 annoted_function_f4存在、这些函数确实包含在 TCMA 中。

    .init_array 
    *          0    70040000    00000000     UNINITIALIZED
    
    .TI.local 
    *          0    00000040    00001404     
                      00000040    00001002     basic_smart_placement.o (.text.annotated_function_f3)
                      00001042    00000402     basic_smart_placement.o (.text.annotated_function_f4)
    
    MODULE SUMMARY
    
           Module                                code    ro data   rw data
           ------                                ----    -------   -------
        .\
           basic_smart_placement.o               12454   132       40     
           main.o                                28      0         0      
        +--+-------------------------------------+-------+---------+---------+
           Total:                                12482   132       40     

    如果我在不修改代码编译的情况下将优化级别从 S 更改为关闭优化、则 annoted_function_f2将重新出现。 为什么会这样?

    .init_array 
    *          0    70040000    00000000     UNINITIALIZED
    
    .TI.local.1 
    *          0    00000040    00000042     
                      00000040    0000001e     basic_smart_placement.o (.text.annotated_function_f1)
                      0000005e    00000002     --HOLE-- [fill = 0]
                      00000060    00000022     basic_smart_placement.o (.text.annotated_function_f2)
    
    .TI.local.2 
    *          0    00000090    000063fe     
                      00000090    00004ffe     basic_smart_placement.o (.text.annotated_function_f3)
                      0000508e    00000002     --HOLE-- [fill = 0]
                      00005090    000013fe     basic_smart_placement.o (.text.annotated_function_f4)
    
    MODULE SUMMARY
    
           Module                                code    ro data   rw data
           ------                                ----    -------   -------
        .\
           basic_smart_placement.o               61622   132       40     
           main.o                                38      0         0      
        +--+-------------------------------------+-------+---------+---------+
           Total:                                61660   132       40     
                                                                          

     如果问题无法快速解决、您能否提供一个包含 TCMA 中分配的函数的示例程序? 我应该能够自由修改函数内容、而不影响内存分配。 或者、我将提供以下汇编代码、请提供一个示例程序、将其放置在 TCMA 中以供执行、我可以调用并从外部传递值。

     static __attribute__((__section__(".armiqmath")))_iq24 _IQ24mpy_test(_iq24 A, _iq24 B)
    {
        _iq24 result;
        __asm__ volatile(
            "smull   r2, r3, %1, %2\n"
            "lsr     r2, r2, #24\n"
            "lsr     r3, r3, #8\n"
            "add     %0, r2, r3\n"
            : "=r" (result)
            : "r" (A), "r" (B)
            : "r2", "r3", "cc"
        );
        return result;
    }
    const float f2iqScale = 16777216.0f;
    const float iq2fScale = 0.000000059604645f;
          static __attribute__((__section__(".armiqmath")))_iq24  _IQdiv_test(_iq24 iqDividend, _iq24 iqDivisor)
    {
        _iq24 result;
        __asm__ volatile (
            "vmov    s0, %1                \n"
            "vmov    s1, %2                \n"
            "vcvt.f32.s32   s0, s0         \n"
            "vcvt.f32.s32   s1, s1         \n"
            "vdiv.f32       s2, s0, s1     \n"
            "vldr.f32       s3, [%3]       \n"
            "vmul.f32       s2, s2, s3     \n"
            "vcvt.s32.f32   s2, s2         \n"
            "vmov           %0, s2         \n"
            : "=r" (result)
            : "r" (iqDividend), "r" (iqDivisor), "r" (&f2iqScale)
            : "s0", "s1", "s2", "s3", "cc", "memory"
        );
        return result;
    }
    static __attribute__((__section__(".armiqmath")))_iq24 _IQ24sin_test1(const _iq24 inputIq24Num)
    {
        _iq24 iqSinResult;
        float floatSinResult;
        float inputFloatNum;
        __asm__ volatile (
            "vmov    s0, %1           \n"
            "vcvt.f32.s32 s0, s0      \n"
            "vmov.f32 s1, %2          \n"
            "vmul.f32 s0, s0, s1      \n"
            "vmov    %0, s0           \n"
            : "=r" (inputFloatNum)
            : "r" (inputIq24Num), "r" (iq2fScale)
            : "s0", "s1", "cc", "memory"
        );
        floatSinResult = ti_arm_sin(inputFloatNum);
        __asm__ volatile (
            "vmov    s0, %1               \n"
            "vldr    s1, [%2]             \n"
            "vmul.f32   s0, s0, s1        \n"
            "vcvt.s32.f32 s0, s0          \n"
            "vmov    %0, s0               \n"
            : "=r" (iqSinResult)
            : "r" (floatSinResult), "r" (&f2iqScale)
            : "s0", "s1", "cc", "memory"
        );
        return iqSinResult;
    }
    

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

    尊敬的 Zhou:

    我要附加一个工程、在调试模式下编译时将代码放置在 TCM A 中。我可以看到代码放置在 TCM A 中并进行内联。

    我在发布模式下的情况不同-我认为原因可能是优化、我正在与编译器团队核实。

    我将在下周早些时候提供有关第二个问题的最新信息、同时请查看示例项目。

    /cfs-file/__key/communityserver-discussions-components-files/908/code_5F00_placement_5F00_TCMA.zip

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

    编译器团队主题: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1428486/arm-cgt-release-build-removes-code-from-tcm/5476193#5476193

    嗨、  

    我们将继续与编译器团队讨论上述线程