完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我有一个阻塞延迟功能,运行在V1.02和AM升级到V1.07,但它将不会在这里工作。(我使用的是编译器XC32 1.40和IDE MPLABX 3.26,并在IDE MPLABX 3.10中尝试过)我使用的是回调函数,该函数递增了我用作时钟的计时器计数器。然后,我使用函数GMSTMistReor()函数返回当前计时器值。如果我想要1msec的内联延迟,我使用“.((GetMstime()-.)<1){}”V1.07中的问题是当我处于while循环中时,回调函数不会像在V1.02中那样执行。因此,程序不会退出while循环,因为计时器停止递增。比我的延迟不工作更大的问题是,任何while循环都可以阻止中断执行回调,并导致计时器不准确。是否需要在while循环中放入一些内容,以允许中断执行V1.07中的回调函数?至于解决我眼前的问题,我发现如果我继续循环遍历状态机并使用if语句,我就可以执行延迟,但是由于两个原因,这是不能接受的。首先,我希望尽可能接近1msec,并且我正在使用的状态机的其余部分具有不规则的循环时间,所以我可能错过时间标记。第二个原因是环中的控制器中的一些其他设备依赖于这种延迟发生。我通常避免阻塞延迟,但有时你只需要一个小的。举个例子,如果你正在控制一个化学喷雾器,那么喷雾器激活的时间量是非常精确的。因此,在嵌入式设计中,这是一个主要问题。
|
|
相关推荐
9个回答
|
|
|
我对过去的定时器服务印象不深,所以我没有使用它。如果您能看到一个特定的问题,您可以将其报告为bug。这可以使用MIPS核心定时器来工作。defineRE_CORE_TIMER()_CP0_GET_COUNT()//Read the MIPS核心定时器延迟Ms(uint16_t毫秒){uint32_t时间;time=READ_CORE_TIMER();//Read Core Timer time+=(SYS_CLK_FREQ/2/1000)*毫秒;//计算Stop Time.((int32_t)(time-READ_CORE_TIMER()>0){}}。
|
|
|
|
|
|
我以前直接使用过核心计时器,我会试着看看它是否能让我渡过难关。由于它在while循环中关闭中断,所以看起来它们几乎是在进行虚拟中断,因此在while循环中可能必须调用一些东西来保持虚拟中断的运行。我想知道它是什么。我已经将SYS_TMR_Tasks()中调用的SYS_TMR_Tasks()放在system_task.c中查看中断是否在那里工作,但是它没有工作。1.02。所以在我做一个bug报告之前,我想看看其他人是否也看到了这一点。为了测试代码,它非常简单而简短:静态SYS_TMR_HANDLE TimerBaseMsTimer;//timer设置于app.c文件属性uint32_tMsTime.=0的顶部;//32位无符号计数器设置于app.c文件顶部。TimerBaseMsTimer=SYS_TMR_Callback.ic(1,1,TimerClockCallback);//set timer回调APP_Initialize()void TimerClockCallback(uintptr_t上下文,uint32_t alarmCount){if(context==1){MsTime.+;}}}为了获得计时器值,我使用uint32_t GetMsTime(void){returnMsTime.//return the ms计数器值}然后while延迟循环设置为:uint32_t.=GetMsTime();.((GetMsTime()-.)<1){}如果有人尝试这个方法,并且能够找出我做错了什么,请告诉我,如果它看起来没问题,那么让我们提交一个关于这个杀死中断回调的错误报告。
|
|
|
|
|
|
谢谢你。您的解决方案有效。我仍然想知道为什么while循环现在会终止Callback函数,如果其他几个人能够验证这一点,那么可能应该生成一个bug报告。
|
|
|
|
|
|
你可以打开一张支持票。更糟糕的是,他们说“不”是我们希望它工作的方式。请注意,让支持票单独存在可能需要几个星期才能得到答复。
|
|
|
|
|
|
嗯,我以前没有填写过bug报告,在报告bug之前,我真的很想看看是否有其他人能看到这个问题。如果结果是我做错了什么,或者有些设定不正确,我仍然不会感到惊讶。顺便说一下,我看了我的优化,在1,所以我不认为是这样。
|
|
|
|
|
|
嗨,Don2,我认为“TimerBaseMsTimer=SYS_TMR_Callback.ic(1,1,TimerClockCallback);”不应该在APP_Initialize()中调用,它应该在APP_Tasks()中调用,因为定时器驱动程序打开并且系统定时参数初始化发生在SYS_TMR_Tasks()中。SYS_TMR_Tasks()只有在APP_Initialize()之后才会被调用,因此请尝试将回调周期地移动到APP_Tasks()。我希望这可以解决您的问题。
|
|
|
|
|
|
谢谢你的回复。我刚尝试过,程序仍然冻结。我认为现在还不是时候,但似乎正是打扰停止了工作。我想我会坚持NKurzman的建议。这似乎很好。
|
|
|
|
|
|
请您发布您的非工作项目和和声版本。和谐的定时器系统服务由几个大部件和谐使用。我很惊讶这引起了一个问题。
|
|
|
|
|
|
对不起,我已经没有代码的那部分了。我刚开始在V1.07的项目,它基本上只是一个USAT回声工作。然后我添加了等待,一切都停止了。大部分代码大约在一周前在第三篇文章中出现。我拔出了代码,并使用了像NKurzman建议的核心时钟。它工作了,我必须继续前进。我可能没有设置正确的东西,但是试图找出“帮助”文件、Wiki和可用的示例文件几乎是不可能的。看来事情是分散的,你必须继续寻找不同的来源,如拼图的碎片。我得到的大部分帮助来自这个论坛,只是简单的老黑客攻击。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
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 2.936296 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1174