完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[tr]采用CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a))来保证一致性,导致无法进入外部中断。 在调试时发现,在外部中断添加断点,然后再restart,之后程序正常运行。。。其中原因未知,望指教
[/tr] |
|
相关推荐
7个回答
|
|
|
|
|
|
版主您好。我的程序是在while(1)中循环,然后含有三个中断,当我执行了CacheInv语句后,将无法再进入任何一个中断,我暂停后,程序没有停留在while(1)和三个中断中,而是停留在一个无法到达的位置,但按照我上述所说的调试之后,能够正常运行。。我注释掉CacheInv语句后,所有的中断正常运行。 |
|
|
|
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(); } |
|
|
|
/****************************************************************************/ /* */ /* 中断服务函数 */ /* */ /****************************************************************************/ 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); } |
|
|
|
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); } |
|
|
|
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 = (float) (receive_buffer_a); } //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); } |
|
|
|
以上四个程序分别是我的主函数,三个中断函数。当且仅当执行7楼函数的CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a));函数后 会出现无法再次进入中断的情况,调试检查GPIO中断触发,发现所有的配置正程
|
|
|
|
只有小组成员才能发言,加入小组>>
基于RK3588J的6路MIPI CSI视频采集案例分享,多路视频系统必看!
1351 浏览 0 评论
630 浏览 0 评论
【创龙科技TL570x-EVM开发板试用体验】 GStreamer 功能测评
8628 浏览 8 评论
【创龙科技TL570x-EVM开发板试用体验】创龙TL5708-EVM开发板入手使用体验评测
6675 浏览 0 评论
【创龙TLZ7x-EasyEVM评估板试用连载】+3.环境搭建vmware+ubuntu详细教程(二)
1418 浏览 0 评论
917浏览 0评论
【创龙科技AM64x开发板试用体验】创龙科技AM64x开发板及核心板介绍
872浏览 0评论
【创龙科技AM64x开发板试用体验】创龙科技AM64x开发板--板卡调试软件安装
889浏览 0评论
【创龙科技AM64x开发板试用体验】AM64x开发板开箱测评
884浏览 0评论
求助! 关于使用自制底板插入创龙IMX8MM 核心板无法启动问题
512浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 05:56 , Processed in 0.846971 second(s), Total 92, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号