Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式C中代码块的时钟周期计数_C++_C_Assembly_Embedded - Fatal编程技术网

C++ 嵌入式C中代码块的时钟周期计数

C++ 嵌入式C中代码块的时钟周期计数,c++,c,assembly,embedded,C++,C,Assembly,Embedded,我在Keil板上编程,试图计算C函数中的代码块执行所需的时钟周期数 有没有一种方法可以将时间精确到代码块前后的微秒,这样我就可以得到diff并将其除以每微秒的时钟周期数来计算代码块消耗的时钟周期 time.h中的clock()函数以秒为单位给出时间,这将使差值为0,因为这是一个小代码块,我正在尝试获取时钟周期 如果这不是解决此问题的好方法,还有其他方法吗?在嵌入式世界中计算时钟周期数的最佳方法是使用示波器。在代码块前后切换GPIO引脚,并使用示波器测量时间。测量的时间乘以CPU频率是CPU时钟周

我在Keil板上编程,试图计算C函数中的代码块执行所需的时钟周期数

有没有一种方法可以将时间精确到代码块前后的微秒,这样我就可以得到diff并将其除以每微秒的时钟周期数来计算代码块消耗的时钟周期

time.h中的clock()函数以秒为单位给出时间,这将使差值为0,因为这是一个小代码块,我正在尝试获取时钟周期


如果这不是解决此问题的好方法,还有其他方法吗?

在嵌入式世界中计算时钟周期数的最佳方法是使用示波器。在代码块前后切换GPIO引脚,并使用示波器测量时间。测量的时间乘以CPU频率是CPU时钟周期的最大值。

在嵌入式世界中计算时钟周期数的最佳方法是使用示波器。在代码块前后切换GPIO引脚,用示波器测量时间。测量的时间乘以CPU频率就是CPU时钟周期数。

读取芯片中的计时器,找到一个您正在使用的操作系统/环境没有消耗的,直接使用它。这需要一些练习,您需要使用volatiles来避免编译器重新安排代码或重新读取计时器。您需要调整定时器上的预分频器,以便在不翻滚的情况下获得最实用的分辨率。因此,从一个大的预刻度除数开始,说服自己它没有滚动,然后使预刻度除数变短,直到达到除以1或达到所需的精度。如果除以1还不够,那么你必须在一个循环中多次调用该函数,并在该循环中花费时间。请记住,任何时候更改代码以添加这些度量值时,您都可以并且将更改代码的性能,有时小到不需要注意,有时10%-20%或更高。如果您使用的是缓存,那么您添加或删除的任何代码行都可能以两位数的百分比改变性能,您必须了解更多关于在这一点上对代码计时的信息。

阅读芯片中的计时器,找到您正在使用的操作系统/环境尚未使用的计时器,并直接使用它。这需要一些练习,您需要使用volatiles来避免编译器重新安排代码或重新读取计时器。您需要调整定时器上的预分频器,以便在不翻滚的情况下获得最实用的分辨率。因此,从一个大的预刻度除数开始,说服自己它没有滚动,然后使预刻度除数变短,直到达到除以1或达到所需的精度。如果除以1还不够,那么你必须在一个循环中多次调用该函数,并在该循环中花费时间。请记住,任何时候更改代码以添加这些度量值时,您都可以并且将更改代码的性能,有时小到不需要注意,有时10%-20%或更高。如果您使用的是缓存,那么添加或删除的任何代码行都可能以两位数的百分比改变性能,您必须了解更多关于此时代码计时的信息。

如果处理器包括ETM,您忽略了说明板上的处理器(远比板的品牌重要!),如果您有一个ULINK Pro或其他支持跟踪的调试器,那么uVision可以在指令周期级别直接以非侵入方式评测执行代码

类似地,如果在uVision模拟器中运行代码而不是在实际硬件中运行代码,则可以获得周期精确的评测和计时,而无需硬件跟踪支持

即使没有跟踪功能,uVision的“秒表”功能也可以在两个断点之间直接计时。秒表位于状态栏中IDE的底部。您确实需要在调试器跟踪配置中设置时钟频率,以便从秒表获取“实时”


一种不需要特殊调试或模拟器功能的简单方法是使用可用的计时器外围设备(或Cortex-M设备的sysclk)为代码段的执行开始和结束添加时间戳,或者如果没有可用的计时资源,可以切换GPIO引脚并在示波器上对其进行监控。这些方法具有硬件或模拟器跟踪中不存在的某种程度的软件开销,这可能使它们不适合非常短的代码段。

如果处理器包括ETM,您忽略了说明板上的处理器(远比板的品牌重要!),如果您有一个ULINK Pro或其他支持跟踪的调试器,那么uVision可以在指令周期级别直接以非侵入方式评测执行代码

类似地,如果在uVision模拟器中运行代码而不是在实际硬件中运行代码,则可以获得周期精确的评测和计时,而无需硬件跟踪支持

即使没有跟踪功能,uVision的“秒表”功能也可以在两个断点之间直接计时。秒表位于状态栏中IDE的底部。您确实需要在调试器跟踪配置中设置时钟频率,以便从秒表获取“实时”

一种不需要特殊调试或模拟器功能的简单方法是使用可用的计时器外围设备(或Cortex-M设备的sysclk)为代码段的执行开始和结束添加时间戳,或者如果没有可用的计时资源,可以切换GPIO引脚并在示波器上对其进行监控。这些方法有一些硬件或模拟器跟踪中不存在的软件开销,这可能使它们不适合非常短的代码段。

您尝试过cloc吗