[应用相关]

ucos下除了时钟节拍外,如何设置另一个10K Hz定时器中断

[复制链接]
8565|15
手机看帖
扫描二维码
随时随地手机跟帖
car_software|  楼主 | 2012-11-15 16:15 | 显示全部楼层 |阅读模式
时钟节拍目前设的是200, 即5ms产生一次中断给OS用; 功能都是正常的;
因需求,需另外一个10K左右的定时器中断,在此中断中做定时采样,采样时间很短,没占几个机器周期;

在裸机下,此功能已实现, 
但移植到UCOS上,一直没有搞定:
这个10K的定时器中断 不知道是不是会被 时钟节拍目打断一样,开机都不正常;
除非将10K定时频率,改小, 改小到20Hz左右,才能开机。
yanjinbin| | 2012-11-15 18:45 | 显示全部楼层
如果你使用的是默认优先级,你需要重新配置优先级,想要快速见效,你直接设置为不抢占优先级。

使用特权

评论回复
car_software|  楼主 | 2012-11-16 09:10 | 显示全部楼层
2# yanjinbin
请教 yanjinbin: 你是指重新分配时钟节拍中断(200Hz)的优先级,还是指那个10KHz的定时器中断,谢谢!   
化先级在USOC中有,  我用的是STM32,STM32本身也可以设置中断优先级,时钟节拍中断用的是SysTicker, 10KHz是用Tmer3 ,两者是完全独立的

使用特权

评论回复
香如故| | 2012-11-16 11:12 | 显示全部楼层
10KHz肯定可以的,我用48k脉冲跑步进电机驱动都没问题,也是ucos的,而且还是几个步进电机都一起跑。定时采样你可以做个任务啊,任务里搞个邮箱等待信号,中断一到发个邮箱这个任务就采样不就可以了。10k肯定没问题。

使用特权

评论回复
car_software|  楼主 | 2012-11-16 14:12 | 显示全部楼层
请问是不是地那个10KHz的定时器中断里发邮箱, 另一个任务接收到邮箱再做处理; 
问题是这样的话:OS的节拍还是会被10KHz中断打断,打断很频繁, 那每100US(10kHZ)又要发生一次任务调度, 因为OS退出中断会发生一次任务 调度;
如何让这个10KHz定时器中断不影响UCOS的节拍:

void TIM5_IRQHandler(void)   //TIM5中断,10Khz ->10000Hz
{
        OSIntEnter();                //进入中断
       
        ..................
        //do samething ...
        .................
       
        OSIntExit();    //触发任务切换软中断
}  

使用特权

评论回复
yanjinbin| | 2012-11-16 18:19 | 显示全部楼层
如果你使用的是默认优先级,你需要重新配置优先级,想要快速见效,你直接设置为不抢占优先级。
yanjinbin 发表于 2012-11-15 18:45
抱歉,我没说清楚。
我想说的是中断优先级配置。

使用特权

评论回复
car_software|  楼主 | 2012-11-17 12:04 | 显示全部楼层
谢谢各位,基本上知道该怎么做了: 
1. 将这个10KHz的定时器中断,其优先级设为最高;  (采样用:中断频率很高:10KHz)
2. 将UCOS用的那个时钟节拍定时器中断,优先级设低一点;  (OS用:中断频率很低:200Hz)
这样就能保证: 采样用的10KHz中断 不会被 OS的节拍打断;

但还存在一个问题:
UCOS中很多地方都会用到关中断的语句: OS_ENTER_CRITICAL(); //进入临界区(关中断) ;
这样的话,那个采样用的中断也被关掉了,直到执行了OS_EXIT_CRITICAL()之后;
10KHz的定时采样就会不准,会丢失一些采样点;
这问题能解决不,目前没想到好方法

使用特权

