主题中讨论的其他部件:C2000WARE、 AFE031、 CCStudio、SFRA
你(们)好
我将针对具有 TMS320F28002x MCU 的应用应用应用 UL60730。 但是、我找不到 MCU 系列的任何库。 请建议如何获取库和文档。
BR
HK Woo
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.
你(们)好
我将针对具有 TMS320F28002x MCU 的应用应用应用 UL60730。 但是、我找不到 MCU 系列的任何库。 请建议如何获取库和文档。
BR
HK Woo
如果您尚未看到器件安全手册 、请访问此处:https://www.ti.com/lit/pdf/spruit5
C2000Ware 中有一个用于 F28002x 的诊断库。 在 libraries/diagnostic/f28002x 下查找它。
惠特尼
我按照您的信息下载文档"安全手册"并进行检查。 这似乎是一个仅介绍 MCU 功能的文档。 它不会向我们展示如何实施自检。
我下载 C2000Ware/libraries/diagnostic/f28002x/docs 下的"DIAG_Lib_TMS320F28002x_Users_Guide"并导入一个示例"SDL_Ex_ram_parity_test"。
TI 是否有文档来解释该示例? 这是因为我找不到函数说明、例如 MemCfg_setTestMode...
BR
HK Woo
安全手册对不同的诊断和机制进行了很好的总结、但在技术参考手册中查找这些信息仍然很有帮助、以了解更多详细信息。
诊断库有用户指南、尽管它是从工程中主.c 文件顶部的注释生成的、因此您可以直接读取这些注释。 示例中调用的大多数函数(如 MemCfg_setTestMode)来自 Driverlib。 您可以在此处或 C2000Ware 中的 device_support/f28002x/docs/html/index.html 下找到 Driverlib API 参考指南。
惠特尼
您好、Whitney
我正在占用@ 2个区域。 IEC60730要求中的 RAM 和闪存测试。
我正在使用 TI PLC IC AEF031及其由 TI 提供的编译库 FSK_corr_detect_lib_eabi.lib。
RAM 测试。
根据 IEC60730、有必要执行与库相关的 RAM DC 故障。 但是、我不知道库使用的变量的实际地址。
如果我们要查看库的源代码。 我们自己修改代码的风险太大。
闪存测试。
1.找不到任何文档/示例代码来读取闪存内容以进行校验和检查
2.如何将闪存的一小部分保留为 EEPORM
3.如果闪存在固件刻录过程中模拟 EEPORM、如何将校验和值刻录到项目2。 例如、 将校验和数据存储到.out 或.hex、这样就无需编写通信函数即可将校验和发送到 MCU、然后将其写入仿真 EEPORM。
BR
HK Woo
您好、Whitney
我从安全机构那里获得了信息。 IEC60730应用的一些要求、需要按 如下所示检查寄存器
1、ACC、P、XT、XAR3-XAR7、PC、 RPC、ST0、ST1、DP、SP、 IER、IFR、DBGIER。 如果是55H、测试算法可以写入55H、而如果是55H、可以读出;如果是 AAH、可以写入 AAH 和读出
2.需要检查所有 RAM 是否存在直流故障
对于项目1、我找到了演示代码 f28002x_test_application。 似乎一个 API 调用 STL_CPU_REG_checkCPURegisters ()将检查所有这些 CPU 寄存器。
我有一个问题、如下所示
A. API 是否会影响更多程序流。 这是因为有一个运行@ 300KHz 的 ISR 来对来自 TI PLC 芯片 AFE031的 PLC 信号进行采样。
B. API 的总执行时间是多少? 这样做的原因是为了防止由于演示代码 sta_tests.c 中的项目 a 而导致的溢出
Dint;
#if STA_UTIL_profile
STA_Util_startProfiler (CPUTIME1_BASE);
#endif
uint16_t returnVal =
STL_CPU_REG_checkCPURegisters (STA_Tests _注入错误);
#if STA_UTIL_profile
uint32_t cycleCount = STA_Util_stopProfiler (CPUTIME1_base);
STA_Tests_cycleCounts[STA_CPU_REG]= cycleCount;
来自 CCStudio 表达式窗口的 STA_Tests 和 cycleCounts[STA_CPU_REG]为686。 它意味着它需要6.86us
此外、如果我删除上述红色代码、则会出现任何问题。 它似乎仅用于确定执行时间、对吗?
c.能否向我解释 API 的输入参数为何是 bool True 或 False。 我不理解文档"DIAG_Lib_TMS320F28002x"中的解释
对于第2项、我正在研究演示代码 SDL_Ex_ram_ecc_parit_test、它是否正确?
您是否能够请求访问 FSK_corr_detect_lib_eabi.lib 源代码?
对于 RAM 测试、SRAM 在硬件复位时已经启用 ECC 或奇偶校验(安全手册中的 SRAM1和 SRAM2)。 SDL_ex_ram_ecc_parity 测试演示了如何执行 ECC/奇偶校验功能(SRAM13/SRAM14)的软件测试。 要对 SRAM 执行更主动的测试、您可以查看库中的 STL_March 模块、该模块会经过给定的存储器范围并将模式写入 RAM 以检查是否存在卡住的位。
闪存与之类似、它具有可执行诊断测试的硬件 ECC (SDL_ex_flash_ecc_test 示例)。 对于执行 CRC 校验、您可以使用库中的 STL_CRC 函数。 f28002x_test_application 通过检查 OTP 的一小部分来演示如何使用这些函数、但您可以在其他存储器上使用它们。 这里有一个文档、介绍了如何让链接器为您生成 CRC 表:
software-dl.ti.com/.../appnote-perform_crc_check.html
正确的是 STL_CPU_REG 可以检查 CPU 寄存器。 该参数用于将错误注入测试、使其在目的上失败、以便您可以测试您的应用是否对错误做出了正确的反应。
您对分析功能的理解是正确的。 它返回的值以时钟周期为单位、因此假设 SYSCLK 为100MHz、6.68us 是正确的。 您不必在代码中保留分析函数。 它们只是为了方便对功能进行一些基准测试。
惠特尼
您好、Whitney
对于 API STL_CPU_REG_checkCPURegisters ()、我仍然不理解。 如果我想检查 CPU 寄存器、它是否正常。 应使用什么参数"设置"或"错误"? 这是我的理解、如下所示
情况1.
X = STL_CPU_REG_checkCPURegisters (false);
如果寄存器没有问题、X 应该为 CPU_REG_PASS、否则为 RESUE_REG_FAIL;
情况2.
X = STL_CPU_REG_checkCPURegisters (真);
如果寄存器没有问题,X 应该是 CPU_REG_FAIL,否则返回 CPU_REG_PASS;
对于自检设置、必须具有以下代码
EALLOW;
HWREGH (NMI_BASE + NMI_O_FLGCLR)= 0xFFFF;
HWREGH (NMI_BASE + NMI_O_CFG)|= NMI_CFG_NMIE;
EDIS;
我有疑问、是否有必要将其重新配置为正常模式、或者仅保留一段时间、例如
MAIN ()
…
EALLOW;
HWREGH (NMI_BASE + NMI_O_FLGCLR)= 0xFFFF;
HWREGH (NMI_BASE + NMI_O_CFG)|= NMI_CFG_NMIE;
EDIS;
for (;;)
{
…
我的应用程序代码;
…
if (需要执行 CPU 寄存器测试)
{
Dint;
/*或在此处将上面的代码置于红色位置????????? *
X = STL_CPU_REG_checkCPURegisters (真);
如果(x = CPU_REG_FAIL)
{
我的代码;
}
/*我们是否需要将 NMI_BASE 重新配置为其他模式,在此处显示我的应用程序以正常操作运行,如果需要,代码是什么。*/
EINT;
}
ISR (Vode)
{
我的代码;
}
-.对于 RAM/Flash 检查、我仍在检查代码。
-.for FSK_corr_detect_lib_eabi.lib。 我通过 TI 网站收到了消息来源。 我不知道 TI 是否向我发送了正确的版本。 这是因为 TI 在网站中发布库不是 EABI 格式。
BR
HK Woo
对于正常运行、您将错误注入参数保留为 false (情况1)。 注入错误的选项仅供您测试系统在检测到错误时如何处理。
您不需要对 NMI 执行任何操作即可运行 STL_CPU_REG 测试。 即使检测到故障、STL_CPU_REG 测试也不会生成 NMI。 您可能根本不需要该行来写入应用程序中的 NMIE。 独立运行时、引导 ROM 启用 NMI、并且在调试模式下运行时、GEL 文件会执行该操作、假设您使用的是 CCS 默认值。
我将研究是否对 FSK_corr_detect_lib_eabi.lib 源代码进行了任何代码更改、以允许为 EABI 构建该源代码。
惠特尼
您好、Whitney
感谢您的信息。 我在 CPU 寄存器上完成了一个代码。 我将启动一个 RAM 代码。 根据安全机构的说法、需要检查 RAM 的整个部分。 我无法从 RAM 的起始地址和结束地址中获取。 请帮帮我。
我想使用 STL_March 测试 RAMCopy 和 STL_March 检查错误状态来解决 RAM DC DC 故障
下面是我对编码的看法
Dint;
STL_March testRAMCopy (STL_March pattern_1、 0x0000、7、 0xFFFFFFF);
EINT;
uint16 returnVal STL_March _checkErrorStatus ();
if (returnVal!= STL_March _pass) ErrorFound
它是正确的、您能解释什么是 STL_March pattern_one、STL_March pattern_tw....
非常感谢
数据表中有一个表格、显示了所有不同 RAM 的地址和大小。 在最新版本的数据表中、它位于第8.3.1节: https://www.ti.com/lit/pdf/sprsp45
这些功能将起作用。 如果您能够在调用_c_int00在 RAM 中初始化变量之前运行测试、则可以使用 STL_March testRAM、因为它不会保存和恢复到存储器、因此可以更快地运行测试。 我已经看到其他客户在这种方法上取得了成功、但是如果执行时间不是问题、或者您计划一次在小部分中定期运行测试、那么您所拥有的一切都是可以的。
这里有一个文档、它对模式的用途进行了更详细的解释: https://www.ti.com/lit/pdf/spracb9
如果可以提高诊断覆盖率、建议循环执行、但严格意义上没有必要。
惠特尼
您好、Whitney
我查看了项目 f28002x_test_application sta_tests.c 中的代码
案例 STA_March 复制:
{
uint32_t originalValue;
uint16_t 索引;
//
//填充 STA_User_marchTestData 以使复制更容易
//观察。
//
for (索引= 0;索引< STA_USER_March _DATA_SIZE;index++)
{
STA_User_marchTestData[index]=索引;
}
//
//清除 RAM 错误状态标志。
//
MemCfg_clearUncorrErrorStatus (MEMCFG_UCERR_CPUREAD |
MEMCFG_UCERR_DMAREAD);
MemCfg_clearCORErrorStatus (MEMCFG_CERR_CPUEAD);
//
//初始化 stl_March 的注入错误句柄。
//
STA_User_initMarch ();
//
//在内存中注入错误。
//
if (STA_Tests _注入错误)
{
//
//在 M0中导致单一位错误(ECC、可纠正)
//
originalValue = HWREG (STA_User_marchErrorObj.address);
STA_User_marchErrorObj.TESTMODE = MEMCFG_TEST_WRITE_DATA;
STA_User_marchErrorObj.xorMask = 0x00000001U;
STL_March 注入错误(STA_User_marchErrorHandle);
}
#if STA_UTIL_profile
STA_Util_startProfiler (CPUTIME1_BASE);
#endif
STL_March testRAMCopy (STL_March pattern_1、
(uint32_t) STA_User_marchTestData、
(STA_USER_March 数据_SIZE / 2U)- 1U、
(uint32_t) STA_User_marchTestDataCopy);
#if STA_UTIL_profile
uint32_t cycleCount = STA_Util_stopProfiler (CPUTIME1_base);
STA_Tests_cycleCounts[STA_March _copy]= cycleCount;
#endif
有一条指令 STA_User_initMarch ()、我不知道是否需要使用它。 在指令 STL_March 测试 RAMCopy (STL_March pattern_1、
(uint32_t) STA_User_marchTestData、
(STA_USER_March 数据_SIZE / 2U)- 1U、
(uint32_t) STA_User_marchTestDataCopy);
为什么起始地址和复制地址是带有数组索引的变量的名称? 它应该是 RAM 的地址、例如0x0000、与此类似。
实际上、正如您所说的、我将在小部分中检查整个 RAM。
我的代码喜欢并以 M0为例
uint32 strat_address = 0x000000;
MAIN ()
{
IF (ramCheck)
{
Dint;
STL_March testRAMCopy (STL_March pattern_one、 start_address、7、 0xFFFFF);// 7被表示需要检查8个 RAM 地址
uint16 returnVal STL_March _checkErrorStatus ();
if (returnVal!= STL_March _pass) ErrorFound;
start_address = start_address + 8;
如果(START_ADDRESS = 0x3FF) START_ADDRESS = 0x0000;
ramCheck = false;
}
我的主循环程序代码....
}
定时器_ISR ()
{
ramCheck = true;
}
此外、我计划为复制地址保留 RAM 、该复制地址用作 STL_March testRAMCopy 的临时存储。 如何在链接文件或任何其他方法中执行此操作?
实际上、该代码用于检查整个 RAM 部分。 它是正确的代码吗?
在 https://www.ti.com/lit/pdf/sprsp45文档 的第8.3.1节中、我仍然有疑问
以 M0为例、从0x000到0x3FF、1K x 16。 16的含义。 它是16位。 如果我的代码 STL_March testRAMCopy (STL_March _pattern_one、 0x0000、7、 0xFFFFF);是指 API 将检查地址从0x0000到0x0007的总长度8。
如果我的某些程序在 RAM 中运行、是否存在运行 RAM 测试的问题。
此外、请在下面的链接文件中找到使用 TMS320F280025的项目。 地址似乎与第8.3.1节中提到的文档不同
存储器
{
开始 :origin = 0x080000,length = 0x000002
BOOT_RSVD :origin = 0x00000002,length = 0x00000126
RAMM0 :origin = 0x00000128,length = 0x000002D8
RAMM1 :origin = 0x00000400,length = 0x000003F8 //片上 RAM 块 M1 *
// RAMM1_RSVD :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/
/* RAMLS4 :origin = 0x0000A000,length = 0x00000800
RAMLS5 :origin = 0x0000A800,length = 0x00000800
RAMLS6 :origin = 0x0000B000、length = 0x00000800
RAMLS7 :origin = 0x0000B800,length = 0x00000800*/
/*合并所有 LS RAM */
RAMLS4567 :origin = 0x0000A000,length = 0x00002000
RAMGS0 :origin = 0x0000C000,length = 0x000007F8
// RAMGS0_RSVD :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/
// FLASHBANK1 :origin = 0x00080000,length = 0x0000FFF0
// flash_bank1_RSVD:origin = 0x0008FFF0,length = 0x00000010 //保留并不用于根据勘误咨询“Memory:pretching Beyond valid Memory”(内存:有效内存之外的预取)*/的代码
BootROM :origin = 0x003F0000,length = 0x00008000
BootROM_EXT :origin = 0x003F8000,length = 0x00007FC0
复位 :origin = 0x003FFFC0,length = 0x00000002
/*闪存扇区*/
/*组0 */
FLASH_BANK0_SEC0 :origin = 0x080002、length = 0x000FFE //片上闪存*
FLASH_BANK0_SEC1 :origin = 0x081000、length = 0x001000 //片上闪存*
FLASH_BANK0_sec2 :origin = 0x082000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC3 :origin = 0x083000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC4 :origin = 0x084000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC5 :origin = 0x085000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC6 :origin = 0x086000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC7 :origin = 0x087000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC8_9_10 :origin = 0x088000、length = 0x003000 //片上闪存*
//FLASH_BANK0_SEC8 :origin = 0x088000、length = 0x001000 //片上闪存*
//flash_BANK0_SEC9 :origin = 0x089000,length = 0x001000 //片上闪存*
//FLASH_BANK0_SEC8_9:origin = 0x088000、length = 0x002000 //片上闪存*
//flash_BANK0_SEC10:origin = 0x08A000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x000FF0 //片上闪存*
// flash_BANK0_SEC15_RSVD :origin = 0x08FFF0,length = 0x000010 //根据勘误咨询“Memory: prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留代码且不用于代码*/
}
部分
{
codestart :>开始,align (8)
.text :>> flash_BANK0_sec2 | flash_BANK0_SEC3 | flash_BANK0_SEC4 | flash_BANK0_SEC5、 align (8)
.cinit :> flash_BANK0_SEC1, align (8)
.switch :> FLASH_BANK0_SEC1, ALIGN (8)
.reset :> reset, type = DSECT /* not used,*/
.stack :> RAMM1
init_array :> flash_BANK0_SEC1, align (8)
.bss :> RAMLS4567
.bss:输出 :> RAMLS4567
.bss:CIO :>RAMGS0
.const :> FLASH_BANK0_SEC1、 ALIGN (8)
.data :> RAMLS4567
.sysmem :> RAMLS4567
RAMS0:> RAMGS0
/* 分配 IQ 数学区域:*/
IQMath :> RAMLS4567
IQmathTables :> RAMLS4567
FSK_corr_lib_data:> RAMLS4567
组
{
.TI.ramfunc
{
l sfra_F32_TMU_eabi.lib
}
ramfuncs
}LOAD = FLASH_BANK0_SEC6、
运行= RAMLS4567、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(4)
/*
.TI.ramfunc :load = flash_BANK0_SEC1,
运行= RAMGS0、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(8)
*
SFRA_F32_Data :> RAMLS4567,ALIGN = 64
FPUmathTables :> FLASH_BANK0_SEC11
//.scratchpad :> RAMLS4567
//controlVariables:> RAMLS4567
组
{
isrcodefuncs
Dclfuncs
} LOAD = FLASH_BANK0_SEC8_9_10、
运行= RAMLS4567、
load_start (isrcodefuncsLoadStart)、
load_size (isrcodestfuncsLoadSize)、
load_end (isrcodefuncsLoadEnd)、
run_start (isrcodefuncsRunStart)、
run_size (isrcodefuncsRunSize)、
run_end (isrcodefuncsRunEnd)、
对齐(4)
}
BR
HK Woo
hk
尊敬的 洪启宇
该领域的领域专家目前不在办公室,将于7月21日返回。 您的详细回答将延迟。
关于您的以下问题:
[引用 userid="46959" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1013041/tms320f280025-tms320f28002x-ul60730-self-test-library/3758478 #3758478"]有一条指令 STA_User_initMarch ()、我不知道是否需要使用它。 在指令 STL_March 测试 RAMCopy (STL_March pattern_1、
(uint32_t) STA_User_marchTestData、
(STA_USER_March 数据_SIZE / 2U)- 1U、
(uint32_t) STA_User_marchTestDataCopy);
为什么起始地址和复制地址是带有数组索引的变量的名称? 它应该是 RAM 的地址、例如0x0000、与此类似。
[/报价]STL_March testRAMCopy 在 C28x 汇编语言中实现。 请 查看文件 stl_March s.asm 来查看所有相关详细信息。 简而言之、 STA_User_marchTestData 和 STA_User_marchTestDataCopy 是各具有16个元素的数组。
关于以下问题、
[引用 userid="46959" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1013041/tms320f280025-tms320f28002x-ul60730-self-test-library/3758478 #3758478]m0为例,从0x000到0x3FF 为1K x 16。 16的含义。 它是16位。 如果我的代码 STL_March testRAMCopy (STL_March _pattern_one、 0x0000、7、 0xFFFFF);这是否意味着 API 将检查0x0000到0x0007的地址、总长度为8。是的、1Kx16中的16意味着16位。 1K 块中的每个位置为16位宽。 请按照您喜欢的方式配置 C2000Ware 中提供的示例、并使用调试器逐步完成操作、以了解 API 执行的操作。
谢谢、
Krishna
您好、Whitney
我与安全机构进行了讨论。 目前、在我分享 TI 文档后、他们不接受使用 TI 诊断库来实现 IEC60730。 原因如下
TI 文档中没有显示 API 执行 RAM 测试如何符合 IEC60730的 sudo 代码。 这是该标准非常重要的要求。
2.如果我们不知道机制,如何测试演示。
我为 RAM 测试编写了自己的代码、如下所示
void IEC_RamTesting (void)//代码中使用的大多数变量都是全局专用变量
{
uint32_t x = 0;
Dint;
//ram_address_pr =(volatile uint32_t *) start_address;
对于(x = 0;x < 597;x++)
{
Dummy1++;
RAM_tempCopy =* ram_address_pr;//起始地址为0x00128,它基于链接命令文件
//ram_tempNextCopy = * ram_address Next_pr;
对于(pattern_index = 0;pattern_index < 12;pattern_index++)
{
/*
* uint32_t pattern_array[12]={pattern_00000000、pattern_555555、pattern_333333、pattern_0F0F0F0F0F0F0F、
pattern_00FF00FF、pattern_0000FFFF、pattern_FFFF0000、pattern_FF00FF00、
pattern_F0F0F0、pattern_CCCCCC、pattern_AAAAAAAA、pattern_FFFFFFFF};
*
* ram_address_pr = pattern_array[ pattern_index];
if (* ram_address_pr!= pattern_array[pattern_index])
{
mcuFault_Status = mcuFault_Status | 0x02;
}
}
* ram_address_pr = ram_tempCopy;
RAM_ADDRESS_pr++;
如果(ram_address_pr =(uint32_t *) 0x000007FA)//指针必须为偶数,因为指针增加2
{
RAM_ADDRESS_pr =(uint32_t *) 0x0000A000;
//ram_address Next_pr =(uint32_t *) 0x0000A000;
}
if (ram_address_pr =(uint32_t *) 0x0000C7D4)
{
RAM_ADDRESS_pr =(uint32_t *) 0x00000128;
Dummy1 = 0;
X = 1000;
}
}
EINT;
}
上述机制基于建议执行 RAM 测试的安全机构。 它基本上可以工作、但我发现了一个问题、这对我来说非常有力。
基于我的链接文件的存储器部分
存储器
{
开始 :origin = 0x080000,length = 0x000002
BOOT_RSVD :origin = 0x00000002,length = 0x00000126
RAMM0 :origin = 0x00000128,length = 0x000002D8
RAMM1 :origin = 0x00000400,length = 0x000003F8 //片上 RAM 块 M1 *
// RAMM1_RSVD :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/
/* RAMLS4 :origin = 0x0000A000,length = 0x00000800
RAMLS5 :origin = 0x0000A800,length = 0x00000800
RAMLS6 :origin = 0x0000B000、length = 0x00000800
RAMLS7 :origin = 0x0000B800,length = 0x00000800*/
/*合并所有 LS RAM */
RAMLS4567 :origin = 0x0000A000,length = 0x00002000
//RAMGS0 :origin = 0x0000C000,length = 0x000007F8
RAMGS0 :origin = 0x0000C000,length = 0x000007D4
RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024
// RAMGS0_RSVD :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/
// FLASHBANK1 :origin = 0x00080000,length = 0x0000FFF0
// flash_bank1_RSVD:origin = 0x0008FFF0,length = 0x00000010 //保留并不用于根据勘误咨询“Memory:pretching Beyond valid Memory”(内存:有效内存之外的预取)*/的代码
BootROM :origin = 0x003F0000,length = 0x00008000
BootROM_EXT :origin = 0x003F8000,length = 0x00007FC0
复位 :origin = 0x003FFFC0,length = 0x00000002
/*闪存扇区*/
/*组0 */
FLASH_BANK0_SEC0 :origin = 0x080002、length = 0x000FFE //片上闪存*
FLASH_BANK0_SEC1 :origin = 0x081000、length = 0x001000 //片上闪存*
FLASH_BANK0_sec2 :origin = 0x082000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC3 :origin = 0x083000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC4 :origin = 0x084000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC5 :origin = 0x085000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC6 :origin = 0x086000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC7 :origin = 0x087000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC8_9_10 :origin = 0x088000、length = 0x003000 //片上闪存*
//FLASH_BANK0_SEC8 :origin = 0x088000、length = 0x001000 //片上闪存*
//flash_BANK0_SEC9 :origin = 0x089000,length = 0x001000 //片上闪存*
//FLASH_BANK0_SEC8_9:origin = 0x088000、length = 0x002000 //片上闪存*
//flash_BANK0_SEC10:origin = 0x08A000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC11:origin = 0x08B000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC12:origin = 0x08C000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC13:origin = 0x08D000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC14:origin = 0x08E000、length = 0x001000 //片上闪存*
FLASH_BANK0_SEC15:origin = 0x08F000、length = 0x000FF0 //片上闪存*
// flash_BANK0_SEC15_RSVD :origin = 0x08FFF0,length = 0x000010 //根据勘误咨询“Memory: prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留代码且不用于代码*/
}
RAM 的总数为5970、结束地址为0x0000C7D2。 在我的代码中、如果它运行10次、然后它完成5970 RAM 位置检查、并在红色代码中将指针重置为0x000128。 发现 ram_address_pr 的内容为0x00C7D2、但它仍然进入循环、执行次数为11次。
我不知道为什么。 这是因为、如果指针的内容是0x00C7D2、而不是0x00C7D4。 程序不应进入循环。
是否有提示或评论?
BR
HK Woo
惠特尼
很抱歉耽误你的回答。 请查找屏幕截图供您参考
ram_address_pr 的内容为0xC702、但我的检查是" if (ram_address_pr =(uint32_t *) 0x0000C7D4)"。 进入 IF 循环的原因
请参阅以下反汇编内容。 注:断点是@ dummy1 = 0;基于汇编代码。 比较值为0xC7D4、"ram_address_pr"的内容为0xC7D2。
083537: 6003 SB $C$L81、NEQ
793 ram_address_pr =(uint32_t *) 0x0000A000;
083538: 8F40A000 MOVL XAR5、#0x00a000
797 if (ram_address_pr =(uint32_t *) 0x0000C7D4)
$C$L81:
08353a: 8F00C7D4 MOVL XAR4、#0x00c7d4
796 dummy4 = ram_address_pr;
08353c: A0AB MOVL @P、XAR5
797 if (ram_address_pr =(uint32_t *) 0x0000C7D4)
08353d: A8A9 MOVL @ACC、XAR4
08353E: 0FAB Cmpl ACC、@P
08353f: 600C SB $C$L82、NEQ
800 dummy2 = 1000;
083540: 8F0003E8 MOVL XAR4、#0x0003e8
083542: 761F028C MOVW DP、#0x28c
799 dummy1 = 0;
083544: 0200 MOVB ACC、#0
801 ram_address_pr =(uint32_t *) 0x00000128;
083545: 8F400128 MOVL XAR5、#0x000128
083547: A83C MOVL @0x3c、XAR4
083548: 761F028D MOVW DP、#0x28d
799 dummy1 = 0;
08354a: 1E0E MOVL @0xe、ACC
768 表示(dummy2 = 0;dummy2 < 597;dummy2++)
$C$L82:
08354b: 0201 MOVB ACC、#1
08354c: 761F028C MOVW DP、#0x28c
08354e: 073C 附加 ACC、@0x3c
08354f: 1EA7 MOVL @XAR7、ACC
083550: 8F000255 MOVL XAR4、#0x000255
083552: 1E3C MOVL @0x3c、ACC
083553: A8A9 MOVL @ACC、XAR4
083554: 0FA7 cmpl ACC、@XAR7
083555: 66C1 SB $C$L79、HI
083556: A93E MOVL @0x3E、P
083557: 761F031F MOVW DP、#0x31f
083559: A016 MOVL @0x16、XAR5
08355a: 2910 CLRC INTM
08355b: FF69 SPM #0
08355c: 0006 LRETR
FSK_corr_Detecter_run ():
08355d: E20304BD MOV32 * SP++,R4H
08355f: E20305BD MOV32 * SP++,R5H
083561: E20306BD MOV32 * SP++,R6H
083563: E20307BD MOV32 * SP++,R7H
083565: 761F02AC MOVW DP、#0x2ac
083567: 0622 MOVL ACC、@0x22
083568: 071E 附加 ACC、@0x1E
083569: 18A87FFF 和 @AH、#0x7fff
08356b: 1E22 MOVL @0x22、ACC
08356c: 0624 MOVL ACC、@0x24
正如我提到的、根据我的计算、ROM 的总块数为5970。 我使用2个变量 dummy1和 dummy3来监视5970个块的 RAM 已检查和已执行函数的总数块的值。 假设 dummy1和 dummy 3分别为5970和10。 但是、它是5971和11。 我找不到这个问题。
请查看以下链接文件中的存储器部分
存储器
{
开始 :origin = 0x080000,length = 0x000002
BOOT_RSVD :origin = 0x00000002,length = 0x00000126
RAMM0 :origin = 0x00000128,length = 0x000002D8
RAMM1 :origin = 0x00000400,length = 0x000003F8 //片上 RAM 块 M1 *
// RAMM1_RSVD :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/
/* RAMLS4 :origin = 0x0000A000,length = 0x00000800
RAMLS5 :origin = 0x0000A800,length = 0x00000800
RAMLS6 :origin = 0x0000B000、length = 0x00000800
RAMLS7 :origin = 0x0000B800,length = 0x00000800*/
/*合并所有 LS RAM */
RAMLS4567 :origin = 0x0000A000,length = 0x00002000
//RAMGS0 :origin = 0x0000C000,length = 0x000007F8
RAMGS0 :origin = 0x0000C000,length = 0x000007D4
RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024
其中 RAMGS0_TEMPSCOPY 保留供我自己使用。 它不会进行检查。
您是否在编译器中启用了优化?
那么、所讨论的比较似乎是"cmpl acc、@P"、对吧? 如果您单步执行代码、而不是查看"Expressions"窗口、请查看 XAR4、XAR5、ACC 和 P (在"CCS Registers"视图中的"Core Registers"下)、这些值是否看起来正常? 在 Dissassembly 中、我无法看到 XAR5之前的更新位置、但我想知道它是否与 ram_address_pr 的表达式窗口显示的内容不同。
惠特尼
您好、Whitney
1.是的,通过选项4启用优化,速度与尺寸之间的折衷为5
2.我对装配不是很熟悉,因此不理解你的意思。 抱歉。 您能解释得更多吗?
3.我查看这些寄存器的内容 ACC=0xC7D4、P=0xC7D4、XAR4=0x03E8、XAR5=0xC7D4。 在查看具有优化级别4的寄存器内容期间、我创建一个断点@代码"dummy1 = 0"。
4.我做一些测试。 我将优化级别配置为0。 CCS 表达式视图显示了正确的指针值。
根据#3和#4的结果、我是否可以说问题仅与 CCS 编译器显示问题有关? 对固件的功能没有影响。
此外、我仍然不能确定函数执行次数的问题。
BR
HK Woo
"Expressions"窗口专门查看 ram_address_pr 在 RAM 中的存储位置、因此它不会显示代码已优化了对该 RAM 位置的一些访问、而是使用 XAR5来保存要检查的当前地址。 通过查看内核寄存器和反汇编、我可以知道 XAR5 = ACC = ram_address_pr = 0xC7D4和 P = 0xC7D4、因此检查 P = ACC 是否会导致执行 IF 语句的指令。
直到后面几条指令之后、内存中的实际变量才会更新(与上面所示的0x083559处的指令类似)。 在我看来、代码做得不错、但从表达式窗口的角度来看、高级别的优化会掩盖它。
惠特尼
惠特尼
感谢您的更新。 函数执行的次数。 完成 RAM 部分预计需要5970次。 请在链接查找中找到以下部分的信息
存储器
{
开始 :origin = 0x080000,length = 0x000002
BOOT_RSVD :origin = 0x00000002,length = 0x00000126
RAMM0 :origin = 0x00000128,length = 0x000002D8
RAMM1 :origin = 0x00000400,length = 0x000003F8 //片上 RAM 块 M1 *
// RAMM1_RSVD :origin = 0x000007F8,length = 0x00000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超过有效内存的预取),保留并不用于代码*/
/* RAMLS4 :origin = 0x0000A000,length = 0x00000800
RAMLS5 :origin = 0x0000A800,length = 0x00000800
RAMLS6 :origin = 0x0000B000、length = 0x00000800
RAMLS7 :origin = 0x0000B800,length = 0x00000800*/
/*合并所有 LS RAM */
RAMLS4567 :origin = 0x0000A000,length = 0x00002000
//RAMGS0 :origin = 0x0000C000,length = 0x000007F8
RAMGS0 :origin = 0x0000C000,length = 0x000007D4
RAMGS0_TEMPSCOPY :origin = 0x0000C7D4,length = 0x00000024
// RAMGS0_RSVD :origin = 0x0000C7F8,length = 0x00000008 //保留并不用于根据勘误咨询“内存:预取超出有效内存”的代码*/
查看随附的是否对您有所帮助。 我将其另存为.c 文件、以便在 文本编辑器中突出显示语法、但它显然不是可执行的 C 代码。
e2e.ti.com/.../cpu_5F00_reg_5F00_test_5F00_pseudocode.c
惠特尼
是的、在调试模式下、您肯定可以这样做。 CPU 寄存器位于 CCS Registers 窗口中的"Core Registers"下。 对于任何寄存器、您都可以在测试模式写入寄存器后、但在比较完成之前、在"Registers"窗口中的该寄存器中翻转一个位、然后运行应用程序以确保返回故障。
例如、在下面、我在 MOVL XT、@ACC 之后的第51行上放置一个断点(将存储在 ACC 寄存器中的模式移动到 XT 寄存器中)、并翻转了寄存器窗口中 XT 寄存器中的一个位(将0x55555555更改为0x5555555545)。 然后、当我单步执行它时、我可以看到它将该分支转到 failCPURegTest、其中设置了返回值以指示故障。
惠特尼