关于线程对象的继承问题

发表在 内核学习营2019-6-10 21:26 [复制链接] 6 255

根据官方书籍所述,内存池、thread、ipc、定时器、设备这几个对象,都是继承于object对象而来,为什么在定义数据结构的时候,thread对象要将object成员变量重写,而不像timer对象那样,直接对object对象继承呢?这其中是有什么原因吗?
9 N+ v  a* P8 n0 `3 zobject对象:& N( u& A8 f1 r) A( v( o+ F0 \
  1. struct rt_object5 S+ x- r* H& ^$ V' l+ w
  2. {* w) F, d2 R0 n$ x' m  ~
  3.     char       name[RT_NAME_MAX];                       /**< name of kernel object */
    2 R% U) U( R! D! c& v/ f
  4.     rt_uint8_t type;                                    /**< type of kernel object */* C; J( g* b9 t; L& F- v" C" s
  5.     rt_uint8_t flag;                                    /**< flag of kernel object */1 h) x! `# z7 `# r

  6. & Y/ x' s* W" A0 ~( r
  7. #ifdef RT_USING_MODULE( ~# w1 Y$ z: o9 u* m& k
  8.     void      *module_id;                               /**< id of application module */
    ' |3 W, c9 f7 U, L5 J! ?* D7 d
  9. #endif
    1 F. T8 ^* M  }+ r
  10.     rt_list_t  list;                                    /**< list node of kernel object */, b9 y  |8 e- R1 S" L/ E
  11. };
    5 E- }# J- U1 U; K+ A4 W
  12. typedef struct rt_object *rt_object_t;                  /**< Type for kernel objects. */
