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.

[参考译文] TMS320F28377D:VCU2 CRC8处理时间

Guru**** 2589275 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/762700/tms320f28377d-vcu2-crc8-processing-time

器件型号:TMS320F28377D
Thread 中讨论的其他器件:C2000WAREcontrolSUITE

您好!

我已将 C2000Ware 1.00.03.00软件包中的 VCU CRC8库集成到我的 CCS 项目中。 我打算在 CAN 消息中生成字节的 CRC8。 是的、我知道已经可以为消息执行 CRC。  

无论如何、我已经使用 了 C2000Ware_1_00_03_00_Software\libraries\DSP\VCU\c28\examples\CRC\2837x_vcu2_CRC_8项目中的示例、并在我的代码库中实现了这些示例。  

我仅尝试在8个字节上生成 CRC8。 我发现、对于 VCU、字节需要打包到 uint16_ts 中。 我确认 CRC8正确无误、我对数据感到满意。

真正令我困扰的是、如果使用基于汇编的函数、生成 CRC8需要超过8ms、如果使用基于 C 的函数、则需要更长时间。 我仅在8个字节、4个字上生成 CRC8。 请参阅下面的配置:

/**
* CRC 对象初始化。 无缓冲器或字节计数、因为它们将因 CAN 消息而异。
*/
静态 void CAN_init_CRC (void){

/*步骤1:初始化 CRC 对象*/
CRC.seedValue = init_CRC8;
crc.nMsgBytes = 0;
crc.parity = CRC_奇 偶校验;
crc.crcResult = 0;
crc.pMsgBuffer = 0;
crc.pCrcTable =(uint16_t*)&crc8Table[0];
CRC.init =(void (*)(void *)) crc_init8Bit;
CRC.run =(void (*)(void *)) crc_run8Bit;

/*步骤2:初始化句柄*/
handleCRC =&CRC;

/*步骤3:运行8位表查找 CRC 例程并保存结果*/
CRC.init(handleCRC);
} 
/**
*用于计算给定有效载荷数组上 CRC*的函数。
*
*/
静态内联 uint16_t CAN_calc_crc (uint16_t*有效载荷、uint16_t DLC){

uint16_t RESP = 0U;

uint16_t packed_payload[4U]={0};
uint16_t wordcIdx = 0U;

/**
*将有效载荷中的每个字节打包为连续数据 LSBMSB 格式
* PAYLOAD[n]->紧凑[字](LSB)
* PAYLOAD[n+1]->紧凑[字](MSB)
*
for (uint16_t id = 0U;id < dlc;id += 2){
packed_payload[wordcIdx]|=(payload[id]);
packed_payload[wordcIdx]|=(payload[id + 1]<< 8);
wordIdx++;
}

crc.pMsgBuffer = packed_payload;
/*-1以不在计算中包含 CRC 字节*/
crc.nMsgBytes = DLC - 1;
CRC.run(handleCRC);

RESP =(uint16_t) crc.crcResult;
crc.crcResult = 0;

返回(RESP);
} 

使用示波器和一些 GPIO 切换、我可以看到"CAN_calc_crc"函数需要8ms 的返回时间。 这是正常的吗? 显式启用 VCU 是否需要一些标志? 我使用的是 VCU2、其中包含的库为"C28x_vcu2_library_fpu32.lib"

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引脚切换不是设定基准的正确方法、几乎没有什么可做的例程。 在 CCS >v7调试器中,单击 Run->Clock->Enable。 您应该在右下边缘看到硬件时钟。 双击它进行复位、然后单步执行 CAN_calc_crc()调用、并看到类似我看到的内容- 76。 我不知道为什么你得到8ms。 我使用的是 controlSUITE、CRC lib 为 v 1_00_02、但它不应有太大差异。

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

    感谢您提供信息。 我按照建议启用了硬件时钟、并删除了 GPIO 设置和清除指令。 当单步执行 calc_calc_crc 函数时、我看到右下角的计数器值为2、并且我在"Console"窗口中获得此信息:

    C28xx_CPU1:断点管理器:启用此函数时出错:无法使用现有的 AET 资源完成此任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Dainius:

    很抱歉、在28377S 上可以、我不知道它为什么不能在28377D 上工作。 也许有人会告诉您为什么会在28377D 上看到"使用现有的 AET 资源无法完成此任务"。

    您是否检查了内核时钟速度? 在 CRC 例程之前调用 InitSysCtrl()。 使用引脚作为基准测试工具、请尝试调用 CAN_calc_crc()、在设置引脚高电平和低电平之间连续调用100次。 时间不应增加100倍。 GPIO 很慢、但不在毫秒范围内、对于8字节 CRC 来说、8ms 太长。

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

    我将与您一起尝试并解决此问题。 请给我一天时间来查看这些信息并返回给您。

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

    在您的项目中、是否启用了 VCU 支持-右键单击项目属性、在 Build-C2000编译器-处理器选项下-是否可以检查-vcu_support 是否设置为 vcu2?

    谢谢、
    Sira
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有一个想法是让您准确地检查 CRC.run(handleCRC 执行所需的时间、因为这是这里关注的问题。

    谢谢、
    Sira
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你有更新吗? 如果您的问题已得到解答、我将继续并将问题标记为已解决。 如果您也可以将我的答案标记为"已验证"、那将会有所帮助。 谢谢! Sira