[第二期 空气质量分析仪]第3周作业

发表在 实战入门学习营4 天前 [复制链接] 1 46

任务一:异步日志本次采用的是邮箱的方式,进行数据的传递,程序是根据参考文档里面的内容自己修改的,打印出来的是数组而不是数字。
- ~2 l/ B& F5 V$ I
+ ?; C1 W8 V: o! Q  u$ I% @0 v#define THREAD_PRIORITY      10
8 d9 \' l; C: q# y. |#define THREAD_TIMESLICE     5
3 k3 @% Y- q- d2 {8 X2 q4 w7 K
1 n2 d& w8 K0 K5 i8 a0 K' l1 H% J* R  R$ n1 Q' V
static struct rt_mailbox mb;
, F, J# @1 K! f2 N. N3 M3 t: F: L! L! D
: [5 r' K# n  c' G& Jstatic char mb_pool[128];
1 \; z/ i/ |: u1 Q% w9 M: D, ]: b. S1 K/ z" e
static char mb_str1[] = "I'm a mail!";3 |, i/ d( B' E" u0 M5 G
static char mb_str2[] = "this is another mail!";
' D* S0 f' P5 H5 i& m  D& B4 E# r" c9 T) a
( t0 x* p0 g' m. ~! }
ALIGN(RT_ALIGN_SIZE)" h) q) ^/ s: ~; Q; L3 Q) o3 z
static char thread1_stack[1024];, Q% M* R. A5 @3 r
static struct rt_thread thread1;
4 W' o; Z; m- e8 {+ F! N8 S4 u( g& v1 r4 ~; ]: A5 {! N

. D. @) B. {1 @/ v  V# Tstatic void mylog_entry(void *parameter)  J( a4 q9 z8 Z  R6 L, M
{
7 B, ]( h; z  K1 d6 o    char *str;& ?6 [& X# B" W* J1 F- t

  u8 ^0 a( V$ n8 l- h    while (1)
& i- u  w) f+ l. |% u    {
1 I' B% G2 N( ]! F& x# p) x. l- _        //rt_kprintf("try to recv a mail\n");5 A! o9 y! @  _0 s  M

* _$ J" W% @" d% m3 R3 x0 d                        /* 从邮箱中收取邮件 */  Q1 G9 ?' ^9 L1 e6 c+ u/ C
        if (rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER) == RT_EOK). M! T1 J( C* [  s0 a" l2 B  c2 a
        {
! t) a& Y  h: q, t. O& w6 U            rt_kprintf("%s\n", str);
! l8 j  U; X0 V/ X3 ?; R            rt_thread_mdelay(1000);
( ^; P" Q& t) Y9 W5 z9 ?7 ^        }; `% ]( z+ _/ y3 y
    }
4 I3 Z" D1 q. [. e    /* 执行邮箱对象脱离 */
. @; U" Z# m, w; D    rt_mb_detach(&mb);
9 b& X3 N9 s' e4 c* O0 W}5 W; I( w. E3 c. K* S3 L1 G

5 [# @. A- W/ Z. e0 u: j$ [4 HALIGN(RT_ALIGN_SIZE)
, X  E8 A& L# u2 M9 \8 {8 Kstatic char thread2_stack[1024];2 T3 T6 h8 w) D- }, f6 q1 ~+ L9 q
static struct rt_thread thread2;% H- m" l+ G# @* e) h+ n- ^
$ r, [& E4 b9 }' e0 C& t" M
5 J) D. j# [3 R) b- W, \5 m4 u
static void mylog(void)8 _. y$ c5 a1 |  J1 `- {; @3 M
{
0 G4 k8 l0 a0 E9 Y: m  s        //rt_mb_send(&mb, (rt_uint32_t)&mb_str1);) q6 a* x3 T1 m3 y4 B
    rt_uint8_t count;0 q" V& b. G% z) `7 W$ d. [4 I# Z

) t( l+ R1 Y- o' e3 P    count = 0;/ A! X. J* @7 [3 z  |- A& v
    while (count < 10000)
3 H( x, I) g' f) B) Y9 [$ m    {
* c' ^' R5 |4 z8 ^        count ++;# _5 @9 a0 c5 O

/ k# c% u/ b8 U' b            rt_mb_send(&mb, (rt_uint32_t)&mb_str1);6 S  [. m- n4 ~) A0 W

# |* L' E& t  |2 c3 H  j2 M  v* f        rt_thread_mdelay(200);" h5 l1 w: H; m1 [/ {
    }
6 m  p1 z9 d' m; M6 L2 O  `% F% Y+ L
. u7 g3 h. A: q3 E# E6 ]* X$ u}
3 D4 J% Q$ [7 k) [6 D5 d  f- r( T: G  R
int mylog_init(void)
* H7 G. |* A" H( z, ^  B7 z{" M+ R7 u! R# V8 k- @) |
    rt_err_t result;0 M: Z1 R- X6 z1 a' t: r' m

/ }, V7 x/ X# A9 s0 C. o! Z    /* 初始化一个 mailbox */( v; U7 u+ m( [, c
    result = rt_mb_init(&mb,
. k; B! M4 O! l3 _                        "mbt",                      /* 名称是 mbt */
# i  I8 J; i6 C; a5 W9 z$ N                              &mb_pool[0],                /*邮箱用到的内存池是 mb_pool */
* c0 F# C5 B. g! e0 p0 y                              sizeof(mb_pool) / 4,        /* 邮箱中的邮件数目,因为一封邮件占 4 字节 */
8 S6 K* i1 [3 A$ d                        RT_IPC_FLAG_FIFO);          /* 采用 FIFO 方式进行线程等待 */
, l; t7 m( o. o$ n$ o    if (result != RT_EOK)
. m8 U/ _3 ~3 t3 p* o    {
5 H% g! q* M  O6 [        rt_kprintf("init mailbox failed.\n");$ ]8 X3 n* y9 J3 U8 E! C( m
        return -1;# z, b) K* I2 L! ]2 p
    }7 V; ^' |' V( c5 R% @! T3 H" t
- I& S* _  R$ Q' f
    rt_thread_init(&thread1,
, y( Y* C& a. H                   "thread1",
8 r2 T1 E' {8 r. c; X9 `                   mylog_entry,. y% Q7 d1 S% d7 m4 R5 [5 i
                   RT_NULL,
, ?5 a8 M# X$ F                   &thread1_stack[0],1 j- e8 a. f: G& q: f
                   sizeof(thread1_stack),1 d2 e/ b  z+ w
                   THREAD_PRIORITY, THREAD_TIMESLICE);7 K2 Z! Y4 z9 ]2 P# q) ]
    rt_thread_startup(&thread1);
( R% F0 J& I0 N/ q6 H$ K* S# M    mylog();! y! I: o; K- g* X. i- X: A* X
    return 0;* Q2 i" |. ^# v" N# R* m# L
}
+ c/ W( \. m3 F/ {" t  w8 F& ^. w( c  @5 |
INMNW}YCBPQ40X]}D3}Z[R8.png ; Z* H# p7 v4 f$ F
本来是跟着伪代码写的,可是对后面的数组不是很懂,就跟着文档里面的写,但有个问题就是mylog这个函数里为什么不能光有一个邮箱的发送函数,当我把他写成死循环里时,就打印不出数据?+ t$ d$ d9 I, u7 f, _
任务二:系统跑起来5 |  H1 j- D; d& h  j
1、LED
' k1 T/ V9 L' y9 C3 |
7 q3 d' M7 K4 H$ ?3 Z9 j4 L* X+ gvoid led_entry(void)* r8 @3 [7 p+ K
{
2 O  X  b* Z1 T  I        rt_uint32_t e;
8 @: X% I  }2 o# r# b2 n% R0 t        while(1)
6 a6 b: E' j  x% E8 N: }  {
; Z/ Z- h- z, N1 ?    if(rt_event_recv(&event, EVENT_FLAG1 | EVENT_FLAG2 | EVENT_FLAG3,
+ Y( e+ c4 o. ^* y8 e* H/ e( D                          RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR , RT_WAITING_FOREVER, &e) == RT_EOK)
9 T5 x! v' V4 ]/ \$ b+ ?5 ~9 v. B. D( t    {
  h, K; k4 n' c( \) Y      if(e & EVENT_FLAG1)
9 }) \0 ^4 e. {8 x, c* Z; K; @          led_on();5 {5 }8 q: J$ R8 b3 B" K/ H
, O4 x- |- {* G9 P4 u+ A
      if(e & EVENT_FLAG2)
( D5 h* I7 d& B% h4 d3 C1 \          led_off();" `( h, @- R3 `2 J; P, d  r$ F* c
& F' S  r. b3 X, r' y5 k6 u& u1 N
      if(e & EVENT_FLAG3)
/ v+ C! [/ x) I- b          led_blink();
5 i, A# h) {, {- g+ B9 x8 H) O, ~: ?! U" \
    }" ]* z4 ?9 o* y" ~
  }
7 R2 U) D* p- t4 Y  G4 c7 q" ?5 Q}/ ^' L$ B$ X$ U7 S, _. T

( |0 B/ K8 C" ]3 M1 W2 x2、按键模块. \! e6 D9 [5 q. G: F8 ]& E( P
int key_cb(void *args)
+ Z- W' x: B( T% f{; ]2 }0 `) |4 `# Q; `2 i4 n3 e6 d( G
          if(rt_pin_read(KEY1_PIN)==PIN_HIGH)& b+ C, F- H" L& P
          {
; g. L$ N; p3 V& Z( b                        , H; O9 T6 y2 I, [  i  P! L
                  rt_pin_write(LED0_PIN,0);5 P  F1 y+ T; t" I% z* L$ t  d2 b
                        rt_event_send(&event,TEMP_HUMI_OFF);
' b+ n0 t5 W# v& m9 ]                  //rt_pin_write(KEY1_PIN,PIN_LOW);
% |4 s2 {  ^! e% R          }
0 ~# w4 a5 d; n) h          else{ + [4 h2 l( E) {7 c6 w) X. e6 ~
                  rt_pin_write(LED0_PIN,1);
8 F7 D6 g" ]# a6 @5 \                        rt_event_send(&event,TEMP_HUMI_ON);
& @. d1 h, N- P1 V% y* X: P: _                  //rt_pin_write(KEY1_PIN,PIN_HIGH);* \; _$ g3 Q3 z% ?" j
       
. H: x2 }# ^" e  [9 w5 r$ T5 [2 K          }        9 a% r$ g0 |. u. J( }
}& d; ^3 D: ^% D3 A8 u4 `! k0 O
$ O! v9 ]) E6 S, P
3、温湿度模块1 {. v; ]" |. l. g! e. O$ H
void temp_humi_entry(void)
& o. Z& M- \) u% D{
1 {9 T; J( ~" |+ P        rt_uint32_t e;
5 `) B5 e0 E! x& \        while(1)
8 S, X9 \& V7 j! y5 ^9 M3 y- p        {0 s0 E. N& {: R8 T" l
                if(rt_event_recv(&event,(TEMP_HUMI_OFF | TEMP_HUMI_ON), 5 q, b2 `/ R- `7 n7 J, l3 g9 i! v
                          RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR , RT_WAITING_FOREVER, &e) == RT_EOK)
& C3 c; E$ ~% G2 T1 t! c+ u                {5 e6 K" o" f2 e! C$ D# _2 U; e6 O" @
                        if(e==TEMP_HUMI_OFF)
9 g( W- I; u. i3 _: E' |6 N                        {+ I5 R( }- [& c0 z1 b
                                re_event_send(&event,EVENT_FLAG3);
1 D3 t, Q7 N' T  g! s! X, \  \                        }3 `7 Z# I" q% u
                        if(e == TEMP_HUMI_ON)
3 Z% E. h9 Q9 f                        {1 |% l6 y) b: s7 J
                                dht11_get_temperature(28);
& T& {6 F( y# |+ y9 u                                re_event_send(&event,EVENT_FLAG1);- z3 z6 }' u6 K9 \
                                * d! n* ]4 z: i; N, M( {' N9 N, c5 t
                        }                ' `5 _# U: G) }5 v+ u6 ]9 K8 M; U
                }
' f8 ?5 u+ X$ Y8 I* b. |0 O        }
3 j9 ~. d+ e6 |) y8 X. {! }}
# G# E$ s4 x* U9 |1 j. e/ D" y0 C3 W6 x
PM2.5跟这个差不多的,大体的已经成功,还有一些逻辑和很多细节未能全部写完,之后再做修改。+ d' \2 _$ \  z( d6 X
通过这三周学习营的练习,又多学会了一些东西很开心,时间较少很多东西都还不是很了解,过后会继续学习的。
8 `, k. D1 q& O$ P
2 h2 M6 [- s" M9 \( z  H" e# ]( D$ E  L
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 3 天前 | 显示全部楼层
嗯嗯,抽空完善完善
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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