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.
工具/软件:Code Composer Studio
我正在尝试对闪存芯片映像执行 CRC、以便可以嵌入到映像本身中。 在启动和运行时、我会定期重新检查 CRC 的有效性。
我以前在处理 STM32F407芯片时已经完成过这项工作、但我看不到如何在 Hercules 上执行此操作。
我使用的是 CCS 8.1.0和 TMS570LS0432处理器。
谢谢!
Ken
要了解链接器内置的 CRC 支持、请在 ARM 汇编工具手册中搜索 标题 为链接器生成的 CRC 表的子章节。 支持多种不同的 CRC 算法。 请查阅器件的文档以了解要使用的算法。
谢谢、此致、
乔治
感谢你的答复。
如在基于 Hercules的微控制器上使用 CRC 模块中所述,我实施了链路后 CRC,为了进行完整性检查,我在同一文档中实施了软件 CRC 算法。 我在最小的.obj 文件、esm_het.obj 上测试了 CRC、40字节。 链接器生成的 CRC 和计算出的 CRC 不匹配。
下面是我对 sys_link.cmd 的修改:
存储器
{
引导程序(X) :origin=0x00000000 length=0x00000020
内核 (RX):origin=0x00000020 length=0x00008000
FLASHCRC(RW):origin=0x00008020 length=0x00000020
FLASH0 (RX):origin=0x00008040 length=0x00057FC0
堆栈 (RW):origin=0x08000000 length=0x00000800
Kram (RW):origin=0x08000800 length=0x00000800
RAM (RW):origin=(0x08000800+0x00000800) length=(0x00007800 - 0x00000800)
/*用户代码开始(2)*/
/*用户代码结束*/
}
部分
{
.intvecs:{}>向量
闪存受保护区域中的/* FreeRTOS 内核*/
.kernelTEXT :{}>内核
.cinit :{}>内核
.pinit :{}>内核
/*将其余代码转换为用户模式闪存区域*/
.text :{}> FLASH0
.const :{}>FLASH0
/* RAM 受保护区域中的 FreeRTOS 内核数据*/
.kernelbss :{}>Kram
.kernelHEAP :{}> RAM
.bss :{}> RAM
.data :{}> RAM
.sysmem :{}>RAM
fee_text_section:{}> FLASH0
fee_const_section:{}> FLASH0
fee_data_section:{}> RAM
/*用户代码开始(4)*/
.section_TO_BE_VERIFIED:{esp_het.obj (.text)}> FLASH0、palign = 8、fill=0xffffff、crc_table (link_crc_table_name、算法= TMS570_CRC64_ISO)
.TI.crctab:> FLASHCRC palign = 8
/*用户代码结束*/
}
在我的应用程序中、我调用:
(笑声)
crc_table * pCrcTable =(crc_table *) 0x00008020;
uint64 crcLinkerGenerated = 0;
uint64 crcSoftwareGenerated = 0;
uint64 crcFullCpuGenerated = 0;
//检查代码空间 CRC:
UINT64 CRC64 = 0;
uint64 * pData =(uint64 *) pCrcTable->recs[0].addr;
int i = 0;
int nSize = pCrcTable->recs[0].size/sizeof (uint64);
(i=0;<nSize; i++ )
{
CRC64 = CRC_UPDATE_WORD (CRC64、pData[i]);
}
crcLinkerGenerated = pCrcTable->recs[0].crc_value;
CrcSoftwareGenerated = CRC64;
(笑声)
下面是使用基于 Hercules的微控制器上的 CRC 模块复制的 CRC_UPDATE_WORD_()函数:
uint64 crc_update_word (uint64 CRC64、uint64数据)
{
int i、j;
uint64 nextCrc = 0;
//对于63到0环路中的 I
对于(i=63;i>=0;i---)
{
// next _CRC_VAL (0):= CRC_VAL (63) XOR data (I);
nextCrc =(nextCrc & 0xfffffffffffffffffffeULL)|((CRC64 >> 63)^(数据>> I));
//对于 j in 1到63循环
对于(j=1;j<64;j++)
{
//case j 为
//当1|3|4 =>时
如果(j=1 || j=3 || j==4)
{
// NEW_CRC_VAL (j):= CRC_VAL (j - 1) XOR CRC_VAL (63) XOR DATA (i);
nextCrc =(nextCrc &~(1ULL <<j))|(((((CRC64 >>(j - 1)))^(CRC64 >> 63)^(DATA >> I))& 1)<< j);
}
其他
{
//当其他人=>时
// next _CRC_VAL (j):= CRC_VAL (j - 1);
nextCrc =(nextCrc &~(1ULL <<j))|((((CRC64 >>(j - 1))& 1)<< j);
}//结束大小写;
}//结束循环;
CRC64 = nextCrc;
}//结束循环
返回 CRC64;
}
我已经验证了 pCrcTable 的内容。
CrcLinkerGenerated = 0x7F1C5537E7A6B66C
CrcSoftwareGenerated = 0x7FC9F101E774C99A
你有什么建议吗?
Ken
好的、问题已解决...
我首次尝试使用软件 CRC 校验来验证由链接器生成的 CRC。 我的目的是最终使用 CPU 生成的 CRC。 我继续执行 CPU 生成的 CRC 和 LOW、看到它匹配! 我从 TI 文档中逐字复制的软件 CRC 生成函数有故障。
由于我无法找到 CPU 生成的 CRC 的全面描述、我自己解决了。 以下是分步说明:
1.创建由链接器生成的 CRC:
1.1.在 sys_link.cmd 中、MEMORY{}为 CRC 结构创建一个存储器区域:
FLASHCRC(RW):origin=0x00008020 length=0x00000020
在本例中、我将其放置在先前分配给 FLASH0的地址、然后移动
FLASH0的起始地址为32 (0x20):
FLASH0 (RX):origin=0x00008040 length=0x00057FC0
1.2.在 sys_link.cmd 中、SECTIONS{}生成 CRC 结构并执行以下计算:
.section_TO_BE_VERIFIC验证:{*(.text)}> FLASH0、palign = 8、fill=0xffffffff、crc_table (link_crc_table_name、算法= TMS570_CRC64_ISO)
.TI.crctab:> FLASHCRC palign = 8
2.在我的运行时代码中:
extern crc_table link_crc_table_name;
crc_table * pCrcTable =&link_crc_table_name;
uint64 crcLinkerGenerated = pCrcTable->recs[0].crc_value;
uint64 crcFullCpuGenerated = 0;
crcModConfig_t CrcModConfig;
CrcModConfig.mode = CRC_FULL_CPU;
CrcModConfig.CRC_CHANNEL = 0;
CrcModConfig.data_length = pCrcTable->recs[0].size/sizeof (uint64);
CrcModConfig.src_data_pat =(uint64 *) pCrcTable->recs[0].addr;
crcInit();
crcChannelReset (crcREG、0);
CrcSignGen (crcREG、&CrcModConfig);
crcFullCpuGenerated = crcGetPSASig (crcREG、0);
if (crcLinkerGenerated!= crcFullCpuGenerated)
{
//在此处执行错误处理!
}
我希望此分步指南能帮助其他人...
最棒的...
Ken