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.

[参考译文] TMS320C6748:CPU 速度

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/597276/tms320c6748-cpu-speed

器件型号:TMS320C6748

你好

我尝试通过运行下面的代码来测量 CPU 速度、并测量它在断点(末尾的 while (1)命令)中停止的时间

void main (void)

volatile unsigned int dlyCount、counter=0;
无符号超长整型 ullTimeStart、ullTimeDiff、ullTimeEnd;

TSCL = 0;
ullTimeStart = TSCL;
ullTimeStart +=(无符号超长整型) TSCH <<32;

while (1)

COUNTER++;


for (dlyCount=0;dlyCount<100000;dlyCount++);

IF (计数器>10000)
中断;
ullTimeEnd = TSCL;
ullTimeEnd +=(无符号超长整型) TSCH <<32;
ullTimeDiff = ullTimeEnd - ullTimeStart;
};
while (1);//断点

到达断点所需的时间为64秒、 ullTimeDiff =19、000、620、000。

我在 C6748 LCDK 板上运行此代码、并使用 LCDK GEL 文件将 CPU 时钟配置为300MHz。

当我查看汇编代码时、for 命令是在单个指令上执行的、这意味着对于100000 * 10000循环、它将花费1000000000 * 3.3nsec= 3.3sec、如果花费64sec - 20倍的时间、它将花费1000000000 * 3.3nsec= 3.3sec。

ullTimeDiff 看起来是正确的。

