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.
你好,亲爱的
作为 SRAM10测试的一部分,我正在执行从 CPU 的非法取款,这是按照 SDL 的“RAM 访问保护违规检测”示例进行的。 将内存 LS6设置为 CLA 的程序内存。 现在 ,调用此函数的 CPU 提取(已放入 LS6中)将导致 CPU 提取访问冲突。
但它将进入 illegalISR()并陷入其中,它仍在 中断中运行。最后,在地址0x3fb02a 处中断,没有可用的调试信息,或者在程序代码之外。
我的问题是:如何打破非法中断并运行正常程序。
#pragma code_section (testCPUFetchFunc,"ramls6");
testCPUFetchFunc( void);
UINT32_t 通气非主 CPU 紫外线()
{
UINT16_t 失败= 0U;
UINT16_t 超时= ISR_LOW_TIMEOUT;
//
//启用违规中断
//
MemCfg_enableViolationInterrupt (MEMCFG_NMVIIOL_CPUFETCH);
//
//内存在 CLA 和 CPU 之间共享。
//
MemCfg_setLSRAMMasterSel (MEMCFG_Sect_LS6,MEMCFG_LSRAMMASTER_CPU_CLA1);
//
//将内存设置为 CLA 的程序内存。 现在是从 CPU 中提取的内容
//将导致非主 CPU 获取违规。
//
MemCfg_setCLAMemType (MEMCFG_Sect_LS6,MEMCFG_CLA_MEEM_PROGRAM);
//
//清除访问冲突状态变量
//
illegalISRFlag =假;
小提琴 ISRFlag =假;
小提琴演奏者=0U;
违规状态= 0U;
//
//调用此函数(已被放置在 LS1中)将导致 CPU
//获取访问权限违规。
//
testCPUFetchFunc();
//
//违规将产生 ITRAP 中断和 RAM 访问
//违规中断。
//
While (((illegalISRFlag != true)||(violationISRFlag != true))&&
(超时!= 0U))
{
超时--;
}
//
//禁用中断。
//
MemCfg_disableViolationInterrupt (MMCFG_NMVO_L_CPUFETCH);
//
//检查中断是否按预期发生,或者循环是否超时。
//
IF (超时=0U)
{
FAIL++;
}
//
//检查违规地址是否为 testCPUFetchFunc()。
//
IF (小提琴问题!=(UINT32_t)&testCPUFetchFunc)
{
FAIL++;
}
//
//确认检测到预期违规类型。
//
IF ((违反状态和 MEMCFG_NMVO_L_CPUFETCH)== 0U)
{
FAIL++;
}
返回(失败);
}
无效 testCPUFetchFunc(无效)
{
NOP;
}
中断无效的非法 ISR(无效)
{
illegalISRFlag =真;
//
//需要删除 LS6RAM 的保护以允许我们返回。
//
MemCfg_setProtection (MEMCFG_Section_LS6,MEMCFG_PROT_ALLOWCPUFETCH);
MemCfg_setCLAMemType (MEMCFG_Sect_LS6,MEMCFG_CLA_MEEM_DATA);
}
柱塞部分[B000,b827]的地图为 ITRAP0。
00b81a:0000 ITRAP0
00b81b:0000 ITRAP0
00b81c:0000 ITRAP0
00b81d:0000 ITRAP0
00b81e:0000 ITRAP0
00b81f:0000 ITRAP0
00b820:0000 ITRAP0
00b821:0000 ITRAP0
00b822:0000 ITRAP0
00b823:0000 ITRAP0
00b824:0000 ITRAP0
00b825:0000 ITRAP0
00b826:0000 ITRAP0
00b827:0000 ITRAP0
在运行 SRAM10测试时,请按照 SDL 示例操作。
在单步运行时 ,地址“0x8803”将在 地址“0x8803”处断开,没有可用的调试信息,或在程序代码之外。
RAMLS1 00008800 00000800 00000003 000007fd RWIX
如何解决这个问题?
您好,
由于美国假期,请预计明天二月二十二日前作出回应。 给您带来不便的真诚道歉。
您好,
主题专家今天已不在办公室,将在几天内返回给您。
你好,Jane,谢谢你的耐心。 使用 code_section (testCPUFetchFunc,"ramls6")将 testCPUFunc"放置在 LS6中时,testCPUFetchFunc 在“拆卸”窗口中显示为0x8800,这一点很奇怪。 您能否在 cmd 文件中检查 ramls6的定义?
惠特尼
另请注意,在 SDL 示例(最初使用 LS1而不是 LS6)中,我们确保将 ramls1 (testCPUFetchFunc)的内容从闪存复制到 RAM,因此不会在那里存储 ITRAP。
ramls6 : > RAMLS6, PAGE = 1 ramgs0 : > RAMGS0, PAGE = 1 ramls1 : LOAD = FLASH_BANK0_SEC3, RUN = RAMLS1, LOAD_START(ramls1LoadStart), LOAD_SIZE(ramls1LoadSize), RUN_START(ramls1RunStart), PAGE = 0, ALIGN(4)
惠特尼
感谢你的帮助
将 ramls1 (testCPUFetchFunc)的内容从闪存复制到 RAM,分解 如下所示。 但它仍没有返回,并将跳到 地址“0xb003”中断,没有可用的调试信息,或者在单 步调试时超出程序代码范围。这种情况如何?
我将我的项目文件(SDL_EX_RAM_ACCESS_PROTED.c, *。CLA,*。cmd)更改为 SDL 示例(SDL_EX_RAM_ACCESS_Protect 项目),文件运行正常。区别 在于*。h 文件?
您是否介意共享.cmd 文件中设置 RamFusaRunStart,RamFusaLoadStart 等...符号的行以及 memcpy 的位置? 您是否在 LS6上启用了任何可能阻止复制的安全措施?
惠特尼