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

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

想写一个利用lcd的小游戏,可是在利用互斥锁的时候发现线程2并没有像我想的那样执行检测。现在的问题是虽然小球和障碍物重合到一起线程二也没有执行黑屏操作
+ x, J  \" Q$ H开发板是正点原子的潘多拉stm32l4开发板。
7 ]1 `1 L6 I9 V
& U# H2 z( J6 p( t! v" O' B- x1 \代码如下:1 m) A. @! b9 ^) C0 K

* }) e6 i% K+ {2 ^$ P5 Z#include <rtthread.h>; N) l3 `  C" t" H
#include <rtdevice.h>
2 w8 I, z% P6 f#include <board.h>
" K3 b6 p& V4 i/ u#include <drv_lcd.h>1 B) H1 }; H) d2 R6 g2 G
#include <rttlogo.h>1 ]* X$ g9 c( {" a5 n" W
//********************************************************************************************2 \6 a( Q9 G' H, l
#define THREAD_PRIORITY         8
7 v( O8 B6 q* d0 z' t#define THREAD_TIMESLICE        5
3 |# H' F& U& m2 b' u! n4 v' j9 rstatic rt_mutex_t dynamic_mutex = RT_NULL;
% i$ a( m# p4 O( G8 d' Rstatic rt_uint8_t number1,number2 = 0;
: ^" M+ M. ~- [
; A& A3 s# F2 K8 ?) G! e- ?7 t
" I9 |$ C1 B" |3 `% j& v+ cint x=120,y=230;//小球初始坐标
6 ?! L0 I, L& M! [! b//障碍物全局变量6 D" Q( W4 l5 Y6 \; q
int x1=120;- L6 _* n: r" H$ q
int y1=120;4 T1 R' f  B. c' W0 b
% B5 I" p8 K: y1 l7 Q( m6 I6 s
( I# r* w* @8 b8 g8 d+ V; Q3 ]+ \5 Z
//**************************draw_man*****************************************************画小球的函数
. c' \" ?, B7 D# @8 \1 T) @# G1 T* [& x- u+ G4 t" i
void draw_Man(int x,int y)
2 @; F& V! P9 ^! P* d{
- y  P1 R, Q0 h6 M& B- T+ q    for (int i = 0; i < 10; i += 2)
' w5 x  n4 }! E4 l! q$ i2 i/ p    {
3 q8 B' S2 M7 n9 x" @4 |0 h        lcd_draw_circle(x, y, i);                                + X: o/ [& v. |
    }        1 K( l: z- q& e
}7 t" a7 L1 M2 I7 ]/ H7 C
. g6 c9 |. R! |; ?( z- P

0 S" q" H7 g) C2 c& a( e! j//******************************* stone *******************************************画障碍物的函数7 [4 g% B# X, X& d( X
void stone(int x,int y)
9 X. _  _# d; T{
7 A3 ^% h- A* A7 `4 n                        lcd_draw_circle(x,y,10);2 @4 y; [6 d/ U- c) Z
}
& D# f, o( d, w9 c/ T% w3 |4 z: W) {8 }4 Z4 M
//******************************man_move *************************************************用于小球移动的函数
, P* g' Y5 ]: X3 Y$ [' r
3 x9 ]5 {7 s* }0 gvoid man_move()
/ |* N. J: `" y" P/ [5 P{5 F+ |; @1 f" Z% F+ j
                rt_pin_mode(PIN_KEY2, PIN_MODE_INPUT);, [4 t) ?* I3 x8 {- ^, G5 u
                rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT);8 n4 ?5 ]& k' s; c' d" N- H
                rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
8 }+ z0 L! v: m. T  E: ^                rt_pin_mode(PIN_WK_UP, PIN_MODE_INPUT);% c, U, V) Q* p9 s# p4 p
                while(1){
+ p: x/ f- R" t1 S. M7 U6 B1 _                        if(rt_pin_read(PIN_KEY0) == PIN_LOW); X# L. s' Z9 k2 Q, o' p
                        {                                + f8 t7 s, E! c) b0 e
                                if (x + 10 <= 230) {
- a2 U4 e7 V4 c; C8 M' e2 e                                                x+=10;
" o6 p/ c7 P2 q" W                                                lcd_clear(WHITE);: C/ j" e9 F/ n/ W7 [
                                                draw_Man(x,y);  `7 y, A# Z& \1 f  o8 D
                                                stone(x1,y1);
