cplusplus/queue.h文件BUG

2019-9-29 15:22 [复制链接] 2 245

  1. /*
    : w6 o$ X3 i7 d
  2. * Copyright (c) 2006-2018, RT-Thread Development Team5 T( z* o, d+ @8 S' i
  3. *
      ^2 i3 x. ]4 H+ Q3 V! E$ u
  4. * SPDX-License-Identifier: Apache-2.0
    8 h4 {: w9 ]  z: W& }  u5 q
  5. *2 w, e9 l2 s9 Z, |" ]4 X
  6. * Change Logs:
    . ^) d3 I- B4 O
  7. * Date           Author       Notes0 L/ l+ @4 J; J1 t
  8. * 2016/10/1      Bernard      The first version
    * v2 z/ X& n. d
  9. */; P% }* b% [% z* ]
  10. : s+ \6 M/ @9 c! u  b; s  @4 ]; M
  11. #pragma once! d8 M! ?% R1 f/ k: j) j: u$ C

  12. : q( b, i- s" B7 y
  13. #include <stdint.h>4 F0 n, L1 f+ n9 u) z
  14. #include <string.h>
    / `* W& F2 I. E! h# l
  15. 1 f% x# f8 D. \; u0 M9 A  t
  16. #include <rtthread.h>
    9 U8 n; e6 m% J3 m5 ?; m8 J

  17. ) m  h0 j; O9 W% s: ?. T
  18. namespace rtthread {# @  I- v+ B" {* F: i7 b& J4 R, Y
  19. 6 `4 W4 I$ F3 a! B
  20. /**
    & \) @+ c- P0 f0 z; C% S( O& z
  21. * The Queue class allow to control, send, receive, or wait for messages.
      A! w9 T& Q+ `& a# D7 u. G- ]
  22. * A message can be a integer or pointer value  to a certain type T that is send
    * \  z) I9 k* Q7 y8 r# i* o' a
  23. * to a thread or interrupt service routine.; U: s. G9 K2 r* ~. |
  24. * @param  T         data type of a single message element.5 w' }' K' b) m& z4 y
  25. * @param  queue_sz  maximum number of messages in queue.8 T9 P/ W: C/ K- W/ ]% b
  26. */
    3 I. e' U8 J- v. Z: D6 P1 i* _+ O5 h
  27. template<typename T, uint32_t queue_sz>
    " \: O  |& L1 p9 \/ a! q
  28. class Queue
    ) J; f6 y+ \7 o2 F. Y
  29. {* s, `1 D, L( v5 W
  30. public:
    : I% o# n& O7 _8 n: B
  31.     /** Create and initialise a message Queue. */1 `+ w% ?- a# `- z7 B# r/ Z
  32.     Queue()5 W4 b. s, |! \& N2 e" V" v
  33.     {# @3 t7 A) O6 |9 M% B5 [  C9 F
  34.         rt_mq_init(&mID, "mq", mPool, sizeof(T), sizeof(mPool), RT_IPC_FLAG_FIFO);  j- j9 e/ B; @* ~- t* m( y; C( X
  35.     };9 m, x* u, G2 R' m9 R
  36. , s7 D3 {# V, m* V
  37.     ~Queue()8 P* E+ Z0 U, ~7 h) T3 c
  38.     {% i* N& H: C; b
  39.         rt_mq_detach(&mID);- J$ s* ~# J9 n2 |1 a4 B
  40.     };" Q. Z. t( l. L

  41. : f/ I  }! |( K) h# \! I5 g
  42.     /** Put a message in a Queue.: D: S5 r8 X0 q) O
  43.       @param   data      message pointer.; b/ X( ^5 m' i+ i: d5 ^( ^
  44.       @param   millisec  timeout value or 0 in case of no time-out. (default: 0)# t- i+ F: K: _! o: l: y
  45.       @return  status code that indicates the execution status of the function.
    ! f; j" v6 @& s  M( v
  46.     */- a# i+ G( N$ h
  47.     rt_err_t put(T& data, int32_t millisec = 0)# ?% y7 }: U# Z: l
  48.     {
    # f5 ~5 C# T- p( b  g/ E% n
  49.         return rt_mq_send(&mID, &data, sizeof(data));. {8 e* w- {: q) x. ^8 U
  50.     }
    1 m% H% h4 o+ z6 W

  51. 2 p  [% C( P2 W# ^& h
  52.     /** Get a message or Wait for a message from a Queue.
    8 ~* g* ?0 y& Y  f! I
  53.       @param   millisec  timeout value or 0 in case of no time-out. (default: osWaitForever).
    6 g3 U: p4 j- ^% v7 t6 ?
  54.       @return  bool .
    ! [1 x% X3 Z# [2 f  q
  55.     */3 W) Y5 D  W2 G) g2 Y# ?9 b7 D: B' i
  56.     bool get(T& data, int32_t millisec = WAIT_FOREVER)
    8 ^) Z/ w- E; i: m" b$ t
  57.     {' v4 s* k5 c8 v9 H9 f
  58.         rt_int32_t tick;. a+ B! B( Y  z& J) n- G
  59. * H  t6 d8 O$ z8 }/ k( w
  60.         if (millisec < 0)4 Y( A+ j6 n. L
  61.             tick = -1;
      L; t/ c# ?2 |( }; d
  62.         else6 S$ n1 E6 S* g5 G& C
  63.             tick = rt_tick_from_millisecond(millisec);
    8 Q+ Z1 N  F8 g0 E0 K8 J

  64. $ E& I* ?3 m9 g5 i5 d
  65.         return rt_mq_recv(&mID, &data, sizeof(data), tick) == RT_EOK;5 Q% o4 `+ d& c8 g
  66.     }
    ! H. z8 }6 R7 z% I2 r  V+ a

  67. ) ?0 ?- F! w4 Q* c9 ~  ?
  68. private:' A; q  g6 L( W( z) ^3 k" K
  69.     struct rt_messagequeue mID;
    , M* g% }& D/ ^% a" c" P

  70.   p! l4 w* C! u. a( _
  71.     char mPool[(sizeof(struct rt_messagequeue) + sizeof(T)) * queue_sz];
    4 z; p; V: J3 ^" t3 I8 n
  72. };9 R: ~  ^3 }' J& d
  73. 2 X) E& v8 P% J3 O( a
  74. }
复制代码
以上是原文件。最后一句mPool的尺寸计算明显有问题,导致实际尺寸很大,严重浪费RAM(100个消息需要7KB左右),改成下面就好了:
  1. char mPool[(sizeof(T)+4) * queue_sz];
复制代码
另外我感觉软件定时器使用独立线程可能有BUG,因为我关闭这一个选项我的程序正常,开启就跑飞,调试显示的英文意思好像是线程混乱什么的。
" q2 T) [: L& y' {- A
- j0 X/ q& m6 q4 ~' E- ]- S3 B3 n
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-9-30 14:37:43 | 显示全部楼层
Queue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了
使用道具 举报 回复
发表于 2019-10-9 10:58:15 | 显示全部楼层
tyustli 发表于 2019-9-30 14:37
9 {8 t) P& E* \8 ?Queue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了

" C9 y+ P* G! t$ G不会,没有在github上提交过代码。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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