嵌入式开发者社区
标题:
关于Cache UPP传输一致性问题
[打印本页]
作者:
sss4550988
时间:
2016-7-7 18:37
标题:
关于Cache UPP传输一致性问题
采用CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a))来保证一致性,导致无法进入外部中断。 在调试时发现,在外部中断添加断点,然后再restart,之后程序正常运行。。。其中原因未知,望指教
作者:
希望缄默
时间:
2016-7-7 20:40
除非你执行的某些代码临时禁用了中断 否则只要配置正确一定会执行中断的
作者:
sss4550988
时间:
2016-7-8 09:19
希望缄默 发表于 2016-7-7 20:40
除非你执行的某些代码临时禁用了中断 否则只要配置正确一定会执行中断的
版主您好。我的程序是在while(1)中循环,然后含有三个中断,当我执行了CacheInv语句后,将无法再进入任何一个中断,我暂停后,程序没有停留在while(1)和三个中断中,而是停留在一个无法到达的位置,但按照我上述所说的调试之后,能够正常运行。。我注释掉CacheInv语句后,所有的中断正常运行。
作者:
sss4550988
时间:
2016-7-8 09:21
int main(void) {
TSCL = 0;
CacheEnableMAR((unsigned int) 0xC0000000, (unsigned int) 0x08000000);
CacheEnable(L1DCFG_L1DMODE_32K | L1PCFG_L1PMODE_32K | L2CFG_L2MODE_256K);//打开DSP缓存
InterruptInit();//初始化DSP的中断
procsessor_Init();
uPPInit();//upp初始化
extrigInit();//外部触发引脚初始化
while(1);
while(1);
return 0;
}
void InterruptInit(void) {
// 初始化 DSP 中断控制器
IntDSPINTCInit();
// 使能 DSP 全局中断
IntGlobalEnable();
}
作者:
sss4550988
时间:
2016-7-8 09:21
本帖最后由 sss4550988 于 2016-7-8 09:25 编辑
/****************************************************************************/
/* */
/* 中断服务函数 */
/* */
/****************************************************************************/
void uPPIsr(void) {
unsigned int intr_dmai_status, intr_dmaq_status;
int i;
/* if (measureflag == 0) {
tAfter = _itoll(TSCH, TSCL);
tOverhead = tAfter - tBefore;
printf("-upp trans Cycle is %lld \n", tOverhead);
printf("-upp trans Time is %lld us (CPU Frequency:456MHz)\n",
tOverhead / 456);
//measureflag = 1;
}*/
// 取得 DMA 中断状态
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
IntEventClear(SYS_INT_UPP_INT);
while (intr_dmai_status != 0 || intr_dmaq_status != 0) {
if (intr_dmai_status & uPP_INT_EOL) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL);
}
// 窗口接收完成
if (intr_dmai_status & uPP_INT_EOW) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
GPIOBankIntEnable(SOC_GPIO_0_REGS, 4);
// CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a));
GPIOPinWrite(SOC_GPIO_0_REGS, 94, GPIO_PIN_HIGH);
}
if (intr_dmai_status & uPP_INT_ERR) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_ERR);
//upp_error_countA++;
uPPReset(SOC_UPP_0_REGS);
}
if (intr_dmai_status & uPP_INT_UOR) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_UOR);
//upp_error_countA++;
uPPReset(SOC_UPP_0_REGS);
}
if (intr_dmai_status & uPP_INT_DPE) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_DPE);
//upp_error_countA++;
uPPReset(SOC_UPP_0_REGS);
}
if (intr_dmaq_status & uPP_INT_EOL) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOL);
}
if (intr_dmaq_status & uPP_INT_EOW) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOW);
//receiveOK_b = 1;
}
if (intr_dmaq_status & uPP_INT_ERR) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_ERR);
//upp_error_countB++;
uPPReset(SOC_UPP_0_REGS);
}
if (intr_dmaq_status & uPP_INT_UOR) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_UOR);
//upp_error_countB++;
uPPReset(SOC_UPP_0_REGS);
}
if (intr_dmaq_status & uPP_INT_DPE) {
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_DPE);
//upp_error_countB++;
uPPReset(SOC_UPP_0_REGS);
}
// uPP 中断将多个事件组合为同一中断源
// 判断是否全部事情被处理完毕
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
}
// 通知 CPU uPP 中断处理完毕以便后续事件可以产生
uPPEndOfInt(SOC_UPP_0_REGS);
//GPIOBankIntEnable(SOC_GPIO_0_REGS, 5);
}
作者:
sss4550988
时间:
2016-7-8 09:22
void DataTransIsr(void) {
// 禁用 GPIO BANK 6 中断
GPIOBankIntDisable(SOC_GPIO_0_REGS, 5);
// 清除 GPIO BANK 6 中断事件
IntEventClear(SYS_INT_GPIO_B5INT);
if (GPIOPinIntStatus(SOC_GPIO_0_REGS, 96) == GPIO_INT_PEND) {
// 清除中断状态
GPIOPinIntClear(SOC_GPIO_0_REGS, 96);
transposeParA.WindowAddress = (unsigned int *) ((int) receive_buffer_a);
transposeParA.LineCount = upp_line_count;
transposeParA.ByteCount = (upp_line_size * sizeof(short int));
transposeParA.LineOffsetAddress = (upp_line_offset * sizeof(short int));
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &transposeParA);
GPIOPinWrite(SOC_GPIO_0_REGS, 94, GPIO_PIN_LOW);
}
//i=1;
// 使能 GPIO BANK 6 中断
GPIOBankIntEnable(SOC_GPIO_0_REGS, 5);
}
作者:
sss4550988
时间:
2016-7-8 09:23
void signalProcessorIsr(void) {
int i;
GPIOBankIntDisable(SOC_GPIO_0_REGS, 4);
// 清除 GPIO BANK 4 中断事件
IntEventClear(SYS_INT_GPIO_B4INT);
if (GPIOPinIntStatus(SOC_GPIO_0_REGS, 73) == GPIO_INT_PEND) {
// 清除中断状态
GPIOPinWrite(SOC_GPIO_0_REGS, 92, GPIO_PIN_HIGH);
GPIOPinIntClear(SOC_GPIO_0_REGS, 73);
if (measureflag == 0)
tBefore = _itoll(TSCH, TSCL);
//CacheDisableMAR((unsigned int) 0xC0000000, (unsigned int) 0x08000000);
for (i = 0; i < 2 * sampleNumber; i++) {
receiveData[i] = (float) (receive_buffer_a[i]);
}
//if(measureflag >0)
CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a));
// CacheEnableMAR((unsigned int) 0xC0000000, (unsigned int) 0x08000000);
if (period_counter < slowT) {
fastTimeProcessor(period_counter);
period_counter++;
}
if (period_counter == slowT) {
//slowTimeProcessor();
period_counter = 0;
}
if (measureflag == 0) {
tAfter = _itoll(TSCH, TSCL);
tOverhead = tAfter - tBefore;
printf("-processor Cycle is %lld \n", tOverhead);
printf("-processor Time is %lld us (CPU Frequency:456MHz)\n",
tOverhead / 456);
measureflag = 1;
}
// CacheDisableMAR((unsigned int) 0xC0000000, (unsigned int) 0x08000000);
// CacheEnableMAR((unsigned int) 0xC0000000, (unsigned int) 0x08000000);
GPIOPinWrite(SOC_GPIO_0_REGS, 92, GPIO_PIN_LOW);
}
GPIOBankIntEnable(SOC_GPIO_0_REGS, 4);
}
作者:
sss4550988
时间:
2016-7-8 09:25
以上四个程序分别是我的主函数,三个中断函数。当且仅当执行7楼函数的CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a));函数后 会出现无法再次进入中断的情况,调试检查GPIO中断触发,发现所有的配置正程
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4