完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
您好,我正在为PIC32编写代码,并且发现即使是简单的ISR的开销也是荒谬的。这是我的ISR……我的拆卸列表显示……现在,要么我根本不理解它是如何工作的,要么C编译器放入了大量的垃圾。首先,我使用的是免费编译器,所以垃圾的情况可能是这样。考虑到这一点,我想知道是否有人愿意用优化的编译器编译上面的代码并发布最终的汇编代码。如果编译得很紧,我可能不得不购买编译器。除此之外,我想知道是否有任何精通汇编的人能给我或指出我在汇编中使用的代码行来完成这项工作。我已经用其他的PIC控制器编写了汇编,这看起来应该只是几根线。谢谢。
|
|
相关推荐
19个回答
|
|
|
“垃圾”是编译器保存寄存器上下文,并设置嵌套中断。如果你想要一个简短的序幕/结尾,你可以使用影子寄存器。PIC32 MZ有足够的寄存器集,每个优先级可以使用单独的一个。-仅使用优先级7。当编译器知道ISR不能被抢占时,编译器使用较短的序言。-不要调用ISR中的其他函数。编译器是足够聪明的,如果不需要的话,可以保存更少的寄存器。如果使用程序集,则不必遵守C调用约定。对于它实现的功能,编译器生成的序言中没有赘肉。
|
|
|
|
|
|
从编译器手册:ISR代码…如果ISR调用普通函数,那么编译器将保存所有工作寄存器,即使它们不是在ISR本身中明确使用的。必须这样做,因为编译器无法知道被调用的函数使用了哪些资源。
|
|
|
|
|
|
欢迎来到MIPS架构。你认为那32个寄存器是个好东西吗?C编译器生成的代码不再是必需的。您注意到,ISR的一个很好的部分是推/弹出编译器认为非阻塞的所有寄存器。你不会在组装上做得更好,因为信不信由你,这已经被优化了。这是一个知道的事情,一个33英尺的ISR比PIC32花费更少的时间,即使一个运行在80MHz,另一个在一半,我们将不会谈论ARM(它大约和一个33 F一样)。
|
|
|
|
|
|
我想我在一本书中看到INTClearFlag是一个宏。也许我错了。不过,看看这一切简单的NOP。我不知道为什么它认为它需要存储所有这些。
|
|
|
|
|
|
其中大部分是设置嵌套中断。唯一不严格需要的是一些看起来像寄存器堆栈选择代码剩余部分的指令(因为您使用的是“自动”属性)。
|
|
|
|
|
|
第二和第三句告诉我,第一句的意思是,当不调用普通函数时,它只保存ISR使用的寄存器。如果ISR只包含一个NOP,那么为什么软件会保存任何寄存器?它只需把PC推到堆栈上就可以了。如果它担心嵌套中断,那么我认为任何其他中断都会处理它需要的寄存器,问题会自己处理。我的逻辑怎么了?
|
|
|
|
|
|
在1级的优化器中,这是我用iPL7Suffic得到的一个NOPY,它比RikFord66得到的短很多。我注意到,当我使用iPL7Auto-有两个额外的寄存器保存。
|
|
|
|
|
|
主要的事实是MIPS CPU对中断条目没有任何工作,您可能习惯于其他体系结构。当CPU进入ISR时,中断被禁用。其他一切都必须手工完成。这是一个注释的版本,它来自你的原始文章:编译器可以优化人工去做任何事情,但是你可以从上面的代码中删除很多指令。9D0085 C和9D000 0880的指令在没有好的理由的情况下来回复制堆栈指针,但就是这样。
|
|
|
|
|
|
这太愚蠢了。把PC推到堆栈(硬件中)并用它作为返回地址有什么不对吗?然后,软件可以推动它需要存储的任何价值,以防止腐败。为什么会这样?除了那些设计得很高的人之外,还有其他原因。
|
|
|
|
|
|
你必须回到20世纪80年代早期的第一个MIPS CPU的设计。其想法是通过将功能转移到软件来设计更便宜、更简单和更快的处理器。
|
|
|
|
|
|
好的,当我有时间的时候,我必须调查一下。看来我能比使用ISR更快地查询中断标志。哈哈,谢谢大家的帮助。
|
|
|
|
|
|
毫无疑问。
|
|
|
|
|
|
毫无疑问。这要看情况而定。
|
|
|
|
|
|
如果你能承受中断,否则将调用中断,那么轮询是一个完全可接受的解决方案。(这假设您在主循环内进行轮询,并且还执行其他操作。)如果轮询时进行“阻塞”,那么您将得到(可能)比整个ISR更快的响应,但是对其余代码有影响。与所有设计决策一样,这是折衷……Susan
|
|
|
|
|
|
有人能评论一下当前编译器是否能够使用“中断自动开始/结尾”,如果有,那么这个过程需要多少个周期?我通常在XC1.32下使用-O1,它似乎不会生成IRET指令(其存在将指示正在使用自动序言/结尾)。关于PIC32MZISR可以做得多紧的讨论,我肯定很多人都感兴趣,我也不确定声誉。芯片是狗的中断延迟是完全当之无愧的,因为它有一个阴影集为每一个优先级,以及一些其他内置的延迟保存功能。
|
|
|
|
|
|
据我所知,编译器对MCU ASE没有支持。对于MZ,您还有一个额外的问题,即累加器和浮点寄存器都没有存储,所以在最坏的情况下,您仍然需要手动保存它们。
|
|
|
|
|
|
据我所知,编译器对MCU ASE没有支持。使用MZ,您还有一个额外的问题,即累加器和浮点寄存器都没有存入银行,所以在最坏的情况下,您仍然需要手动保存它们。我在生成的列表文件中寻找一个项目,我用FreeRTOS在XZ32 1.40的MZEF上运行…编译器似乎不仅没有为cp0使用自动pro/epilogue,而且OS代码似乎在每次OS改变任务时都生成一个完整的通用上下文保存/恢复。我猜,这个(125+个上下文恢复周期)对于任何ta来说都是“通用”的代价。SK/上下文可以利用FPU或DSP…乍一看,这听起来很荒唐,但是即使每秒有10000个上下文切换,在200MHz时内核的开销也不会超过1.5%。
|
|
|
|
|
|
这个线程相对比较旧,但我很好奇是否有人可以给出使用影子寄存器的中断例程的prolog/epilog的程序集列表?此外,文档还指出,ISR声明应该采取以下形式:其中n是分配给各个中断的中断优先级级别。考虑到PIC32MZ...EF有7组影子寄存器,我将每组影子寄存器分配给相应的中断优先级,是否有可能将所有中断例程声明为:根据我对编译器文档的理解,只有当IPL指定符指定为语句“AUTO”:另一方面,编译器文档还指出:这仅适用于影子寄存器少于中断级别(7)数量的设备吗,或者即使当MCU提供7个影子寄存器集并且每个集被分配给相应的中断时,也可能发生这种损坏。优先?我只是从PIC32 MZ开始从16位设备过渡,所以我将非常感谢您的答案!
|
|
|
|
|
|
你可以自己编译和分解一个例子。唯一的真正区别是GPRS没有被保存或恢复。中断上下文必须仍然保存,如未存储的寄存器(例如累加器)。如果使用AUTO,ISR在运行时包括变体和分支。IPLn指定符和中断优先级不匹配总是危险的。如果IPLn低于实际优先级,ISR将递归,软件将崩溃。如果IPLN更高,则可能会延迟更高优先级(并且可能更重要)的中断。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:58 , Processed in 1.028536 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1317