关于RTC闹钟驱动rt_alarm_start

发表在 RTC2020-3-26 17:53 [复制链接] 0 48

  1. rt_err_t rt_alarm_start(rt_alarm_t alarm)! I3 U# s( A0 c
  2. {
    1 a. e( j+ j7 C" K) W# L
  3.     rt_int32_t sec_now, sec_old, sec_new;
    & X" }+ o; k& W5 O
  4.     rt_err_t ret = RT_ERROR;
    $ r3 h: ?; w) Y1 W  S9 o: h0 r  V
  5.     time_t timestamp;
    6 L# z, e7 u3 D4 H3 g
  6.     struct tm now;) K* N4 ]8 ?  A: V2 A2 P: }
  7. . f/ C0 z6 Q; n1 }! R6 e: C
  8.     if (alarm == RT_NULL)6 V7 P- B5 e) v4 q- A
  9.         return (ret);, m$ A! ^; f% y+ `/ W
  10.     rt_mutex_take(&_container.mutex, RT_WAITING_FOREVER);+ x  z3 G- x) q& k
  11.     if (!(alarm->flag & RT_ALARM_STATE_INITED))) H- N' {" Z" q1 o" T
  12.     {* Y) c2 v2 W$ U) [, Q, F: Y. {
  13.         if (alarm_setup(alarm, &alarm->wktime) != RT_EOK)
    1 D6 x3 {- Z4 g! o
  14.             goto _exit;
    # a; i/ |8 P9 y' [0 Y7 k4 Z
  15.     }
    - x, k- J4 ~/ \5 c: X* s
  16.     if ((alarm->flag & 0x01) == RT_ALARM_STATE_STOP)
    * F! N* Y% k+ ~
  17.     {6 e9 h- s8 e4 }) _2 g/ A6 t
  18.         timestamp = time(RT_NULL);, j, ]5 B5 T" o+ p
  19.         localtime_r(×tamp, &now);6 q6 j( ]4 x0 U# w+ h5 Q1 o

  20. ' X2 N! |7 H5 i" |; L" I  r( _
  21.         alarm->flag |= RT_ALARM_STATE_START;
    $ A- |* }5 A$ H. o0 f
  22.         /* set alarm */5 Y7 O, y( T6 {7 Y, X9 ?4 Z; D! {) _- u
  23.         if (_container.current == RT_NULL)- M+ J! p, t, I& y
  24.         {
    1 w5 c+ W, _, ?2 P
  25.             ret = alarm_set(alarm);* w8 `: y  [6 C) l5 J
  26.         }
    7 U0 ~- |$ N; e9 U5 `
  27.         else
    " R6 L$ |/ |8 M; P* d
  28.         {
    ( Z2 ?# [2 z" q- z; |. P& D. l
  29.             sec_now = alarm_mkdaysec(&now);
    2 |* e! q9 L+ x% A* U7 ~$ Y+ z
  30.             sec_old = alarm_mkdaysec(&_container.current->wktime);7 m- R9 S% `9 w' b
  31.             sec_new = alarm_mkdaysec(&alarm->wktime);0 V7 k6 |+ K  m  I+ V/ D
  32. 5 X" F6 R: ?! Z2 S" B
  33.             if ((sec_new < sec_old) && (sec_new > sec_now))
    5 |# N. O; W. M- Q
  34.             {+ @) b" B- j- f( x
  35.                 ret = alarm_set(alarm);
    + u; p: e0 X) l% r; t2 y- I
  36.             }
    1 G) x* ^  q, F% ~, i- i9 R* {
  37.             else if ((sec_new > sec_now) && (sec_old < sec_now))
    $ n6 T- r6 d% |( z
  38.             {
    ! `" G) `3 h# ]. v% e$ `
  39.                 ret = alarm_set(alarm);
    7 \- `& |% R2 _8 I
  40.             }7 @) `) W8 q; i9 ^1 u+ [% v/ o4 f( {: R
  41.             else if ((sec_new < sec_old) && (sec_old < sec_now)). |; V6 A0 Z- K2 R6 Z$ M
  42.             {7 }9 Y4 x2 m0 M9 u7 r. y; U
  43.                 ret = alarm_set(alarm);
    ; d3 e9 I4 j5 B/ c' N9 j! }
  44.             }7 l, C# w0 A0 ?) j( E" i% r+ z
  45.             else5 ^  D- v" X4 y# w  H% Z
  46.             {
    5 t6 s9 @; _! ?3 S9 W) z/ }, f5 X
  47.                 ret = RT_EOK;* C0 x0 Q3 [" _2 n4 I4 H! @6 x4 p
  48.                 goto _exit;
    # j7 {' u) h' ?, \# D) }# O
  49.             }  i7 B/ o$ L$ h9 |9 d& l' I; |
  50.         }
    # k  e* E9 j/ t; |" F  X

  51. : w2 i7 l7 z/ g5 y
  52.         if (ret == RT_EOK)
    / Q( X/ G% N  F) _) k7 r$ z
  53.         {
    ' Z% }3 B- ]5 T; }
  54.             _container.current = alarm;
    3 b3 D! B1 J2 X* o& x9 R
  55.         }
    ) k7 e, u4 [3 r  `
  56.     }
    4 E7 G, g6 ?8 h8 s0 y2 C9 l
  57. 8 V8 i- D: b7 Y
  58. _exit:
    3 y* ^4 F7 v) c& G4 t. V) K
  59.     rt_mutex_release(&_container.mutex);& L& j0 z( N' n
  60. ( Q* ]1 z( w( [8 D) D  H, w3 _
  61.     return (ret);) k  f8 G9 b: B; T4 N
  62. }
    3 I6 @2 m8 w( b# g2 X
复制代码

. J! ?" _. L3 t0 P# F% ^代码sec_old = alarm_mkdaysec(&_container.current->wktime);sec_new = alarm_mkdaysec(&alarm->wktime);中的
sec_old的值与sec_new一样,因为_container.current = alarm指向同一内存地址,下面的IF判断就没意义了。所以使用rt_alarm_control设置参数后用
rt_alarm_start启动就会失败,不知道是不是我理解错了,请指点一下,谢谢
9 `/ T. D, R% Q, j, y5 hNOTE:我是想在闹钟回调函数中使用rt_alarm_control重新设置下一次闹钟事件的时间,然后使用rt_alarm_start启动闹钟,结果发现每次启动失败,还有一点RTT官网上drv_rtc.c中没有对RT_DEVICE_CTRL_RTC_SET_ALARM定义进行处理,无法设置闹钟
4 g: Z6 N& F" C2 T1 V0 k* R* K2 Y0 N6 i1 J' Z' k
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 1 主题
  2. 11 帖子
  3. 11 积分

Ta的主页 发消息

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

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

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

Powered by RT-Thread

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