fantasy007 发表于 2011-9-23 14:27:09

【请教】RTT中的定时器有数量限制吗?

如题

最近在使用定时器回调时,程序经常跑飞,一去回调就不知道跑到哪去,初步怀疑可能定时器开太多了。。

所以,请教一下,RTT中的定时器有数量限制吗? 如果有,在哪里定义?

ffxz 发表于 2011-9-23 14:59:54

没有数量限制,都是挂链表的。你用的哪个版本?建议用0.4.0,这个分支对于定位问题会更容易。

fantasy007 发表于 2011-9-23 15:11:38

多谢老大的回复,,刚才也仔细看了一下RTT教程,说软定时器是没有数量限制的。但是我看到定时器的代码中,有一个链表,链表中又有一个事件定义,而这个事件应该是有限制的(还没详细看代码,个人理解),那是不是意味着我的整个系统中所定义的事件就有一个限制了。
    比如信号量,互斥量,邮箱、消息、线程等等,都应该算是一个事件,如果这样的话,在一个固定(或限定)的事件里,我就不能多定义个中的事件??
    我现在使用的版本就是4.0,因为外括了内存,定时器时已经用定了十多二十了个,我下断点时,定时器能够进行函数的回调,但是一进入回调,整个RTT就陷入了死循环。

aozima 发表于 2011-9-23 15:29:05

定时器里面做了什么? 定时器里面的程序应该按ISR的要求写.
可以把定时器回调置空测试一下:
void time_out(void)
{
//
//
}

>>整个RTT就陷入了死循环。
在哪里循环? 还是因为应用程序有死循环回不去了? 或是进入了异常?

ffxz 发表于 2011-9-23 15:48:36

如果是0.4.0版本,把RT_DEBUG选项打开。

定时器,不过是软、“硬”都没有数量限制。“硬”定时器是在ISR环境中调用的,所以一定要小心再小心,这块也不能去下断点。

fantasy007 发表于 2011-9-23 16:08:08

刚刚试过,将定时器的回调置空了。。程序正常能运行;

有可能是我回调里的函数出了问题,因为我启动定时器前,调用了一个函数,而这个函数需要获取一个互斥量;函数调用完后,就会释放这个互斥量;再启动定时器;定时器回调时,又会调用这个函数,进行互斥量的获取与释放;然后RTT就陷入不停的调度中。一个假 死的循环

我的程序大致是这样的:

void timer_callback(void){
    fun2();//其它函数的调用;
    functioncall();//包含互斥量函数的调用。当程序跑到这里时,整个RTT就会陷入不停的调度;
}

void fun1(void){
    fun3();//其它函数的调用
    functioncall1();//这个函数包含了获取与释放互斥量 1,调用完,即释放互斥量
   
    rt_timer_init(....,timer_callback,...);
    rt_timer_start();


初步估计有可能是我的互斥量获取不到,有可能导致假死,但是,我的函数调用完后,就释放了该互斥量;搞不明白,,我能够确定当进行回调的时候,互斥量肯定是空闲的。就算是不空闲的,也不应该等1、2分钟,这个互斥量还释放不出来。。

fantasy007 发表于 2011-9-23 16:23:03

回复【4楼】ffxz
如果是0.4.0版本,把rt_debug选项打开。
定时器,不过是软、“硬”都没有数量限制。“硬”定时器是在isr环境中调用的,所以一定要小心再小心,这块也不能去下断点。
-----------------------------------------------------------------------

当硬件的定时器中的ISR 是肯定要小心再小心;不过 》“硬”都没有数量限制。这个说法就不是很同意了。我觉得,硬件资源就这多,不可能无限制的给你使用硬件的定时器,只不过我们在使用的定时器中,通常都是利用所需要定时事件的最小值,进行变量的叠加而已,当变量叠加到特定的时间,就进入相应的函数处理,给人的感觉就好像有多个定时器一样,但实际上的物理定时器有限制的,这就要求我们在程序设计时,要合理的利用定时器了,至于如何合理,就不是一时半会能说明白的啦。。呵呵。。说了一堆废话,,大家别喷,。。

aozima 发表于 2011-9-23 16:33:18

>>初步估计有可能是我的互斥量获取不到,有可能导致假死
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5019952
页: [1]
查看完整版本: 【请教】RTT中的定时器有数量限制吗?