主题中讨论的其他器件: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]
/ /