事件集event使用初体验

2020-3-25 22:53 [复制链接] 2 83


1 F7 h( e+ `2 U+ S

这个帖子是我在实际使用rtt的事件集的实际体验,也有可能是我在使用过程中有不恰当的地方,希望大家不吝赐教。

. Z5 C% A  V$ g4 l3 ]/ g/ v

尽量简要的描述一下使用情形。被控对象为一带有码盘的电机,码盘产生的脉冲数将使用定时器计数。另外,还有一个光电传感器,用于检测电机拖动的断续物品。电机停止的条件是:定时器记录的脉冲数超过某一阈值或者光电传感器检测到物品。

/ S8 n( h' I6 f& k

这不正是典型的事件集的应用场景吗?一个事件从定时器中断发送,另一个事件从外部中断发送,然后电机控制的线程里接收事件用RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR参数。只要两个事件有一个发生,阻塞解除,马上停止电机。

5 r- C7 Y& F& ]7 N" e6 F. V; v

然而,从实际却出状况了。会出现连续多个物品通过光电传感器,但电机不停止的情况。甚至会出现规律性的,一个物品经过正常,下一次就连续多个物品通过电机才能停止。

, Y' @8 v/ \' ^* r. e" ?7 z/ @/ [

经过两天的调试,我最终怀疑rt_event_send函数是否执行时间过长。于是使用信号量替换事件集。暂时不考虑脉冲数的问题。只要光电传感器检测到物品,在中断中释放信号量,电机控制线程则会解除阻塞,停止电机。这么一来,还真就能稳定的在每一个物品经过时,停止电机。

; L$ y* o' M# C$ u3 I; A

暂时的解决方案是用信号量,附带一个全局变量,用于标记是哪个中断释放的信号量,便于在程序处理时予以区分。

3 r' Y, m; q# s  ^- W+ l; a7 b

刚刚我大概浏览了一下rt_event_send的代码量远大于rt_sem_release,不知道是否有大神测试过发送一个事件需要多长时间。

& U& ]1 e1 x. m3 g, {

目前,使用信号量来解决上述需求,我认为是存在问题的,万一外部中断多触发了几次呢?那阻塞的线程就能多执行几次了。rtt是否有提供二值信号量呢?

2 L4 o( ?: t, _, ^$ Y' \2 u' C2 u$ ?

接下来,我打算测试如果使用邮箱,是否能够满足当前的需求,毕竟用邮箱可以省去一个全局变量。但是用邮箱也还是会和信号量一样有线程多次被解除阻塞的问题。

: R9 n8 l2 V. d- \

请问各位朋友,如果遇到这个问题的是您,您会用什么样的方式来解决这些问题呢?

" ^! Z' |, s' y+ D3 c3 n3 [( I
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2020-3-26 15:24:00 | 显示全部楼层
) p5 T* R+ d: _  k8 v3 Q
突然想起会不会是因为我程序中有多个事件集的原因。于是我又把所有的事件合并到一个事件集。仍然会出现连续过几个物品电机才停的情况。
使用道具 举报 回复
发表于 5 天前 | 显示全部楼层
本帖最后由 robson 于 2020-3-31 20:39 编辑 - q$ X0 X; Q0 t, T4 N/ ~" P: F2 F- [

7 b  h' v2 J8 \今天实际测试了一下事件集的响应速度。
. C  g. N/ w- D' y: B先交代一下测试的环境:STM32F103VET6,使用外部8M晶振倍频到72M。RT-Thread nano 3.1.3,RT-Thread Studio 1.0.4,OS Tick:500Hz6 @" `. R8 o2 z: g) h$ [
测试方法是使用TIM2,9分频后得到8M频率用来计时。
: J- H7 a" b1 ~& x+ j" b所有计时都是测量三次,将3次测量的时间求平均值的结果。3 W9 n! l  }9 q9 s; j" l
测量数据仅供参考。6 t, o% r2 t; S! J

7 j/ }$ V" u' }. v
  o. y& y& u; D: j) b! x4 [+ V

测试1:执行rt_event_send()的时间:23.5us
: f, Y: J% v' n' w4 I1 I  t测试2:线程1在执行rt_event_send()之前开始计时,到线程2中rt_event_recv()之后停止计时。2个线程优先级相同。260.75us 2 Q2 \% L* V. U1 x 测试3:在测试2的基础上,执行完rt_event_send()后,立即使用rt_sem_take()阻塞。 208.75us 8 z7 l) V3 Z- z/ R7 u* W 测试4:在测试3基础上,线程2优先级更高。144.75us5 x7 D2 |0 v1 a# o: J$ d 测试5:TIM3设定500ms中断一次,在发送事件前开始计时,到被阻塞线程接受到线程后,计时停止。157.25us
3 ?2 g/ H9 `8 S$ m& K8 V测试6:在测试5基础上,新增加一个与线程1相同优先级仅执行rt_thread_mdelay(10)的线程。157.75us

& S# A3 \) a4 Y; p: c) P
1 ^& }5 T6 O- L' V9 G) m& |: v
6 ?! X0 G! i  H& F之前在论坛里头看到有朋友说从中断产生,到线程阻塞接触仅需10余us,实测数据差距还是挺大的。当前测试总共都只有3个线程,从测试6来看,线程增多,这个切换时间可能更长。, ?! f6 J; w5 i2 b+ Y3 u: h
$ k. g- y+ R5 x1 \3 i/ _: A6 r5 a: i
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 7 主题
  2. 193 帖子
  3. 193 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表