你好,
我在EK-RA6M5开发板上尝试使用Coresight组件中的ITM和ETB做打印,也就是通过ITM产生输出传输到ETB中存储,之后再做读取。但是现在ETB中并没有接收到ITM产生的instrumentation packets,如下图所示,因为在trace停止后ETB中RWP写指针只增加到0x10,并且不是溢出,在RRD中数据0xffffeeee是提前写入的值,没有被覆盖。请看一下配置上是有什么问题或者还可能是什么问题?
目前配置包含三部分:ITM、ATB funnel和ETB,在开启阶段是
1. ITM:(1)设置DEMCR.TRCENA全局使能ITM (2)打开ITM_LAR软件锁 (3)设置ITM_TER使能ITM的stimulus port (4)设置ITM_TCR.ITMENA使能ITM (5)关闭ITM_LAR软件锁
2.ATB funnel:(1)打开LAR软件锁 (2)为slave port 0和1设置Priority寄存器 (3)设置Contro寄存器使能slave port 0和1 (4)关闭LAR软件锁
3.ETB:(1)打开LAR软件锁 (2)关闭Control寄存器 (3)等待FFSR寄存器中Formatter停止 (4)设置FFCR寄存器中ETB模式 (5)重置RRP读指针和RWP写指针 (5)设置Control寄存器使能ETB (6)等待FFSR寄存器中Formatter启动 (7)关闭LAR软件锁
之后会向ITM_STIM寄存器写数据来产生输出,最后关闭ITM和ETB的跟踪,从ETB中读取
1.ITM:(1)打开ITM_LAR软件锁 (2)设置ITM_TCR.ITMENA关闭ITM (3)关闭ITM_LAR软件锁
2.ETB:(1)打开LAR软件锁 (2)关闭Control寄存器 (3)等待FFSR寄存器中Flush停止 (4)重置RRP读指针从头读ETB RAM (5)从RRD寄存器中读取数据 (6)关闭LAR软件锁
具体代码如下:
// configure ATB funnel
CS_UNLOCK(ATB_FUNNEL_LAR);
SET_REG(ATB_FUNNEL_PRIO, 0x00000009UL);
SET_REG(ATB_FUNNEL_CTL, 0x00000E03UL);
CS_LOCK(ATB_FUNNEL_LAR);
uint32_t * DCB_DEMCR = (uint32_t *)(DCB_BASE + 0x00C);
*DCB_DEMCR |= DCB_DEMCR_TRCENA_Msk;
// configure ITM
uint32_t *ITM_LAR = (uint32_t *)(ITM_BASE + 0xFB0);
*ITM_LAR = 0xC5ACCE55;
uint32_t *ITM_TCR = (uint32_t *)(ITM_BASE + 0xE80);
uint32_t *ITM_TER = (uint32_t *)(ITM_BASE + 0xE00);
*ITM_TER = 0xffffffff;
*ITM_TCR |= ITM_TCR_ITMENA_Msk;
*ITM_LAR = 0x0;
// configure ETB
CS_UNLOCK(ETB_LAR);
SET_REG(ETB_CTL, 0);
while (!ETB_FORMATTER_STOPPED) {
}
SET_REG(ETB_FFCR, 0b00);
SET_REG(ETB_RRP, 0);
SET_REG(ETB_RWP, 0);
for(int i=0;i<50;i++){
SET_REG(ETB_RWD, 0xffffeeee);
SET_REG(ETB_CTL, 0b1);
while (ETB_FORMATTER_STOPPED) {
CS_LOCK(ETB_LAR);
// write to ITM stimulus port
uint32_t value = 0xeeeeeeee;
for (int i=0;i<50;i++){
ITM_SendChar(value);
// disable ITM
*ITM_TCR &= ~(1 << ITM_TCR_ITMENA_Pos);
// disable ETB
while (ETB_FLUSH_IN_PROGRESS) {
// read from ETB
uint32_t read;
read = GET_REG(ETB_RRD);