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.

[参考译文] RM46L852:为什么读取一个寄存器需要40个时钟周期? [标题已编辑]

Guru**** 2394305 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631737/rm46l852-why-does-it-take-40-clock-cycles-to-read-a-register-title-edited

器件型号:RM46L852
主题中讨论的其他器件:HALCOGEN

我的 RM46 Launchpad 读取寄存器的时间似乎太长。
我的测量值表明、读取 gioREG->GCR0并将其存储在堆栈上的变量需要42个时钟周期。

主要的问题是编译器/调试器、我怀疑寄存器数据的某些调试功能正在减慢速度、但我在 IDE 中找不到任何看起来可能的原因

IDE:IAR EWARM FS 7.40 (通过 HALCoGen 设置)未进行优化。
操作系统:FreeRTOS
GCLK = 160MHz。
测量方法:设置引脚、读取寄存器并再次清除引脚。 逻辑高电平的持续时间表示寄存器读取时间。

测试代码:两个用于循环、每个循环具有150次迭代(FIFO_DEPTH)。
环路一是仅切换引脚的基准。 这测量切换引脚所需的时间。
环路二是测量。

/ /

while (1){

xTaskNotifyWait( 0x00、0、&ulNotifiedValue、portMAX_DELAY );
volatile uint32_t temp = 0;
int i;

gioPORTA->DCLR = 1 << FIFO_CHA_READEN;
对于(I = 0;I < FIFO_DEPTH;I++){

gioPORTA->DSET = 1 << FIFO_CHA_CLK;
gioPORTA->DCLR = 1 << FIFO_CHA_CLK;


gioPORTA->DSET = 1 << FIFO_CHA_READEN;
gioPORTA->DCLR = 1 << FIFO_CHB_READEN;

对于(I = 0;I < FIFO_DEPTH;I++){

gioPORTA->DSET = 1 << FIFO_CHB_CLK;
temp = gioREG->GCR0;
gioPORTA->DCLR = 1 << FIFO_CHB_CLK;


gioPORTA->DSET = 1 << FIFO_CHB_READEN;

/ /

基准环路具有20纳秒的逻辑高电平持续时间
测量环路的逻辑高电平持续时间为280纳秒
如果这意味着在160MHz 的时钟速度下、寄存器读取需要260纳秒、那么完成读取和存储操作需要~42个时钟周期。
这是正常的吗?
我该从这里到哪里去? 我是否正确怀疑编译器/调试器?

/ /

这里是环路2 (测量环路)的装配

;gioPORTA->DSET = 1 << FIFO_CHB_CLK;

bbc9c:0x2120 MOV R1、#32;0x20
c9e:0x4a08 LDR.N R2、[PC、#0x20];[ccbbb0] GIOSETA
bbca0:0x6011 STR R1、[R2]

;temp = gioREG->GCR0;

bca2:0x4908 LDR.N R1、[PC、#0x20];[bbbcc4] 0xfff7bc00 (-541696)
bbca4:0x6809 LDR R1、[R1]
bbca6:0x9100 STR R1、[SP]

;gioPORTA->DCLR = 1 << FIFO_CHB_CLK;

bca8:0x2120 MOV R1、#32;0x20
caa:0x4a04 LDR.N R2,[PC,#0x10];[bbbbbbbbc] 0xFF7bc44 (-541628)
bbbcac:0x6011 STR R1、[R2]

/ /

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

    以下是测量环路的镂空:

    这是两个环路的鸟瞰图。 11.49us 和48.88us 指示每个循环的运行时间(150次迭代)

    这里是参考环路的镂空(我不确定它为什么需要更长的时间、它可能是 RTOS。 此外、这不是问题、除非它是更深层次问题的症状)  

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

    读取一个 GIO 寄存器大约需要40个 CPU 周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。

    我在读取时获得相同的性能
    temp = rtiREG1->CNT[0].FRCx;

    temp = hetPORT1->DIN;

    1、读取任何寄存器还是仅读取外设需要~40个周期?
    2.这是通用的 ARM 器件还是特定的 Hercules 器件?
    3.这方面是否有文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Audun、

    很抱歉我的误导性信息。 读取1个 GIO 寄存器需要大约12VCLK。 我的测试表明、读取 gioREG->GCR0寄存器需要大约25个 CPU 周期(1个 CPU 周期= 2个 vclk 周期)、

    这是我的测试代码:

    C 代码:
    /*启动 PMU 计数器*/
    /* PMU 校准*/
    _pmuInit_();
    _pmuEnableCountersGlob_();
    _pmuResetCounters_();
    _pmuStartCounter_(pmuCYCLE _计数器);

    for (i=0;i<10;i++){

    延迟(1000);
    time0 =_pmuGetCyclCount_();
    _LDR32A10_(0xFFF7BC00); //gioREG->GCR0 + 0x20 (FLG
    Time1 =_pmuGetCyclCount_();
    Timea = time1 - time0;

    延迟(1000);
    time0 =_pmuGetCyclCount_();
    _LDR32A20_(0xFFF7BC00); //gioREG->GCR0 + 0x20 (FLG
    Time1 =_pmuGetCyclCount_();
    timeB = time1 - time0;
    时间= timeB - Timea;
    时间=时间/ 10;



    汇编代码以从 GIO 寄存器读取数据:
    .text
    ARM

    .def _LDR32A20
    .def _LDR32A10_

    asmfunc

    _LDR32A10_;r0 =源地址、R1 =目的地址

    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0

    BX r14

    endasmfunc

    asmfunc
    _LDR32A20_;r0 =源地址、R1 =目的地址

    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0

    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0
    LDR R1、[r0]、#0

    BX r14

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

    谢谢你。 我将尝试与您相同的测试、并验证我是否获得相同的结果、但直到下周晚些时候我才有时间进行测试。