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.
工具与软件:
我将按照 TI 文献 SPNA138A 中的建议使用 PMU
我将事件计数器0配置为对处理器周期进行计数。
当我执行下面的循环时、进行"自由运行"、在循环结束后、计数的周期数量大约是我预期的两倍。
for 循环的每次迭代为10条 asm 指令(如图所示)
如果我运行循环500次、我会在计数器中得到大约10,000、我预计会在计数器中得到5000
如果我运行循环1000次、我将在计数器中得到20,000、我预期会在计数器中得到10,000。
因此、计数器中的值是我预期的两倍大
处理器时钟速度是200 MHz、但我不认为这一点很重要。
您好!
我们有关此主题的专家今天不在办公室,请期待下周早些时候的答复,谢谢。
此致、
Ralph Jacobi
尊敬的 Kip:
对延迟响应深表歉意。
这是我第一次看到此应用手册。
如果可能、您能在我的结尾分享您用于快速调试的示例代码吗?
——
谢谢、此致、
Jagadish。
TI 在这方面取得了哪些进展?
尊敬的 Kip:
我对延迟回复表示诚挚的歉意。我休假了几天、然后是周末。
我看不到您的代码有任何问题、我觉得一切正常。 我唯一怀疑的是:
(+)[RM57L LaunchPad]执行时间测量-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
如果您验证上述线程、则会提到:
PMU 运行在 CPU 的时钟频率(GCLK)上、而不是在系统模块时钟频率(HCLK)上。
我认为在我们的案例中、我们也使用 HCLK 而不是 GCLK。
我想这里 HCLK 也是 GCLK 的一半、这就是我们使用 PMU 为测量获取两倍时钟的原因。 我的意思是 PMU 给出的计数是 GCLK 的冬季、但我们使用 HCLK 计算周期(是 GLCK 的一半)、这就是我们为 PMU 执行测量获得两倍周期值的原因。
——
谢谢、此致、
Jagadish。
Jagadish --你的评论很有趣、但没有解决我的问题。
在我的系统中、HALCoGen 进行了配置、使得 GCLK == HCLK == 200 MHz。因此我不认为涉及 PMU 的时钟源。
只需将程序加载到带有 Hercules 开发套件的 CCS 调试器中、然后在"for"循环中对汇编指令进行计数、那么您将看到计数器计数的处理器周期数将超过 for 循环中实际计数的两倍(2倍)。
L1美元:
0000d028: E59F012C LDR r0、[PC、#0x12c]
0000d02c: E590C000 LDR R12、[R0]
0000d030: E28CC001 添加 R12、R12、#1
0000d034: E580C000 str R12、[r0]
56 表示(uint32 I= 0;I<LOOP_COUNT;I++)
0000d038: E59DC000 LDR R12、[R13]
0000d03c: E28CC001 加上 R12、R12、#1
0000d040: E58DC000 str R12、[R13]
0000d044: E59DC000 LDR R12、[R13]
0000d048: E35C0F7D CMP R12、#0x1F4
0000d04c: 3AFFFF5 Blo $C$L1
我觉得所有这些 asm 指令都是1个处理器时钟周期
我的测试条件为:
禁用所有变量、寄存器、表达式等的刷新、因此 JTAG 不会刷新数据
自由运行、然后在断点处手动停止。
下面是可能导致此问题的一些原因:
这不是浮点问题、因为我刚刚讨论的是处理器周期。
Jagadish --你的评论很有趣、但没有解决我的问题。
在我的系统中、HALCoGen 进行了配置、使得 GCLK == HCLK == 200 MHz。因此我不认为涉及 PMU 的时钟源。
只需将程序加载到带有 Hercules 开发套件的 CCS 调试器中、然后在"for"循环中对汇编指令进行计数、那么您将看到计数器计数的处理器周期数将超过 for 循环中实际计数的两倍(2倍)。
L1美元:
0000d028: E59F012C LDR r0、[PC、#0x12c]
0000d02c: E590C000 LDR R12、[R0]
0000d030: E28CC001 添加 R12、R12、#1
0000d034: E580C000 str R12、[r0]
56 表示(uint32 I= 0;I<LOOP_COUNT;I++)
0000d038: E59DC000 LDR R12、[R13]
0000d03c: E28CC001 加上 R12、R12、#1
0000d040: E58DC000 str R12、[R13]
0000d044: E59DC000 LDR R12、[R13]
0000d048: E35C0F7D CMP R12、#0x1F4
0000d04c: 3AFFFF5 Blo $C$L1
我觉得所有这些 asm 指令都是1个处理器时钟周期
我的测试条件为:
禁用所有变量、寄存器、表达式等的刷新、因此 JTAG 不会刷新数据
自由运行、然后在断点处手动停止。
下面是可能导致此问题的一些原因:
这不是浮点问题、因为我刚刚讨论的是处理器周期。
尊敬的 Kip:
在我看来、所有这些 asm 指令都是1个处理器时钟周期
不能 Kip、所有这些指令不会花费单个时钟周期、其中一些指令可能花费超过一个时钟周期。
请参阅以下链接、详细了解这一点:
(+) cortex R4执行周期-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
为什么执行 LDR 需要两个周期-架构和处理器论坛-支持论坛- Arm 社区
——
谢谢、此致、
Jagadish。