评论回复
yanjinbin| | 2012-11-19 08:53 | 显示全部楼层
谢谢各位,基本上知道该怎么做了: 
1. 将这个10KHz的定时器中断,其优先级设为最高;  (采样用:中断频率很高:10KHz)
2. 将UCOS用的那个时钟节拍定时器中断,优先级设低一点;  (OS用:中断频率很低 ...
car_software 发表于 2012-11-17 12:04
这样问题,可以考虑采样使用DMA的方式。

使用特权

评论回复
car_software|  楼主 | 2012-11-19 10:41 | 显示全部楼层
在amobbs论坛中,有人指点这样做:
OS_ENTER_CRITICAL是一个宏啊,你可以自己改的!
把它改成提升当前中断级别到高于系统时基中断但低于10K定时器中断的级别即可(也就是让OS_ENTER_CRITICAL不能屏蔽高于某一级别的中断)
但要注意,在不能被OS_ENTER_CRITICAL屏蔽的中断里面,也不可调用任何可能导致任务切换的函数!切记!
这些高级中断与系统其他部分之间只可通过全局变量交换数据,不可使用任何OS机制(比如信号量等等。。。)
其实相当于这些高级的中断完全脱离了操作系统的管理.



我按以上方法试过: 修改OS_ENTER_CRITICAL宏和OS_ENTER_CRITICAL宏; 只关部份中断,非全部;即禁止或使能除了10KHz的定时器中断(采样用) 以外的所有中断;
这样10KHz采样中断是很准了,

但问题是: 这个10KHz的采样中断,似乎太过频繁了,会打断OS的时钟节拍(200Hz);
我是用一个LED亮灭来简单测试的, 从亮灭的情况来看,只要开了10KHz中断,亮灭慢了三倍时间以上;
好像OS被10KHz给托慢了;

由于设计需要,这个10KHz的采样是必须的,裸机程序早已搞定,难道OS真的不好搞定一些实时性高的应用;
注:10KHz的定时器中断中,代码很简单,就给一变量复职,一两条指令而已,不占用多少时间的;

使用特权

评论回复
i55| | 2012-11-19 13:42 | 显示全部楼层
如果是stm32的话,systick设为100us完全没有压力。
不要用mdk调试ucos代码,要用iar来调试,死机一般是任务栈崩溃,用iar看cpu负载率,任务栈使用非常方便,mdk根本不行。

使用特权

评论回复
zzfei90| | 2013-9-26 17:37 | 显示全部楼层
10K的频率,还是有可能影响ucos的节拍的,既然你说你只是在中断中赋几个值而已,为什么不使用DMA呢?很方便的啊,完全不用你中断处理,你完全可以不用理会了

使用特权

评论回复
trumpxp| | 2013-9-26 21:11 | 显示全部楼层
不是很了解这一块的说   楼主   帮你顶一个   看看别人的意见吧

使用特权

评论回复
海吃哈哈| | 2013-11-20 14:23 | 显示全部楼层
stm32的定时器中断怎样比滴答定时器的中断高这个怎么配置啊。求楼主指导我下啊

使用特权

评论回复
xiphixiongfei| | 2016-3-25 17:20 | 显示全部楼层
香如故 发表于 2012-11-16 11:12
10KHz肯定可以的,我用48k脉冲跑步进电机驱动都没问题,也是ucos的,而且还是几个步进电机都一起跑。定时采 ...

怎么实现,可以细说吗?谢谢

使用特权

评论回复
mark0668| | 2016-3-25 19:29 | 显示全部楼层
感谢分享,学习了

使用特权

评论回复
haojie5588| | 2018-5-3 10:37 | 显示全部楼层
*                              OS TICK INTERRUPT PRIORITY CONFIGURATION
*
* Note(s) : (1) For systems that don't need any high, real-time priority interrupts; the tick interrupt
*               should be configured as the highest priority interrupt but won't adversely affect system
*               operations.
*
*           (2) For systems that need one or more high, real-time interrupts; these should be configured
*               higher than the tick interrupt which MAY delay execution of the tick interrupt.
*
*               (a) If the higher priority interrupts do NOT continually consume CPU cycles but only
*                   occasionally delay tick interrupts, then the real-time interrupts can successfully
*                   handle their intermittent/periodic events with the system not losing tick interrupts
*                   but only increasing the jitter.
*
*               (b) If the higher priority interrupts consume enough CPU cycles to continually delay the
*                   tick interrupt, then the CPU/system is most likely over-burdened & can't be expected
*                   to handle all its interrupts/tasks. The system time reference gets compromised as a
*                   result of losing tick interrupts.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

44

帖子

0

粉丝