完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好,
我从CY8CITK-050开发工具包开始。 我使用两个SAR-ADC(采样频率100 kHz)和在高优先级中断服务程序(PrIO 0)中的一些时间关键计算。在我执行一个附加中断服务(上升沿@ 10Hz,优先级7)之前,一切都正常工作,以便为进一步的处理设置一个标志。这个进一步的处理是在DEN主回路中完成的,并将一些数据发送到显示器。 当低电平中断被启用时,在高优先级中断服务例程中的信号处理中消除抖动(约1.3US)。 这是用一个拨号位作为数字输出在程序结束。该服务例程由一个ADC的EOC触发,并且需要大约4μs用于信号处理(没有代码优化)。 这种抖动的原因是主环路中的代码(LCD函数): CysISR(DISBASISISROLO){DISSUBFLAG=1;} 主(空)… 如果(DISSOFFLAG==1){/ /不做任何测试!P=(PHILLUtiN INT*(UINT64)360000)& /f uur p=2 SpIFTF(DISPLASTR,“%4D %4D”,(INT)ValpCurtTyn,(int)ValpCurtToCoS);LCDX位置(0,0);LCDApReltStand(DISPARSTR);结果=SAMFETF(DISPLASTR,“%6D MGRAD”,(INT)PHIIDEISP);LCDX位置(1,0);LCDA PrimtStand(DISPASSTR);菲利普斯DISSIFFLAG=0;} 在信号处理中也存在抖动,这取决于输入信号值和代码优化的调整。但是,随着恒定的输入值(忽略ADC数据),这种抖动是不存在的。 你能给我一些建议来解决这个问题吗? 关于问候 斯蒂维克 电压显示 239.7 K |
|
相关推荐
22个回答
|
|
欢迎来到论坛,史蒂夫!
关于抖动的唯一想法与CPU内部中断处理有关:当处理程序完成并从中断返回时,对任何中断进行检查。如果是这样,那么下一个处理程序的调用就会缩短(ARM试图节省周期)。这可能会导致一些抖动取决于ISRXISDIP中断是否在您的AcdCysIsISRL OR处理程序的执行过程中发生。 鲍勃 我住在不来梅附近,你住在哪里? |
|
|
|
第二尝试添加附件
|
|
|
|
你好,鲍伯,
谢谢你的快速回答。 高优先级中断处理程序在大多数情况下中断主()中的循环,很少中断非常短的低优先级中断处理程序。通过用SabPull时钟(SOC ADC)触发一个示波器,观察切换的数字输出的时间特性来消除抖动。如果Itoggle在高优先级中断处理程序开始时直接输出数字,则抖动要小得多。因此,在高优先级中断处理程序的处理中会有额外的抖动。 这看起来像是这个处理程序的中断,这是不应该发生的,因为没有更高优先级的中断源。 中断的上下文切换应该在大约12个周期(@ 64 MHz小于200纳秒)下完成,或者? 斯蒂维克 我住在法兰克福北部50公里的韦茨拉尔。 |
|
|
|
|
|
|
|
|
|
|
|
我认为这使得我的缓存缺失理论更有可能。小循环是一个很容易与指令缓存一起安装到ISR(这个字节有多少字节)?而SaveTFF是一个大的函数,它将清除指令缓存,使ISR变慢。
为什么你会担心抖动?是因为你担心ISR会因为你的高采样率太慢吗?在这种情况下,您应该使用DMA来存储ADC结果并进行大量处理,然后将使用缓存。 |
|
|
|
你好,Dana,
我在第一次发布时附上了代码。 但是这里是高优先级处理程序的概要: CysISR(ADC^ COSIX ISRLUC){Tn16x,y,z;//和其他一些局部变量/ /读取ADC样本 X=CythGETYRG16(ADCJOSCOSARA WRK0YPPTR)- 2048;Y=CygGETYGRIG16(ADCXIN SARA WRK0YPPTR)- 2048;/ /做一些计算/ /滤波,除法,表查找AtAN插值/写入控制寄存器PHIOMODYCORMIT=结果;DYDR=(PixPieldIr.D&&0xBF)周期;/ /切换下一个周期的比特(如果周期=0)周期=64;/ /直接右位位置否则周期=0;} 我在ISR中放置了大部分信号处理,以处理主()中的非时间关键处理。 当做 斯蒂维克 |
|
|
|
首先介绍缓存缺失理论。如果一个错误增加4个附加时钟周期,对于1个我们来说,在一个CALOLF的高优先级处理器中应该有16个错过(@ 64 MHz总线时钟)。这是可能的吗?
高优先级中断处理程序有大约71条指令代码行,看反汇编窗口。这符合你的理论。因此,启动中断处理程序,缓存的指令不适合,它需要多达16个错误,以需要的指令再次填充缓存。 在很多情况下,你建议做块信号处理是一件好事。不幸的是,在这种情况下,我必须将信号处理的延迟保持在最低限度。在块中累积数据是不可能的。 抖动降低了在该中断例程中的最大可能采样率或可能的信号处理量。 例如,目前的信号处理只需要大约1.8个US,所以抖动为1μs是非常重要的。 另一种可能性是将一些信号处理转换成UDB块或DFB BoCK。DFB块已经被保留用于某些处理,并且我已经使用了一些UDB块。我将在正在进行的开发中检查这一点。 |
|
|
|
我会看到你看到的是缓存效果。PSoC5LP具有128字节的指令缓存。如果只有你的ISR运行,它可能完全缓存,并可以全速运行的任何时间。如果主循环做了一些事情(每次DISBASFLAG==1),它就被加载到缓存中,ISR运行慢一点,因为它看到高速缓存未命中。这也解释了为什么在ISR开头切换标志时抖动会更好——在这里,缓存的缺失要处理得少,延迟也更短。
(从TRM,表5-1:从存储器获取指令的时间可达4个时钟周期) |
|
|
|
它很有趣。TRM谈论高速缓存行(并且有多个行),但没有说明它们有多大。
因此,似乎每个缓存缺失都会获取整个缓存行,从而跨越多个指令。 如果您真的想要测试-指令缓存可以被禁用,请参阅TRM中的第5章。当我正确的时候,应该没有抖动,但是ISR现在会慢一些。 |
|
|
|
从一个非常高的角度来看,有一些事情可以做,以避免抖动。选择一个或没有一个,你的选择!
1)在开始时启用低优先级ISR中的中断。这将减少抖动,但它应该使它远小于微秒。 2)如果事件的时间允许,在高优先级ISR结束时处理标志测试作为事后考虑。 3)使用低优先级输入设置一个设置复位寄存器的触发器,该触发器提供一个控制寄存器。在主循环中读取控制寄存器,并在主控制器中使用控制寄存器重置FF。如果设置了FF,则用与软件中设置的标志相同的方式处理它。 4)根据你需要做的软件,设计一些硬件来做你需要的高优先级事件的输出,并在稍后的软件中处理事件的信息,在一个ISR中,它可以在不破坏苹果车的情况下经受一些抖动。 5)如果这是一个周期性事件,并且能够经受住一个事件的延迟,那么考虑允许信息在一个事件之后熄灭。ISR可以抖动,但是为下一个在时钟上发生的输出事件(即触发ISR的输入信号)设置。 |
|
|
|
好的,如果你需要比DMA低延迟的问题。是的,您需要考虑计算速度最慢的ISR执行时间。对于71个指令,缓存效果是不可忽略的。(引用Terje Mathisen的话):“几乎所有的编程都可以看作是缓存中的一种练习”。
PSOC5有24个UDB,每个都有一个数据通路,这是相当大的处理能力。我认为使用DFB进行多个任务将是困难的,因此UDB似乎是最好的选择。 |
|
|
|
还有一件事,如果输出位总是可以被抵消几毫秒而没有问题,你可以使用一个2US时钟到触发器同步对,并设置或重置D线。然后,它将设置/重置2US,在范围内没有看到“抖动”。
|
|
|
|
是的,确实没有缓存(CyDeFieldToCuxCaseEx启用0在Cyfter。H):
信号处理时间从1.8US增加到4秒。 抖动从1U降低到约90 ns。 这就是证据——现在它不是一个理论——这是一个事实: 谢谢你的支持。 我想,没有办法让缓存控制器在缓存中保留一些代码,而不是其他的。 |
|
|
|
ARM皮质M0通用用户指南摘录
“尾部链接这种机制加快了异常服务。在完成异常处理程序时,如果存在满足异常条目要求的挂起异常,则跳过堆栈POP并将控制转移到新异常处理程序。晚到这种机制加快了抢占先机。如果在先前异常的状态保存期间发生较高优先级异常,则处理器切换以处理较高优先级的异常,并启动针对该异常的向量获取。状态保存不受延迟到达的影响,因为保存的状态对于两个异常都是相同的。从迟到到达异常的异常处理程序返回时,应用正常的尾部链接规则。 与抖动无关,但是变量DISBUG标志应该被声明为“易失性”,或者在编译生成选项“释放”时会得到一个坏的惊喜。 鲍勃 |
|
|
|
当我没有咨询我的水晶球的时候,它是正确的;
有一件事要做:我记得一些关于能够从闪存的SRAM iNTETED执行代码的讨论。也许AN89610可能会有所帮助。谷歌以其他方式产生HTTP://www. CyPress?RID=61932,但我现在没有时间再看。这样做可以使代码更快,甚至没有缓存。(我早该想到) |
|
|
|
高优先级中断处理程序的输出被写入控制寄存器,该寄存器与SAMPLE时钟同步,用于硬件中的进一步信号处理。
因此抖动在输出不可见。问题是,抖动降低了最大可能的采样频率或在ISR中用于更多信号处理的可用时间。 这就是我想弄清楚抖动的原因的原因。 下一步是测量缓存命中率或命中率。有人有这个话题的样本代码吗? ……并声明DISTIFY标志为易失性… 从调试模式而不是发布模式对时序有影响吗? |
|
|
|
一个问题:为什么你会担心抖动?在ISR开始时,似乎有一个低的(甚至不存在的)抖动,但是执行时间不同。但我在ISR中没有看到任何关键时刻。
从长远来看,在每个ADC中使用DMA2和两个缓冲器,然后在填充一个缓冲器时进行大量数据处理可能更好。这样你就不需要在ISR中做任何长时间的计算(这是一个糟糕的做法)。 |
|
|
|
(哦,我写的时候,你回答了我的问题:)
我不确定测量缓存错误是多么容易,我不知道像CordX-M3内核中的性能计数器之类的东西。看起来你需要阅读可用的ARM文档… 释放模式比调试模式快,因为编译器能够做更多的优化。 |
|
|
|
只有小组成员才能发言,加入小组>>
757个成员聚集在这个小组
加入小组2137 浏览 1 评论
1877 浏览 1 评论
3700 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1815 浏览 6 评论
1561 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
756浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
511浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
470浏览 2评论
422浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
1113浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 18:51 , Processed in 1.250446 second(s), Total 79, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号