! W8 _9 m; Q. @2 `. K, d& I                                }3 C# T% W2 |3 e$ s1 {
                                                                  ?2 I8 @8 Q# J. Q/ n/ y8 C* c% ~
                        }
' S2 ]8 B  }; q                        if(rt_pin_read(PIN_KEY2) == PIN_LOW)
; y) ?1 {6 W- G6 \  z                        {
9 F% s) V) @' c( h0 @                                        if (x - 10 >= 10) {! _# B9 i# m9 t" [* z/ C6 t) K
                                                x-=10;( j- e8 l+ g/ x1 ?4 Y* @
                                                lcd_clear(WHITE);
0 R8 ^, W1 |# s8 d3 a1 Y6 z! H                                                draw_Man(x,y);\6 t* s" G; m5 Q5 X) k, O
                                                stone(x1,y1);
. N5 s" `: G, E6 y                                }                                  ?: [8 r. h3 z' U0 o2 D) N
                        }, V& }* ^3 Q: R
                        if(rt_pin_read(PIN_WK_UP) == PIN_HIGH)% t0 K/ p3 Y5 A# M( @' V2 Y6 Z9 K$ \
                        {
: u8 K$ p4 D9 v- ?5 Z) K                                        if (y - 10 >= 10) {
+ @, }$ l. A* E. p+ X                                                y-=10;& M$ k7 `9 ?; @+ O4 P
                                                lcd_clear(WHITE);
5 P/ F% N2 `3 f; X0 _2 u7 y                                                draw_Man(x,y);
4 a0 e- S* F- P. h1 Z                                                stone(x1,y1);9 x2 q' `: \2 t' j' d& c
                                }                                       