造成这种延迟的原因可能是什么?

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

    我已将此内容转发给软件专家。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您计算的周期数不正确。 从 DSP L2 RAM 运行代码、并将 ullTimeStart 置于 for 循环正上方的 while 循环内。

    如果您从共享 RAM 或 DDR 存储器运行代码、 然后、您需要配置 L1和 L2高速缓存、因此为了进行简单的基准测试、我们建议移动 DSP L2存储器中的所有代码和数据、以便高速缓存延迟或外部存储器访问延迟不是内核基准测试的一部分。

    作为参考,以下是核心参考基准,以及如何为该核心捕获这些基准:
    www.ti.com/.../core-benchmarks.page

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

    Ilan、

    有一篇包含示例程序的 Wiki 文章、可帮助您通过与墙式时钟进行比较来测量 DSP 时钟速度。 这篇文章介绍 了我的 DSP 时钟速度、其中包含一个您可以下载和导入的 zip 文件。 尽管它在 CCSv4和 CCSv5上经过测试、但它应该可以在 CCSv6和 CCSv7上轻松工作。 如果在导入时遇到任何问题、只需使用解压缩的文件夹并拉出源文件、包括.cmd。 您可能需要对处理器进行更改、但它可以与任何 C64x+和更高版本的 DSP 配合使用。

    有人写了一个更好的、使用壁式时钟 API 来解决它、但我不确定它在哪里。

    此致、
    RandyP

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

    你(们)好

    代码位于 L2RAM 中、提供的结果相同。 文章"我的 DSP 时钟速度是什么"使用 TCSL 测量时间、但在我的测试中、我从 TCSL 获得的值是正确的-这意味着 CPU 按预期以300MHz 运行、 但是、这个简单的循环代码仍比预期花费了20个时间。 这样做的原因可能是什么?

    我使用时间戳来测量1000000*1000循环的时间(UllTimeStart 位于循环之前,ullTimeEnd 位于循环之后)。 它提供了正确的值:

    19019033046/64=3.3nsec。 但在1、000、000、000的循环中、我预计将得到3.3nsec*1、000、000=3.3秒、而不是64秒

    我在未将只计数 器和 计数器定义为易失性的情况下进行了另一次测试、并得到30秒的延迟。

    void main (void)

    volatile unsigned int dlyCount、counter=0;
    无符号超长整型 ullTimeStart、ullTimeDiff、ullTimeEnd;

    TSCL = 0;
    ullTimeStart = TSCL;
    ullTimeStart +=(无符号超长整型) TSCH <<32;

    while (1)

    COUNTER++;


    for (dlyCount=0;dlyCount<1000000;dlyCount++);

    如果(计数器>1000)
    中断;

    };
    ullTimeEnd = TSCL;
    ullTimeEnd +=(无符号超长整型) TSCH <<32;
    ullTimeDiff = ullTimeEnd - ullTimeStart;
    while (1);//断点

    名称源长度使用未使用的属性填充
    ------------ ---- ------ ---- ---- --------
    DSPL2ROM 00700000 00100000 00000000 00100000 RWIX
    DSPL2RAM 00800000 00040000 0000106c 0003ef94 RWIX
    DSPL1PRAM 00e00000 00008000 00000000 00008000 RWIX
    DSPL1DRAM 00f00000 00008000 00000000 00008000 RWIX
    SHDSPL2ROM 11700000 00100000 00000000 00100000 RWIX
    SHDSPL2RAM 1180000040000 00000000 00040000 RWIX
    SHDSPL1PRAM 11e00000 00008000 00000000 00008000 RWIX
    SHDSPL1DRAM 11f00000 00008000 00000000 00008000 RWIX
    EMIFACS0 40000000 20000000 00000000 20000000 RWIX
    EMIFACS2 60000000 02000000 00000000 02000000 RWIX
    EMIFACS3 62000000 02000000 00000000 02000000 RWIX
    EMIFACS4 64000000 02000000 00000000 02000000 RWIX
    EMIFACS5 66000000 02000000 00000000 02000000 RWIX
    SHRAM 8000000 00020000 00000000 00020000 RWIX
    DDR2 c0000000 20000000 00000000 20000000 RWIX

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

    RAN、

    我错误地从您的帖子标题和第一行假设您尝试确定 CPU 速度- DSP 运行速度有多快。

    现在、我了解您关注的是 DSP 执行基准测试代码的速度。 这是一个不同的问题,我对我的困惑表示歉意。

    您在最初的帖子中说过

    [引用 user="Ilan R"]当我查看汇编代码时,for 命令是在单个指令上执行的

    这是不可能的、因此也会对 DSP 的工作产生误解。

    默认情况下应启用 L1P 和 L1D 缓存。 请确认这些已启用。 由于您的代码是一个包含少量数据变量的小循环、因此第一次通过后所有内容都应位于 L1P 和 L1D 高速缓存中;第一次通过后将避免任何内存延迟。

    请找到用于生成列表文件的编译器选项、并将该文件附加到此线程。 这将包括编译器设置和使用的汇编代码。 在该文件中、您和我们将能够对 for 循环中使用的实际指令进行计数。 我假设总数将增加到大约20。 任何循环的绝对最小周期计数为6、因为 B 分支指令需要6个周期、即使它在超紧密循环中仅分支到自身也是如此。

    要问的更好的问题是、为什么要这样做? 您知道 DSP 时钟周期为300MHz、因此出于某种原因对简单测试代码进行基准测试?

    此致、
    RandyP

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

    您好、Randy、

    我附上 main.c 和 main.lst 文件。

    GEL 文件(LCDK GEL)似乎未配置 L1PCFG 或 L1DCFG。 我在调试器中检查了该寄存器的值、它是7和3。 我将 L1DCFG 更改为 7 (所有高速缓存)。

    调试器中。 环路在线路 LDW-D2T2     *B15[1]、B4上完成。 B4递增的地方、这就是我假设它需要一个周期、但该命令可能需要更多周期的原因。

    正如我在移除易失性时提到的、时间为30秒(即使 main.lst 未更改)。

    我开始执行此测试是因为我需要以~3mbps 的速度激活 UART。  我需要每100微秒接收数据和发送一次数据。 我尝试使用 DMA 来执行此操作、我测量的时间为~60usec、以接收数据并将其传回、因此这意味着 DSP 将花费大部分时间来发送和接收数据(甚至无需处理数据或执行相关任务)。 因此、为了检查我的测量是否正常、我开始检查 CPU 时钟和代码执行时间。

    目前、对于 UART、我仍需要决定是否使用 EDMA、或者将消息直接写入 UART FIFO 并使用 UART 中断的速度会更快 (消息大小小于 UART FIFO 大小)

    此致

    Ilan

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

    是否可以再次尝试附加文件? 当我尝试查看它们时、它们不会出现。

    LDW/D2T2 *B15[1]、B4只从堆栈中读取单个值。 B15 == SP。 这不是完整的环路。

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

    您好、Randy

    您是对的,在检查使 for 循环所需的步骤(执行不容易的单个步骤)后,在易失性示例中需要19个周期,在没有易失性的情况下需要9个周期。

    易失性环路:

    008003a8:  BC4D               LDW/D2T2     * B15[1]、B4
    008003aa:  6C6E               NOP          4.
    008003ac:  2641               ADD.L2       B4、1、B4
    008003ae:  BC45               STW/D2T2     B4、*B15[1]
    008003b0:  BC4D               LDW/D2T2     * B15[1]、B4
    008003b2:  6C6E               NOP          4.
    008003b4:  00148BFA           CMPLTU/L2    B4、B5、B0
    008003b8:  2004A120    [B0] BNOP.S1      $C$L2 (PC+8 = 0x008003a8)、5.
    008003bc:  E3A00000           .fphead      n、l、W、BU、nobr>、 Nosat、0011101

    非易失性环路:

    008003a4:  2641               ADD.L2       B4、1、B4
    008003a6:  BC45               STW/D2T2     B4、* B15[1]
    008003a8:  00148BFA           CMPLTU/L2    B4、B5、B0
    008003ac:  2002A120    [B0] BNOP.S1      $C$L2 (PC+4 = 0x008003a4)、5.

    这说明了 for loop 命令的延时时间。

    关于我对 UART 的问题:

    我必须使用运行速度为~3Mbps 的 UART 接收14个字节并发送14个字节(如果必须、我可以更改此数据速率)。 每 ~100 μ s 接收和发送一次数据。 更好 (减少 CPU 时间使用量)是直接向 /从 UART FIFO 寄存  器发送和接收数据(使用中断)、或使用 EDMA 执行此操作。 从接收到数据到发送数据(由 UART 线路上的范围进行计算)的时间延迟~60usec 是否合理?  该测试通过将 EDMA 配置为从 UART 接收数据并将其发送到 UART 来完成。 (如果是16字节或88字节、则测量的延迟几乎相同)

    此致

    Ilan  

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

    波特率通常以每秒位数 bps 来写入、而不是每秒字节数 BPS。 我假设您的波特率为3Mbps、但如果不是、它可能会产生很大的影响。

    即使是3MBaud 也是高数据速率、但器件可以处理高达12Mbaud 的数据速率。

    您能否澄清14个 Rx 字节和14个 Tx 字节的时序? 它们是否以某种方式重叠? 100us 是什么:对于每个字节、每组14个字节、等等? 和60us? 显然、我没有找到计算器来计算它。 我会让你做繁重的工作。

    使用 EDMA 而不是 DSP 进行数据移动当然会更好。 如果您可以使用 UART 的 FIFO、这也会有所帮助、但需要您对传输时序进行澄清、以了解如何使用它。

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

    您好、Randy

    我正在使用配置为每秒4687500位的 UART。

    我的程序每隔~100usec 检查 一次标头、接收14个字节 、然后发回14个字节。

    我进行了一些新的测试、测量 的是从接收到数据到发回数据之间的大约~5uSec 延迟。 示波器在最后接收到的位到第一个发送位之间测量的时间。

    具有 FIFO 14和 UART 中断- 5 μ s

    具有 FIFO 1和 EDMA 中断- 5.9 μ s

    具有 FIFO 14和 EDMA 中断- 7.2 μ s

    接收中断时间(在 EDMA 和 UART 测试中)在最后一个接收位之后为1.6usec。

    因此、正如您看到的、差异不是很高、主要取决于代码实现。 (我使用300MHz 时钟、L2中的代码、L1P/d 中的高速缓存)

    因此、我可能会选择使用 EDMA、这将使我在数据大小方面具有更大的灵活性、小于或多于14 (不带 EDMA 的 UART FIFO 将数据大小限制为14/8/4作为 FIFO 大小)

    谢谢

    Ilan