完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
代码情况:一个10us定时器中断,定时器中断中运行时间大约为7us时间。
一个GPIO中断,做正弦波相位校准。当该中断触发,需立马执行该服务程序。 想设计效果:定时器中断服务子程序,可以被GPIO中断服务程序嵌套。我已经将GPIO中断优先级高于定时器中断。 参考了很多资料,感觉有疑惑: 1.在TMS320C64x+ DSP Megamodule Reference Guide中有一句“”“Since any interrupt service routine can be atomic (not nestable), the CPU interrupt priority only applies to pending interrupts”,说可屏蔽中断,不可以被嵌套。 2.在“”TMS320C64x/C64x+ DSPCPU and Instruction Set”中,又有一篇专门讲Nested Interrupts,我按资料写了中断嵌套代码,保护IRP,CSR,........在恢复CSR,..; old_irp = IRP; old_csr = CSR ; CSR = old_csr | 1 ; /* Interrupt service code goes here. /* Interrupts may occur while this code executes //测试发现: 当GPIO中断触发后,并没有立马跳到GPIO中断服务子程序 CSR = CSR & -2 ; CSR = old_csr ; IRP = old_irp ; 问题:我把GPIO中断优先级设最高。当DSP的PC跳到定时器服务程序中,我触发GPIO中断,但是程序为马上跳到GPIO中断,而是运行完定时器中断后,才执行GPIO中断。 如果我要程序在执行定时器中断服务程序时,若GPIO中断触发能立马嵌套,跳到GPIO中断服务程序去.该怎么办? |
|
相关推荐
10 个讨论
|
|
#1. #2.不矛盾,一个是讲的中断控制器不支持硬件嵌套。一个讲的是软件如何实现嵌套。
你的问题是需要用软件实现嵌套来解决。方法两种: #1. 用BIOS的中断dispatcher,很方便实现嵌套(说白了就中BIOS的软件实现中断嵌套的配置接口) #2. 在没有用BIOS的情况下,自己根据上面第2条里的方法在timer中断里保存IRP,打开全局中断,以允许GPIO中断进来。说白了就是把中断响应时硬件自动实现的动作用软件保存起来,所以仔细看一下芯片在响应中断时硬件自动做了哪些动作,把这个理解了自然就没有疑问了。 举个例子,在响应中断时,硬件自动把当前PC值保存到IRP,你可以看一下ISR编译产生的汇编最后一条语句是 B IRP。想像一下,如果在ISR里嵌套别的中断进来,CPU也会把返回地址自动保到IRP寄存器,哪前面那个中断的返回地址(在IRP里)就被覆盖了,还能一级级返回吗,所以上面一个保存IRP各恢复IRP的操作。 其它同理~~~ http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
lifei639156 发表于 2018-7-25 09:54 Tony Tang: 谢谢你的来信。 在定时器中断服务程序中,我做的效果和你说的一样,我保存了IRP,CSR,并开启了全局中断。代码如下: old_irp = IRP; old_csr = CSR ; CSR = old_csr | 1 ; 之后任意时刻发生GPIO中断,但是定时器中断服务程序还没执行完成,这时GPIO中断来到,IFR中对应的IF4置1(GPIO中断到来),程序并没有立即跳出定时器中断服务程序。 如果手动B 跳转到GPIO中断入口或许可以实现嵌套跳转,但是定时器中断服务程序很大,我不能在每个语句下面读IFR来判断GPIO中断有没到来(IF4是否为1)?????? 补充说明:GPIO中断优先级为4可屏蔽中断中最高,定时器中断优先级为6。 我没用BIOS,就是裸程序,想在很长的定时器中断服务程序中,能快速判断GPIO中断到来并能实时跳到GPIO中断服务程序中。 |
|
|
|
|
|
lifei639156 发表于 2018-7-25 10:26 Tony Tang: 我是之前,就是参考你说的这个例子写到的程序。 你问我IER中GPIO中断开启了没,我可以确切告诉你GPIO中断使能是开启的(IER的IE4为1),我并把GPIO中断设置成非屏蔽中的最高优先级。 你可能没有留意, 我说的测试过程。我重述一下我的测试过程呢(就用你发的example5-17图片实例说明): 这个实例为我的定时器中断服务器程序,当定时器触发中断到,DSP立马运行到定时器中断服务程序中的"interrupt service code goes here",在这个代码里,手动触发产生一个GPIO中断,发现IFR的IF4为1(说明GPIO中断以后发生),但是程序并没跳到GPIO中断服务程序,只有当DSP运行完定时中断服务程序后,并运行完IRP=old_irp;后,DSP才跳到GPIO中断服务程序。。(备注需要的效果是:"interrupt service code goes here"里的程序很大,GPIO中断随机时刻到来时,能立即中断定时器中断嵌套到GPIO中断服务程序) 测试结果: 只有当定时器中断运行完后(优先级为6),才执行GPIO中断服务程序(优先级为4)。在定时中断服务程序中,我以前就是像你发的图片那样保存和恢复相应的寄存器的, 为什么不能在定时中断服务程序中,嵌套到GPIO中断?(补充:GPIO中断,定时器中断都能正常触发,就是没有嵌套能力) |
|
|
|
|
|
bctwerwer 发表于 2018-7-25 10:45 好吧,看来我不得不自己动手做一个了~~~ http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
bctwerwer 发表于 2018-7-25 10:45 基于C6748 starterware 的timer的例子,稍做修改增加一个timer 3中断,与timer 2嵌套。 以打印结果为证,完全没问题。 http://processors.wiki.ti.com/index.php/Main_Page Think Over Before Asking. http://www.catb.org/~esr/faqs/smart-questions.html#goal |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
340 浏览 1 评论
535 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
781 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
655 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1138 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
65浏览 29评论
173浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
255浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
205浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
60浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 07:46 , Processed in 0.980261 second(s), Total 60, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号