复制代码

) z9 K9 b2 N' Q: G
8 C- f3 T% A9 m
: g- U8 y. d0 ~* t5 K/ b0 Tthread对象:
( D9 @" R# H. ?" O
9 Z6 Y9 A' d0 ]& C" t* ?
  1. struct rt_thread
    ! s* M1 t) s+ ^
  2. {" {6 O# j6 h9 e( T
  3.     /* rt object */% u) P6 N% J" v! X1 t
  4.     char        name[RT_NAME_MAX];                      /**< the name of thread */
    2 K  B2 R6 \9 S
  5.     rt_uint8_t  type;                                   /**< type of object */: B: }5 c9 Q& W$ o( E# A
  6.     rt_uint8_t  flags;                                  /**< thread's flags */
    , n! y4 u9 v+ N+ K
  7. 7 V) g- M+ A/ n3 \/ n  K6 e
  8. #ifdef RT_USING_MODULE
    4 G9 \9 [2 T7 w4 `
  9.     void       *module_id;                              /**< id of application module */. V( L, G$ }6 v
  10. #endif
    . N( E5 |5 i7 _5 [, L& ^
  11. ; Q0 G; G8 ]5 A4 v6 W
  12.     rt_list_t   list;                                   /**< the object list */
    ! z6 I& G+ b8 r2 }
  13.     rt_list_t   tlist;                                  /**< the thread list */1 G+ H* B" C& s, `* F

  14. ' U0 M, U6 |& N9 k5 U; w& t
  15.     /* stack point and entry */
    0 P6 i2 h# d6 z1 _! t8 ]
  16.     void       *sp;                                     /**< stack point */
    % R5 T  O' ~9 z( L& d# Y
  17.     void       *entry;                                  /**< entry */, C. P2 J8 u8 C$ m* k) R
  18.     void       *parameter;                              /**< parameter */* \7 ]5 i8 S! k7 m
  19.     void       *stack_addr;                             /**< stack address */, _7 P1 R6 c: ~1 [
  20.     rt_uint32_t stack_size;                             /**< stack size */* U% d+ _+ j$ u- ?3 ~$ w* l

  21. & \8 [: x& u0 C4 l' p" j9 f
  22.     /* error code */
    ; o1 r$ M, E- A+ W
  23.     rt_err_t    error;                                  /**< error code */( O# l% {2 r0 `1 Q0 [

  24. - [2 Y4 f6 }6 r4 X4 n! l
  25.     rt_uint8_t  stat;                                   /**< thread status */! _" \$ h$ Q1 B9 ~" M# O" w6 M: B  [
  26. . i2 Y; c) x, m$ E' \9 ]' x: o
  27.     /* priority */6 M. G$ W/ f# `8 x$ T
  28.     rt_uint8_t  current_priority;                       /**< current priority */
      {6 a3 V4 B/ z9 B  ]7 F: r* W8 B7 l
  29.     rt_uint8_t  init_priority;                          /**< initialized priority */+ D8 h* D3 U& d/ b! ~: b& q. d6 A; R
  30. #if RT_THREAD_PRIORITY_MAX > 329 k. u, V2 m1 L, b# i. ~* e0 u
  31.     rt_uint8_t  number;
    $ l( |  u- v' ?0 Y& J
  32.     rt_uint8_t  high_mask;
    : ?" l+ G! e9 c( m: r( J$ g
  33. #endif0 q4 G6 [9 O. ~3 C) ?
  34.     rt_uint32_t number_mask;. p' d/ [, b/ V; z8 {% o
  35. ! g( B( ^  d; L7 U9 P
  36. #if defined(RT_USING_EVENT)& u) N" F4 l" B) h: @/ F
  37.     /* thread event */9 l1 S8 x0 V/ d% C3 X+ U
  38.     rt_uint32_t event_set;
    - `4 B( S* a  M1 ^
  39.     rt_uint8_t  event_info;# A% P5 n. {3 K: J
  40. #endif+ Y$ M$ k/ \/ w' T# ]! V% v5 k
  41. / \* E  b2 b5 Y9 u7 j) K
  42. #if defined(RT_USING_SIGNALS)9 e, ^! g4 J, d
  43.     rt_sigset_t     sig_pending;                        /**< the pending signals */8 H7 `6 b& B: T1 o- }
  44.     rt_sigset_t     sig_mask;                           /**< the mask bits of signal */8 _! u' U& |& u/ I. p
  45. 0 j' M4 L$ q& ^8 h9 @2 V  L
  46.     void            *sig_ret;                           /**< the return stack pointer from signal */
    / B; g: J+ F" T) ~
  47.     rt_sighandler_t *sig_vectors;                       /**< vectors of signal handler */
    # D5 _% p# ^& g5 q3 L# H& E
  48.     void            *si_list;                           /**< the signal infor list */
    2 W% C% i2 ~' K
  49. #endif) w$ }9 u& A0 N

  50. , |* `% ]. I2 d" A7 _9 z0 a
  51.     rt_ubase_t  init_tick;                              /**< thread's initialized tick */9 L  u. Q9 i  E; w; l
  52.     rt_ubase_t  remaining_tick;                         /**< remaining tick */5 W0 y6 s, k, v2 c
  53. # a. B* ]/ }8 |' g3 x5 T" h! f
  54.     struct rt_timer thread_timer;                       /**< built-in thread timer *// o! g* d' L$ Q: `; x
  55. 3 G; j/ s" E, J. z8 U/ |
  56.     void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit */
    6 f, Y. s9 c; X. I9 h: z7 N
  57. ! t$ E9 L% P. ^& J) T5 y# Y
  58.     rt_uint32_t user_data;                              /**< private user data beyond this thread */
      X3 E- l6 y5 f& |' _( ]
  59. };& S* h8 h- G4 q1 s
  60. typedef struct rt_thread *rt_thread_t;
复制代码
1 O& g" T6 ~/ x
7 s! A: f- C# X3 n% |
6 _0 W$ f- f# \  x' U1 p, Q5 ^
timer对象:! l' ^( T8 w; O/ Y5 m0 m/ W
  1. struct rt_timer
    ) n' l! x, d$ ^3 T) a! p
  2. {
    / ~' c. z/ e/ Z  k
  3.     struct rt_object parent;                            /**< inherit from rt_object */
    8 o- }2 g; K% j+ M! ~4 F7 b3 F

  4. ; v' p1 n# ]# V. l$ ?) }8 q$ R
  5.     rt_list_t        row[RT_TIMER_SKIP_LIST_LEVEL];
    9 v) e, \  L; A/ m- [) q8 c
  6. # @2 r8 @; L' E$ f6 Q
  7.     void (*timeout_func)(void *parameter);              /**< timeout function */) K6 Y: J: c. n  ^+ B
  8.     void            *parameter;                         /**< timeout function's parameter */' e4 G* k! n0 r, D& q4 b/ G
  9. " L& E: Q/ i* i. Q
  10.     rt_tick_t        init_tick;                         /**< timer timeout tick */& b8 F, v( u; G5 v$ O1 k
  11.     rt_tick_t        timeout_tick;                      /**< timeout tick */0 \& z5 t, ]6 m' `9 a( F
  12. };
    % G, [4 |1 Z5 P" z
  13. typedef struct rt_timer *rt_timer_t;1 \8 p  W& J/ n+ q! \0 ~
复制代码
. b7 W* t% M: D, t" O3 o2 n* V; _

! F3 [7 e7 s! a' c8 h
9 d+ J% ^9 ]; e2 P% [& G! U- y2 `5 u
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-6-11 09:08:17 | 显示全部楼层
同问
使用道具 举报 回复
发表于 2019-6-11 09:33:18 | 显示全部楼层
感觉没啥太大区别
使用道具 举报 回复
发表于 2019-6-11 11:13:46 | 显示全部楼层
使用上区别倒是不大,只是既然这里比较特别,总是有一定的原因,看第一遍书的时候,我也没发现,看第二遍的时候,觉得有点奇怪,就想搞明白一点
使用道具 举报 回复
发表于 2019-6-12 15:37:31 | 显示全部楼层
历史原因。这样写其实是不好的,但是改了就会涉及到大量代码出现编译不过的情况 所以没法动它
使用道具 举报 回复
发表于 2019-6-12 15:41:25 | 显示全部楼层
这么做是为了可以直接thread->name,就是直接一级指针去访问object里面的成员。
/ i" ^+ S8 t7 W* ~7 {# Z
. w1 H2 n9 D( ?其实把thread改成像timer对象那样,直接对object对象继承也是没问题的,只是.....这么做会导致不兼容很多地方的代码了,大量的工程会编译不过。
使用道具 举报 回复
发表于 2019-6-15 10:11:19 | 显示全部楼层
这样要注意的是,如果在object对象中加入一个成员, 相应地,也要在thread结构体中同步加入; 同样要注意的,如果在thread结构中要加入一个成员的话,千万不要插入到object对象对应的范围里去
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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