关于rt-thread互斥锁第二线程检测碰撞的问题,求解答??

发表在 内核学习营2019-6-21 15:11 [复制链接] 3 233

想写一个利用lcd的小游戏,可是在利用互斥锁的时候发现线程2并没有像我想的那样执行检测。现在的问题是虽然小球和障碍物重合到一起线程二也没有执行黑屏操作/ i) F" O8 q0 z4 l
开发板是正点原子的潘多拉stm32l4开发板。# G0 j/ z3 V2 ^  G2 L: O
3 T, e5 T5 g! ?3 r; L: @
代码如下:; Q" s: ]% C8 V: g- i: _# P; T$ g

! o7 a& m4 ~$ C  s5 G4 j#include <rtthread.h>* i. t9 [  l0 [! V- y$ l) W/ ]
#include <rtdevice.h>5 ?3 y# v# U* S5 \0 h9 o/ f, X2 g
#include <board.h>
9 k; R1 N* B, K2 Q5 `; q#include <drv_lcd.h>8 z! r3 T" J% j7 N* ]& M
#include <rttlogo.h>
# k0 R! U" i) [  r9 M//********************************************************************************************
! r# K# T3 i( s+ V( ~#define THREAD_PRIORITY         8; h' s5 K- L0 Z! Z
#define THREAD_TIMESLICE        5  h. I9 H/ H7 k% T$ g
static rt_mutex_t dynamic_mutex = RT_NULL;& O& Y; M; R/ M
static rt_uint8_t number1,number2 = 0;& g) N# w& V# h2 P- r: k) R
1 h/ _/ W. i! r

& _! `1 ~/ |. G; ^. }, x4 vint x=120,y=230;//小球初始坐标8 I) [2 a* M! F2 e& Q$ o" i
//障碍物全局变量+ z) ^0 [1 U4 h5 R! V" F
int x1=120;
/ I% c; O1 M% M( q; ]8 \int y1=120;
5 E$ v/ L  \) h( P  n5 f8 D
1 ~. D1 v6 S- m- Q. L! h& m$ u; ]& `, ~, }
//**************************draw_man*****************************************************画小球的函数
8 h. t/ ]. u9 g  [+ V/ g! [! q1 \/ s6 d6 I- t4 z2 E& ?
void draw_Man(int x,int y)
% p1 H- S* J9 O0 P2 p6 `{
' I" i' h# ]5 F8 q  j    for (int i = 0; i < 10; i += 2)% L% x. x0 }- H5 w* Y- q7 r4 y
    {  ^3 J& ]) d5 s/ g8 ~! Z5 s
        lcd_draw_circle(x, y, i);                                # t. S9 I' P1 r
    }        4 l( {" w5 f8 K$ H0 B1 M! `  Z
}
! L( k) V; |0 Z9 P' M" {' P, }) Z# }
* r0 p9 A6 O1 N* e" t4 W
//******************************* stone *******************************************画障碍物的函数
" c( q( ?$ m5 ?7 M$ Y% Yvoid stone(int x,int y)
- W7 }% {4 X# o' n{
& `% T2 g. f# R4 x: l6 e3 a                        lcd_draw_circle(x,y,10);
$ ]* ]$ ?; Q5 |1 \# E}$ Q# d- A$ J4 F4 A% ~

! S8 Q6 k, _$ ^. R$ W//******************************man_move *************************************************用于小球移动的函数
# q! Q. X( [2 Z# P% L# o% h- g; O( o2 B7 W+ h
void man_move()% p4 q4 T2 Q5 F# p3 ^# s
{
6 G4 T" [/ J% B# x2 H                rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT);
* U' f8 K8 i$ b2 x! w9 S                rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT);/ I! I" }2 g8 Y& k3 F  U6 ~% y
                rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);/ f: Y/ D- i5 r, @, r4 J
                rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT);
/ h: z+ s9 V  X* z8 G# Y                while(1){) j8 g* X4 `3 l: ]% {
                        if(rt_pin_read(PIN_KEY0) == PIN_LOW)9 |- P0 W8 t* P* v7 t; {+ `4 q
                        {                                # _# j- a, j$ L; u$ G+ R4 b
                                if (x + 10 <= 230) {
" M1 C% I1 _/ m0 T                                                x+=10;+ J3 i# O& d0 Q
                                                lcd_clear(WHITE);
. u7 z: x" D+ H$ m7 P                                                draw_Man(x,y);
4 {* V! d5 M1 q3 \4 v                                                stone(x1,y1);
9 d* ^5 j* ]8 p8 j                                }
, D9 p* Y6 S# N                                                                5 ~1 s/ \, c0 P1 S% d
                        }) w; g5 }7 V2 y5 B3 O. K
                        if(rt_pin_read(PIN_KEY2) == PIN_LOW)
: S9 d" q& `4 R) \                        {7 L1 j9 `: t" A- R
                                        if (x - 10 >= 10) {
9 y. O9 W  M% n) k" y7 f$ F                                                x-=10;5 y8 j: j* Z6 {+ i# y* J
                                                lcd_clear(WHITE);- E! W. K$ X. \
                                                draw_Man(x,y);\
( W& |/ ?, S8 ^- [; r9 G' ?# |2 H                                                stone(x1,y1);& {) s# L& S' m. c1 v
                                }                                8 d& k8 Q* d- {1 _9 {
                        }
. U. Y9 o/ g! J" l0 [: J( F                        if(rt_pin_read(PIN_WK_UP) == PIN_HIGH)
3 U/ b# o& \6 k  W' `. |                        {
& P$ d' O5 B; |  E2 J                                        if (y - 10 >= 10) {
0 I+ O0 J. b  O7 Z. J0 {                                                y-=10;  O3 v8 s/ o% j, o$ P
                                                lcd_clear(WHITE);$ N8 O& U. m2 H/ G" w4 W
                                                draw_Man(x,y);+ D$ T6 d- D8 o: t7 M5 W- L# z
                                                stone(x1,y1);5 V! c) `+ J% ?% d% v$ u* \4 o
                                }                                        6 m; u( F6 G+ t0 t1 |% J: M; `
                        }
7 H. ~0 `  t7 g                        if(rt_pin_read(PIN_KEY1) == PIN_LOW)
9 |/ p0 \7 }! [) n                        {" ]) G  ?. I# ^. q8 S
                                        if (y + 10 <= 230) {& |& n' h2 B% M$ v7 M
                                                y+=10;" y5 x4 G4 T9 \9 g/ {0 R8 M$ t
                                                lcd_clear(WHITE);
/ P2 d5 \0 ~: I0 C                                                draw_Man(x,y);
; L% j* [% W$ ^3 g/ C, o                                                stone(x1,y1);
3 t. f4 e) {. u: A1 D                                }                               
- _  W  `9 ~/ E9 N( d1 q! Z, X/ P                        }/ F# V+ s* c( h8 A
                }
0 ?: X; ~+ j( Z1 M  R2 p3 A+ ~5 R3 L* J7 |
}8 e4 `0 x& i- E9 ?: P0 O+ v: n
//********************************************************************线程一用来执行控制小球移动的函数,线程二用来检测小球坐标和障碍物的坐标值是否相等。2 p! K6 Y' j; x) v
) f0 C2 X! d: y9 Y
ALIGN(RT_ALIGN_SIZE)% d& S* p' O. v2 `: m! u
static char thread1_stack[1024];
$ O7 `( Q* s0 n1 T9 a  xstatic struct rt_thread thread1;0 H7 p& [& Y& v* p5 h8 M2 V8 r
static void rt_thread_entry1(void *parameter)
1 v  y3 x* g0 R* w7 v$ e{
. ]& e5 O! l/ V6 i- M; a      while(1)
1 {0 ]3 N/ p' R3 A      {
: ]$ p1 B1 @+ L% l5 Q' J! f' l+ Z          rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);          2 i: f' R+ M- A* v
          man_move();8 k4 `; q. k2 s& `( q/ ^
          rt_thread_mdelay(10); , ~; T; w0 D6 I$ N0 M
          rt_mutex_release(dynamic_mutex);
* [- X5 y! f  m0 ]       }            : L3 M8 b$ A$ S' J! B& F
}
( y7 m9 C& [- G$ Y& S3 @# N( h( ^' S. P
5 m2 d  W4 W2 l* V/ v; OALIGN(RT_ALIGN_SIZE)
. s, a; \  W( j2 L- m/ A7 b5 Estatic char thread2_stack[1024];2 n; L& s# U  O/ h2 B
static struct rt_thread thread2;
7 ]) e% x0 E7 lstatic void rt_thread_entry2(void *parameter)
  Y. u6 P# F; V0 K3 J{     ) |  l) {  W7 O" o2 \& t: V
      while(1)+ J& |5 F8 X$ G5 F, H& d
      {; t) _: T9 P, U7 X4 s; t; a
          rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);. ]. N6 n5 |) n7 _
          if(x == x1&&y==y1)
$ y3 a" G# X) v3 n' O; @          {. m* G/ [4 R' |) b; W
                                                        lcd_display_off();
4 }$ a( a5 u& \+ ^; S+ W( q                                                        rt_mutex_release(dynamic_mutex);
5 P7 g8 o+ ^: F- i# \* o( O          }   
4 X$ m) N% a* B) Z) U      }          # P2 l$ J4 o' `
}7 N2 m2 _& s5 a" ^& y  `7 G, t! H3 ~
//********************************************************************************
8 {3 ?( z4 Q0 V/ p; E1 b, I! h& B: J; X4 S
int mutex_sample(void)9 B( G. B8 T, A3 q2 n* T
{
7 C( L' Y# V, k9 z8 H2 k
7 p+ j% `5 n: f# i6 h( g( l    dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO);
; W7 y  y$ V3 P* w    if (dynamic_mutex == RT_NULL)* x8 Y0 P/ {/ k2 I: f' ~
    {# G5 l4 p9 m8 u$ @
        rt_kprintf("create dynamic mutex failed.\n");) J! a$ R: \7 K1 M5 Q( r
        return -1;
" s  j6 u7 M; @1 B4 B# T/ Z    }
4 c8 w# ^8 y& E* E4 x& p) A2 F) U3 U/ }, U4 A/ L5 N9 c1 S* V
    rt_thread_init(&thread1,
  H1 X" s* z2 q$ b; c6 x7 N$ W* }                   "thread1",
  d2 e) c! U: {, A" j# g* n6 B                   rt_thread_entry1,
0 @* @$ v9 ]7 j9 A                   RT_NULL,
, y5 @, A+ a- v7 n                   &thread1_stack[0],
, S: g1 p; ]1 i- q* ~                   sizeof(thread1_stack),
7 N  a7 a* ~; X: `4 q2 e6 Z                   THREAD_PRIORITY, THREAD_TIMESLICE);* B- Q3 k5 B2 _3 ~8 S0 B
    rt_thread_startup(&thread1);
7 K' W# N% A, J$ R; a; s% e& x
- e: k6 w  @; z: ^, {3 x    rt_thread_init(&thread2,
5 e% R  S! [- B0 v: {3 o+ r* D- q                   "thread2",4 G, a( S( p7 Y. [
                   rt_thread_entry2,0 k6 t9 @6 T1 {; K; K* s, B) F
                   RT_NULL,) k: W! Q) m& ~: F8 E3 O: j
                   &thread2_stack[0],
% I  s6 W% x- v- [! T8 B                   sizeof(thread2_stack), ; Y, T) X5 x4 W/ D  z
                   THREAD_PRIORITY-1, THREAD_TIMESLICE);( t" d* x) d; D4 G2 L1 t6 _9 o
    rt_thread_startup(&thread2);
7 g- G5 O, O- e, ^6 F    return 0;
! j+ F6 V, i2 s: S+ s) R/ @}
. O7 }+ ]. u9 w* H! C2 H+ Y1 V2 U' w3 ~& |' R
//***************************************************************************************
& W& z6 Y" P5 T  u
- @2 O% {$ R# a9 v) n* w& Pint main(void)
* j% K0 m) [0 E+ |{    + K4 @  h! q* q* H8 B
                lcd_set_color(WHITE,BLACK);
2 h$ l3 T7 }) t  o/ V& ]# N" D7 w. b                lcd_show_string(40,48,24,"Falling Stone");
$ d6 q7 R! I% \+ c) ~8 J# g( Z4 R% g                lcd_show_string(20,120,16,"\"press any key begin game\"");
: ^. Z. z& u5 R                lcd_show_string(85,220,16,"By: Good Good Study");& _( s8 C7 I; ^
                mutex_sample();        8 E9 D9 ~5 U; D# ^
    return 0;                & a% Y+ t: h6 @- u
}
4 [1 ]8 S- |) g, P, G8 X) r$ I" i; [9 e

! B9 f% A, F% X+ p  l1 h( E
8 r, ^- r0 G: o7 r' N/ |* ]+ B
4 a- h0 X, y8 Y2 J9 S8 N2 r$ L
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-7-10 18:30:39 | 显示全部楼层
感觉你的man_move函数是一个死循环,thread1在rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);  之后进入这个死循环,它再也不会释放dynamic_mutex, 而导致thread2永远等死在rt_mutex_take这里了吧。
使用道具 举报 回复
发表于 2019-7-10 18:33:59 | 显示全部楼层
楼主,你的问题有人回答了
使用道具 举报 回复
发表于 2019-7-10 18:34:13 | 显示全部楼层
楼主,你的问题有人回答了
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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