5 d: r5 \- U( n! b7 m8 ?                        }
0 c# f7 U$ i9 t8 S1 b4 T                        if(rt_pin_read(PIN_KEY1) == PIN_LOW)8 f3 i: v+ p7 e
                        {
" w) z- R, M! w+ i6 S& v0 @                                        if (y + 10 <= 230) {
7 g) c# d9 q3 [1 l$ J  c  ^                                                y+=10;
( a2 ^3 W& x. j/ `; _                                                lcd_clear(WHITE);0 {3 Q% s4 [$ R! V  G, J9 f8 B
                                                draw_Man(x,y);5 Q; h" ^) |! [# x
                                                stone(x1,y1);/ E: f6 m+ n3 ?. W8 Q/ J0 T) ^
                                }                               
- T. u, O+ l. k4 d& ^0 s                        }) P# M8 Z/ P$ z" v! b' F( J
                }
! w' {( }- @- f1 I2 ^& e
' f+ j5 e4 y' V: ]/ f; ~  }+ w" D& {}
) t; @" Y/ ]( i9 S: {//********************************************************************线程一用来执行控制小球移动的函数,线程二用来检测小球坐标和障碍物的坐标值是否相等。( e* s9 J4 [! w0 k

0 u  m) |6 I6 X+ P3 [# TALIGN(RT_ALIGN_SIZE)
2 s3 m% }/ x, d# astatic char thread1_stack[1024];- B, w0 U3 b! v- y
static struct rt_thread thread1;$ D2 ]/ s' n* o3 C
static void rt_thread_entry1(void *parameter)7 a5 j; a: y2 W. d) }. t
{
! c% Q% l# Y5 G: {      while(1)
; m0 W/ p3 F. z. w1 _      {
! t1 `& R' I# z% k          rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);          ' h* Q2 I2 {1 D: I5 r; E& f2 b
          man_move();
7 d6 e  x+ ~0 |9 N7 a          rt_thread_mdelay(10); % a8 L8 ^7 I" Y- j6 ?
          rt_mutex_release(dynamic_mutex);
+ Z$ s$ q% p; I" w- J       }            
7 Z) a, R8 ^8 ]6 D" E: U}: B3 y" R# `8 p
$ Q: Z0 C4 z- {$ ?& q/ h' r1 c
ALIGN(RT_ALIGN_SIZE)- U7 {7 J, y: S9 f
static char thread2_stack[1024];* @# d: e% |& L) t
static struct rt_thread thread2;
2 m" d' v. Z0 D; p3 tstatic void rt_thread_entry2(void *parameter)/ x! @7 t: _3 W9 Y
{     
% |) @/ z$ h% @. a: o      while(1). d2 A0 Q7 o2 e) k; i
      {
3 l8 G" l& X* Q1 X* J6 @( A6 @          rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);! q6 U. t# E& k; ?2 H
          if(x == x1&&y==y1)" P1 D) N4 f5 F! }
          {! V; q6 O3 K8 j! {
                                                        lcd_display_off();% r" u# S, j  s; U  q+ u6 ~
                                                        rt_mutex_release(dynamic_mutex);
0 `# m, M0 m1 R& @1 Y          }   
$ W; j4 D& S3 H9 I" p      }          5 E8 O' \* f* Q* X
}
9 u4 H' A# x* z7 \& D/ P//********************************************************************************
2 B' p3 O2 s1 H0 L% C3 a9 ~$ X
9 q  J* m* `+ l9 D/ Z& V& wint mutex_sample(void)
  h& g. ]$ R, U- K. O{
! F6 F0 z4 I8 {7 k- ^; j% G1 A+ t- t$ A1 L
    dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_FIFO);
& f: b2 N2 w; p% [    if (dynamic_mutex == RT_NULL)
/ E" d# A. @, J7 ^    {* g0 \# _* F& A/ M2 u
        rt_kprintf("create dynamic mutex failed.\n");+ C0 b5 k2 F8 h9 y+ Y2 r  s6 p
        return -1;3 V5 c) I2 E8 _1 d8 Z9 {
    }
0 E& P( C) J8 _' S/ }
; i$ F: N6 Q) |) Z' P    rt_thread_init(&thread1,$ }- B  {) T5 }; j5 @% z
                   "thread1",
- G8 z+ Y5 a0 I2 t& ^                   rt_thread_entry1,
0 {# H# ~: e+ ^- f% q# V3 h                   RT_NULL,
/ ?9 W) }3 W; |6 M2 d4 Q                   &thread1_stack[0],3 N/ h& w; X! `6 B
                   sizeof(thread1_stack),
3 n5 a% m( v$ R, M                   THREAD_PRIORITY, THREAD_TIMESLICE);
$ D7 i+ c6 N- ^* U    rt_thread_startup(&thread1);
" \* a  z# z- x
- O4 R( P3 r% Q    rt_thread_init(&thread2,& |# t1 e2 q- [# z3 x! H
                   "thread2",, l5 C% J; n/ {3 a5 h
                   rt_thread_entry2,' L, m' D9 z8 r: ]! y; ^0 j2 w
                   RT_NULL,
/ t1 ]% p9 g* u2 v; M- y                   &thread2_stack[0],
3 E5 |1 ~! i0 E                   sizeof(thread2_stack), . G/ f. y  C7 I: {3 b0 {" k2 K
                   THREAD_PRIORITY-1, THREAD_TIMESLICE);
  w' c( H. S  {0 y( C2 M& y    rt_thread_startup(&thread2);
) C$ p  h6 G. X    return 0;
( b1 D. K# i3 R1 a7 r$ s}
: A* C4 m  c; @/ i8 J  l! P: F' A$ K( ~- u0 s- m
//***************************************************************************************
& _4 b2 h8 y/ W. h  G: I1 l
7 V, L0 C0 Y. ]6 p3 S# t; eint main(void)- N5 \: l1 C! C6 {: I* P
{    6 z) `! Z( L9 k" F' f6 @$ c- _
                lcd_set_color(WHITE,BLACK);
9 B7 J' Z" l' M8 b3 _                lcd_show_string(40,48,24,"Falling Stone");
9 U; t  R3 Q% L, `: S0 n. V1 g                lcd_show_string(20,120,16,"\"press any key begin game\"");% H* X+ D  O1 ]% Y, N( G2 K# c( O
                lcd_show_string(85,220,16,"By: Good Good Study");
2 [) P5 E8 ~! F6 {( @                mutex_sample();        7 w3 h, M; g6 A+ h1 m0 I% d0 P! G
    return 0;                3 p0 z1 ^( h) e' ]3 ^" f
}; R2 }) b( p/ x  ?& I! R
3 N$ A4 C2 v( n4 O2 J. P

* K8 [9 ]3 t$ F- ]& y9 P
1 P9 \9 e% @4 T- R; a
) {& l2 U0 P; R6 I9 M4 }. h8 v! @0 j5 G, c. g1 _
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 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开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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