RT-Thread / RT-Thread/rt-thread

rt_timer_list_next_timeout() may return error?

Aperta
#4,309 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

discussion
Lingua principale
C
Stelle
12.2k
Fork
5.4k
Merge medio
4g 12h
PR unite (30g)
40

Descrizione

If a timer has a timeout tick 0xFFFFFFFF(RT_TICK_MAX), the timer thread will suspend itself. And if the rt_tick now is 0xFFFFFFFF(RT_TICK_MAX), timer callback should be called immediately.


  /* the fist timer always in the last row */
  static rt_tick_t rt_timer_list_next_timeout(rt_list_t timer_list[])
  {
      struct rt_timer *timer;
      register rt_base_t level;
      rt_tick_t timeout_tick = RT_TICK_MAX;
  
      /* disable interrupt */
      level = rt_hw_interrupt_disable();
  
      if (!rt_list_isempty(&timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]))
      {
          timer = rt_list_entry(timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1].next,
                                struct rt_timer, row[RT_TIMER_SKIP_LIST_LEVEL - 1]);
          timeout_tick = timer->timeout_tick;
      }
  
      /* enable interrupt */
      rt_hw_interrupt_enable(level);
  
      return timeout_tick;
  }


        /* get the next timeout tick */
        next_timeout = rt_timer_list_next_timeout(rt_soft_timer_list);
        if (next_timeout == RT_TICK_MAX)
        {
            /* no software timer exist, suspend self. */
            rt_thread_suspend(rt_thread_self());
            rt_schedule();
        }

Is that OK?

I suppose that the API should be "rt_err_t rt_timer_list_next_timeout(rt_list_t timer_list[], rt_tick_t *timeout_tick) " instead,

Thanks.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia ispezionando rt_timer_list_next_timeout() e il codice del thread del software timer mostrato nell’issue. Traccia i casi RT_TICK_MAX quando esiste un timer e quando il tick corrente raggiunge quel valore, quindi determina il comportamento previsto del callback e della sospensione. Il lavoro è completato quando l’edge case viene gestito in modo coerente e il comportamento dell’API è chiaramente validato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
c
Ambito
embedded-iot, operating-systems
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.