cplusplus/queue.h文件BUG

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

  1. /*1 ~1 m; j  }+ e6 Z% y& Q
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
    / P; z$ P3 h& J% n$ X2 c
  3. *8 a8 o% m/ X" i/ u5 g
  4. * SPDX-License-Identifier: Apache-2.0
    ' F: d, F' J" I" I, }2 V% x" V
  5. *
    . `5 G0 h$ _8 m: a$ _3 h/ @
  6. * Change Logs:
    ! r- F( r2 W$ \4 s0 p
  7. * Date           Author       Notes
    & K5 y% d" C' r3 t5 z
  8. * 2016/10/1      Bernard      The first version6 O6 x; O3 F+ p$ m' t8 k
  9. */
    % C4 A0 g1 O6 z* g+ ~/ O

  10. + ~2 C- J# M0 f' ^1 ~/ K
  11. #pragma once' _' j, z4 w2 J* S, r' s

  12. 4 o  n# ?% t1 f* q/ B
  13. #include <stdint.h>3 K/ ?) {' c5 C8 O
  14. #include <string.h>
    - R6 F5 M. n% ~# M, t
  15. / L0 _, V# o& o  ^0 y( z
  16. #include <rtthread.h>
    8 `7 c3 g; @" \4 }# W4 w- r

  17. . F! u; P( V1 [  F) W/ P
  18. namespace rtthread {
    1 x0 f- i, V! ~5 O) R

  19. ! F. L, e) {* n' d- X
  20. /**
    3 A. v; q9 ^7 _- b
  21. * The Queue class allow to control, send, receive, or wait for messages.$ ?% N  b" J9 ~0 z
  22. * A message can be a integer or pointer value  to a certain type T that is send# @3 w7 I- J& @5 }0 I& q" I
  23. * to a thread or interrupt service routine.
    ) S( k' C' r/ m, C
  24. * @param  T         data type of a single message element.$ `5 m2 E* t4 a( o5 d: G3 d" o
  25. * @param  queue_sz  maximum number of messages in queue.
    + R2 e5 Y* _1 P. ]) s5 e
  26. */
    ' ]0 I  Y* Y+ o: A  }* c0 {7 A6 L
  27. template<typename T, uint32_t queue_sz>
    8 t* q! ?0 V' N* G" J
  28. class Queue
    $ x5 _, d# @, ~1 H6 ^+ Z4 |! @+ E  t
  29. {. R( j4 ^; L5 F$ x% R& \
  30. public:
    2 [& \. y1 w% x. o
  31.     /** Create and initialise a message Queue. */2 H$ `2 w# n4 [# {/ k: Q; Y! K
  32.     Queue()2 P( [1 ^# A; I! v  o0 M
  33.     {  \: V+ Q) F. |1 h
  34.         rt_mq_init(&mID, "mq", mPool, sizeof(T), sizeof(mPool), RT_IPC_FLAG_FIFO);
    4 m+ W; R4 ^; _" x! P$ d
  35.     };
    5 D+ r! C; \/ q$ a- G/ B$ D

  36. / M$ z. i7 m0 u  T: |8 h
  37.     ~Queue()
    4 q& y5 r8 r' X3 d6 \" L0 ^# T& Y
  38.     {' E3 a* U" {& N: I' o# S1 R
  39.         rt_mq_detach(&mID);+ u" }# f$ X" ~. s' Z* {/ p
  40.     };7 h- A; S- m. S

  41. 5 ~; j( O7 C- o" ^3 N1 p5 j
  42.     /** Put a message in a Queue.
    ( `' p8 w/ i+ d6 ?
  43.       @param   data      message pointer.9 p7 B4 r. Y9 J" v$ o
  44.       @param   millisec  timeout value or 0 in case of no time-out. (default: 0)5 U; E% k; R9 ]3 l
  45.       @return  status code that indicates the execution status of the function.
    $ t  B/ N6 y- ?$ |2 K$ [- Z: A
  46.     */3 O8 K( j& y0 J5 {0 q7 x0 P1 S- x
  47.     rt_err_t put(T& data, int32_t millisec = 0)
    " O% T. @6 P' M6 J: J
  48.     {  h) Z5 Q4 X' _2 A& t5 \" }
  49.         return rt_mq_send(&mID, &data, sizeof(data));# |% S& y; e3 U! Z5 F! w
  50.     }1 z9 t# Z5 I* T) O- ?
  51. 7 @1 _3 M0 b3 w) D3 x' [8 B
  52.     /** Get a message or Wait for a message from a Queue.
    6 \* z: j* c5 \- E
  53.       @param   millisec  timeout value or 0 in case of no time-out. (default: osWaitForever).& l; E# T  Q$ {7 k" A  t9 k# K  v$ E
  54.       @return  bool .1 F' @' o  ^% n' @5 e: k$ Z) z
  55.     */
    * ?3 y. }3 N1 Q4 F) h
  56.     bool get(T& data, int32_t millisec = WAIT_FOREVER)) W  F* g, u$ z5 M
  57.     {
    " o0 |. Q0 g. w3 [3 D  W+ j
  58.         rt_int32_t tick;# Z  f$ v! V% ]

  59. 4 O6 H/ @# @+ |9 S4 [. x: K1 ]/ W1 z
  60.         if (millisec < 0)
    $ m) n, \: s9 ?6 x! A) E
  61.             tick = -1;
    2 c- a2 a1 e0 \% B! m: m
  62.         else) q5 a# o% J7 \# k! [
  63.             tick = rt_tick_from_millisecond(millisec);
    6 c* C9 Z; ^9 H0 S) A! M
  64. 4 W1 ~$ ?3 O$ m& }
  65.         return rt_mq_recv(&mID, &data, sizeof(data), tick) == RT_EOK;" H( N/ P: `2 \  K0 ~" T+ J
  66.     }
    6 z; S2 x  M# w
  67. ( o# [# I, C& F
  68. private:6 \3 h" X7 g  d5 K: f( b' S1 D
  69.     struct rt_messagequeue mID;  x) f1 }5 g  C7 ^( T
  70. 8 J8 p. U# j  D: f. ~
  71.     char mPool[(sizeof(struct rt_messagequeue) + sizeof(T)) * queue_sz];9 ^  _" t( }4 x+ Y' z) t, X: j
  72. };0 ^% p; v: q9 J
  73. * Z$ e0 d" U- e: H2 a! \# s; @
  74. }
复制代码
以上是原文件。最后一句mPool的尺寸计算明显有问题,导致实际尺寸很大,严重浪费RAM(100个消息需要7KB左右),改成下面就好了:
  1. char mPool[(sizeof(T)+4) * queue_sz];
复制代码
另外我感觉软件定时器使用独立线程可能有BUG,因为我关闭这一个选项我的程序正常,开启就跑飞,调试显示的英文意思好像是线程混乱什么的。; r( a& {! z% y- Y/ l9 d: x* R2 T
- P- Y! k  n0 S' A0 i7 o
% h' R  ?' m) |/ b8 Z* z
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-9-30 14:37:43 | 显示全部楼层
Queue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了
使用道具 举报 回复
发表于 2019-10-9 10:58:15 | 显示全部楼层
tyustli 发表于 2019-9-30 14:37
6 @2 E& M  i- Z4 qQueue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了

3 `$ d; E3 n. @0 j0 C# P不会,没有在github上提交过代码。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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