关于Cache UPP传输一致性问题 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4383|回复: 7
打印 上一主题 下一主题

关于Cache UPP传输一致性问题

[复制链接]

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
跳转到指定楼层
楼主
发表于 2016-7-7 18:37:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a))来保证一致性,导致无法进入外部中断。  在调试时发现,在外部中断添加断点,然后再restart,之后程序正常运行。。。其中原因未知,望指教
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2016-7-7 20:40:01 | 只看该作者
除非你执行的某些代码临时禁用了中断 否则只要配置正确一定会执行中断的
回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
板凳
 楼主| 发表于 2016-7-8 09:19:03 | 只看该作者
希望缄默 发表于 2016-7-7 20:40
除非你执行的某些代码临时禁用了中断 否则只要配置正确一定会执行中断的

版主您好。我的程序是在while(1)中循环,然后含有三个中断,当我执行了CacheInv语句后,将无法再进入任何一个中断,我暂停后,程序没有停留在while(1)和三个中断中,而是停留在一个无法到达的位置,但按照我上述所说的调试之后,能够正常运行。。我注释掉CacheInv语句后,所有的中断正常运行。
回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
地板
 楼主| 发表于 2016-7-8 09:21:01 | 只看该作者
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();
}

回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
5#
 楼主| 发表于 2016-7-8 09:21:38 | 只看该作者
本帖最后由 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);
}
回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
6#
 楼主| 发表于 2016-7-8 09:22:26 | 只看该作者
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);

}
回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
7#
 楼主| 发表于 2016-7-8 09:23:02 | 只看该作者
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);
}
回复 支持 反对

使用道具 举报

1

主题

8

帖子

38

积分

新手上路

Rank: 1

积分
38
8#
 楼主| 发表于 2016-7-8 09:25:04 | 只看该作者
以上四个程序分别是我的主函数,三个中断函数。当且仅当执行7楼函数的CacheInv ((unsigned int)receive_buffer_a, sizeof(receive_buffer_a));函数后 会出现无法再次进入中断的情况,调试检查GPIO中断触发,发现所有的配置正程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-13 00:09 , Processed in 0.039395 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表