大家好!初来乍到,请大家多多指教!我使用6678时遇到一个问题。
我用的软件环境是CCS5.3,板子是6678开发板,想利用6678的硬件内存保护机制,保护我们的代码。
对于共享外存(地址空间0x0c000000~0x0c400000),我想达到每个核只能访问分配给本核的空间的目的,希望当发生共享内存访问越界时,进入相应的中断服务程序。对于0核来说,XMC的XMUL共设置了0~9组,其他的是默认配置。XMC的XMUXL9和XMUXH9,0核能够读写0x0c000000~0x0c07ffff空间,设置XMUXL8和XMUXH8,对于0x0c000000~0x0c400000空间,不可读写,挂接mux内存访问错误事件是MDMAERREVT到12号中断上。因为MUX编号大的,优先映射,所以当0核读写0x0c000000~0x0c07ffff是可访问的,不会触发异常;当写地址0x0c080000,就应该触发MDMAERREVT事件。调试下我看到核0往0x0c080000地址写数据时,XMC错误地址寄存器0x08000200记录了错误访问地址0x0c080000,错误状态寄存器0x08000204记录了错误操作是本核写访问,但是不进MDMAERREVT中断服务程序,代码继续往后执行时,才进,中断服务程序中中读取错误地址寄存器和错误状态寄存器,然后通过写清除寄存器清除这两个寄存器的值。发现当代码中再有越界写时,错误能够被记录,但不再进中断服务程序了,为什么?而越界读时,进入L1D CPU访问错误中断服务程序中,L1D中记录的错误状态符合错误的实际情况,就是进入中断的时间有所延迟?
user6248753:
最后不是问号,是句号。
user6248753:
最后是句号,不是问号。L1D和L1P是默认配置,是cache。
Nancy Wang:
user6248753
调试下我看到核0往0x0c080000地址写数据时,XMC错误地址寄存器0x08000200记录了错误访问地址0x0c080000,错误状态寄存器0x08000204记录了错误操作是本核写访问,但是不进MDMAERREVT中断服务程序,代码继续往后执行时,才进,中断服务程序中中读取错误地址寄存器和错误状态寄存器,然后通过写清除寄存器清除这两个寄存器的值。发现当代码中再有越界写时,错误能够被记录,但不再进中断服务程序了,为什么?
从以上的描述来看像是中断无法被再次识别,建议参考以下链接看一下中断相关寄存器的状态进一步分析。
重点看一下1.3.6 Interrupt Service Sequence 部分。
https://www.ti.com/cn/lit/ug/sprugw4a/sprugw4a.pdf
user6248753:
回复 Nancy Wang:
你好。非常感谢你的回答。后来我看corePac的手册,发现L2控制寄存器中有一个MDMAERR寄存器,在MDMAERREVT中断服务程序中通过写MDMAERRCLR寄存器清除MDMAERR寄存器的值,MDMAERREVT中断就会被再次识别了。但我现在还有四个问题,
1 错误权限读共享外存时,为什么会进L1Dcpu访问错误中断?
2. 6678的L1D cache功能是不是无法关闭,我通过将L1DCFG设置为0关闭的L1Dcache,能看到L1DCFG寄存器确实被写成0了,说明L1D cache应该被禁止了,可共享外存读越界时,为什么还是会进L1D cpu访问错误中断,而且进过L1D cpu访问错误中断后还会再进一次MDMAERREVT错误中断,但0x08000200显示错误地址为0,MDMAERR寄存器显示是读访问出错。
3. L1Dcpu中报的错误地址准确,但MDMAERREVT错误中,错误地址就寄存器0x08000200中记录的值好像是0x20对齐的,比如错误访问地址是0x0c080130,0x08000200显示错误地址为0x0c080120,错误访问地址是0x0c080150,0x08000200显示错误地址为0x0c080140,这与L1D 的cache line长度有关吗?如果是的话,L1D的cache line长度是0x40,应该按照0x40对齐才对啊
4.L2写越界访问(权限错误)时,为什么不进挂接的L2 CPUMPA事件中,也不进L1D cpuMPA事件,读访问越界时,会进L1D cpuMPA事件,有L1D cache情况下,就是这样的吗?
Nancy Wang:
回复 user6248753:
L1D cache功能可以关闭,请问L1Dcpu访问错误中断具体是指什么?
user6248753:
回复 Nancy Wang:
Nancy Wang,你好!
1. 我说的L1D cpu访问错误中断指的是DMC_CMPA错误事件。关于L1D的内存保护错误事件不是有两个嘛,一个是DMC_CMPA,一个是DMC_DMPA,第一个指的是dsp核访问L1D时导致的错误,第二个是通过DMA访问L1D时导致的错误,我这里说的L1D CPU访问错误指的是第一个。现在我遇到的情况是,在共享外存不允许读写的情况下,读访问共享外存会进到L1D内存保护错误事件DMC_CMPA,不过L1D的MPFAR中记录的错误地址还是共享外存的地址,而且是准确的。即使在L1Dcache关闭的情况下(关闭L1D cache的方式是写L1DCFG寄存器为0,就是把L1D的size设置为0,我看corepac手册上写置0就是disable),也会进L1D的DMC_CMPA事件,所以我认为L1D cache还是没关掉。L1D cache关没关掉要怎么证明呢?
2.另一个问题是,共享外存不允许读写的情况下,写共享外存,0x08000200(XMPFAR)记录的错误地址为何是按照0x20对齐的?比如访问的地址是0x0c00023c,XMPFAR中记录的是0x0c000220,这会与什么有关系?cache line?共享外存bank大小?
感谢!