完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
世界你好!MPLABX 3.55/XC8 V1.41/PIC18F25K80具有低优先级和高优先级中断,如果高ISR中断这些低中断例程,则低ISR中的算法会失真。尤其是浮点算法。我仔细研究了用户手册,我认为,这些数学例程是在所谓的编译堆栈中。因此,其他函数可以使用同一堆栈——如果它们不在同一调用链中。我看不清哪个参数或自动变量被修改了。但是我看到,在.LST文件中,函数y.fLADD例如被定义为不可重入的。这意味着,似乎有一个未被识别的链。也许这非常简单——我可能错过了一个编译器选项,或者没有告诉编译器,否则这些函数应该是可重入的,并且要使用软件包。但是这种配置并不罕见。每个人都会在具有不同优先级的不同中断中作为“+”,“*”,“/”进行数学操作。正确的StimiIIR =(SimthIII* 9 + PrimeCnc/)10;ItCONTITY。GIHH=1;有人帮我吗?谢谢!!!!马丁!
|
|
相关推荐
18个回答
|
|
|
不要。。。做…这从来都不是个好主意。
|
|
|
|
|
|
意思是,在PIC上执行中断服务内的浮点操作真是个坏主意。编译器应该处理整数数学。你能在两个ISR中显示真正的代码吗?
|
|
|
|
|
|
编译器应该通过保存适当的上下文来处理任何可能发生的情况,或者至少有开关来启用它。否则,它就坏了。
|
|
|
|
|
|
不是浮点,从我的经验…(似乎在注释中陈述)
|
|
|
|
|
|
浮点库被列为不可重入的。它不能用于这两种中断。或主中断。从表面上看,在这两种中断中使用慢速数学听起来都是一个坏主意。
|
|
|
|
|
|
同意。我猜在主函数和ISR中都有浮点运算。绝对没有。
|
|
|
|
|
|
谢谢你的回复。当然,你是对的,不应该在main和isr中使用浮点例程。但是我的问题更主要。即使在低ISR上对整数进行数学运算,高ISR也会干扰计算。另外,即使把浮点操作放在中断中是没有意义的,编译器也应该正确地处理堆栈。现在,我试着切换回MPLAB 8和C18,看看问题是否相同。我努力发布源代码,也许有人可以帮助我h发布操作指南。我在文章中看到代码部分,它们是彩色的(html),但是我不知道如何发布这个。问候Martin
|
|
|
|
|
|
C18在IRQ中正确地执行了整数数学;我没怎么用过XC8,但我绝对相信它能正确地工作。至于浮点……这不是堆栈的问题,而是资源(函数、临时区域…)的问题,这些资源将“花费太多”而不能重新进入,因此选择。
|
|
|
|
|
|
谢谢CinziaG,我为DSPIC编程了很多,所以我习惯于漂浮…但我绝对避免在PIC18-项目上尽可能地浮动。但是正如我所说的,即使是整数,我也有问题。顺便说一下,我换回到C18和MPLAB 8.92和“TA Ra!”相同的代码(更改为中断定义和编译器特定的头文件所必需的)工作得很好,没有复杂性……我在XC8-Compiler中花了很多时间,最后它对我来说不够可靠。
|
|
|
|
|
|
我…如果你对整数数学题也有把握的话,请举出一张支持票。和/或在此处发布代码和生成的程序集…
|
|
|
|
|
|
XC8称这是不可重入的。printf()也是一样的。事实上,在很多实现中,printf()不能重新进入。“编译器应该正确地处理堆栈。”“它不是这个堆栈不能重新进入的原因。使它重新进入需要更多的代码和更多的RAM。在许多8位PIC上缺少一些东西。”在XC8编译器中的Y小时,最后对我来说不够可靠。“这不是一个责任问题。问题是您希望桌面性能来自一个小小的8位CPU,或者至少是dsPIC性能。我猜您的In.r数学是与非原子操作相关的。DSPIC为16位。在16位CPU中可能是单个原子操作的方法是在8位CPU中进行多个操作。这意味着主和中断之间共享的变量有被破坏的风险,没有适当的处理。S停止,将没有bug修复。
|
|
|
|
|
|
好,所以对于浮点来说,这是一个重新进入的问题,而不是编译器。但是OP还指出XC8不能正确处理ISR中的整数数学。如果是真的,那就太糟糕了。
|
|
|
|
|
|
不太可能是真的,但是他忽略了看到用整数数学失败的实际代码的请求。
|
|
|
|
|
|
缺少论坛的投诉者说这不太可能是一些新的失败。它以前在中断中处理过整数数学。可能是NVMREG问题,原子性,或者它们的bug。
|
|
|
|
|
|
我的想法已经转到NVMRG的事情了,但是我不知道它如何能对整数数学起作用。它可能有浮动可能,一些常数…
|
|
|
|
|
|
嗨,只是为了澄清……如果你使用编译过的堆栈,没有函数是可重入的。因此,如果从主线和中断代码调用相同的函数,编译器必须采取一些行动。将会发生的是函数输出将被复制,一个实例由主线代码调用,另一个实例由中断代码调用。这一步解决了重新进入的问题。这将发生在用户定义以及库代码中,包括浮点例程。如果您使用的是1.41编译器,您将看到一条消息,称这是被执行的。例如,如果它是一个复制的浮点库例程,您可能会看到几个消息,比如:/./micro./XC8/v1.41/././float.c:62:不可重入函数“u ftpack”出现在多个调用图中,并且已经被编译器复制。ndd表示您试图在中断例程中使用浮点,但是它应该可以工作,尽管速度很慢。如果设备允许,还可以采用混合堆栈模型。(PIC18可以使用这个细则。)这将对所有函数使用高效编译的堆栈,但是出现在多个调用图中的那些函数将使用软件(传统的push/pop)堆栈,以便它们然后可重入,并且不需要重复。但是,请再考虑一下,是否真的需要在中断中使用复杂的代码。编译器将处理事情的可重入性,但是不能为共享全局变量的原子性做任何事情。
|
|
|
|
|
|
谢谢,杰夫:我想知道,除了复制功能本身,也会复制任何静态或全局存储?因为这可能是不重新进入的原因(我认为C中的类似情况,比如Strutk或时间函数……)
|
|
|
|
|
|
不,那不发生。复制函数使用的所有基于堆栈的变量也是复制的,但是全局变量或静态变量的情况并非如此,因为它们具有永久的存储持续时间。基本上,编译器将确保按照堆栈的方式复制过程是可重入的,但是如果您有显式共享全局变量的代码,那么就由程序员来确保他们的重入问题方面得到处理。定义了一个基于RAM的静态对象是sRAND(),但我可能错过了一些。有些定义静态指针,但它们本身不是静态的。静态const对象将在程序内存中,并且从未写入,所以它们是F.Jeff.
|
|
|
|
|
只有小组成员才能发言,加入小组>>
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 04:26 , Processed in 1.137996 second(s), Total 106, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1779