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.

[参考译文] 编译器/TDA2EXEVM:64位未正确复制到64位类型的结构元素?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/656565/compiler-tda2exevm-64-bit-not-copied-properly-to-structure-element-of-64-bit-type

器件型号:TDA2EXEVM

工具/软件:TI C/C++编译器

你(们)好

我尝试读取系统计数

func (uint64、os_code) os_GetCPUTimerCount (void)

volatile VAR (uint64、OS_VAR_cleared) LddCurrentTick;
asm ("isb");
asm volatile ("mrrc P15、0、%Q0、%R0、C14":"=r"(LddCurrentTick));/* cntpct */
return (LddCurrentTick);

使用此函数  

我的结构  

typedef 结构 stag_os_Timing

/*任务的空闲节拍*/
uint64 ulIdleTime;

/*任务的开始勾号*/
uint64 ulStartTick;

/*以节拍为单位开始核心时间*/
uint64 ulStartCoreTime;

/*溢出时的总节拍数*/
uint64 ulTotalOvrflwTime;
} OS_Timing;

尝试读取它只会反映的值

32位值.os_GaaTiming[OS_CORE_ID].ulStartTick

OS_GaaTiming[OS_CORE_ID].ulStartTick =OS_GetCPUTimerCount ();

请帮助建议如何将此系统计数器值复制到结构。

此致、

Kiran vidh发

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

    我已将您的问题转交给一位专家征求意见。

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

    您能否分享生成的此代码反汇编?

    您使用的代码似乎是正确的。

    elixir.free-electrons.com/.../arch_timer.h 中的参考 C 实现
    同样、参考 ASM 实现方式为:

    .macro ReadCP15Reg_64 CRM、操作码
    代码16.
    按{R2-R7、LR}
    ADR R7、1f
    BX R7
    .code 32.
    1:
    MRRC P15、\Opcode、R2、R3、\CRM @ R2具有较低的32位、R3具有较高的32位
    结构 R2、[R0]
    结构 R3、[R1]
    ADR R7、2f + 1
    BX R7
    代码16.
    2:
    弹出 {R2-R7、PC}
    endm

    对齐4.
    ARM_MRRC_RD_C14_0:
    ReadCP15Reg_64 C14、0

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

    我们没有听到您对这个问题的反馈。 您的问题是否已解决?

    谢谢、此致、
    Piyali