随想録(rtosのsignal)

2148 ワード

【声明:著作権所有、転載歓迎、商業用途に使用しないでください.連絡ポスト:[email protected]
 
2012-2017年のこの時期から、自分はrtosに夢中になっていました.市販されているrtosでは、コードを持ってきて、どのように実現するかを学ぶのが一般的です.現在linuxとrtosといえば、基本的にシーンを適用するのははっきりしています.中低周波数のsocですが、リアルタイム性に要求されるシーンはrtosが一般的で、その他はlinuxが使われます.しかし、多くのシーンでは、linuxのコードを多重化したいと考えられています.これはいくつかの問題があります.signalはその一つです.
 
rtthreadには早くから詳しいので、今回githubでrtos下signalの実現方法を見て、やはり少し驚きました.元のコードのアドレスはここにあります.https://github.com/RT-Thread/rt-thread/blob/master/src/signal.c.経験のある学生はみな理解できると信じている.
 
1、signal関数の登録
rt_signal_义齿
 
2、signalの送信
rt_thread_kill
 
3、具体的なsignal送信プロセス
_signal_deliver

        else if (!((tid->stat & RT_THREAD_STAT_SIGNAL_MASK) & RT_THREAD_STAT_SIGNAL))
        {
            /* add signal state */
            tid->stat |= RT_THREAD_STAT_SIGNAL;

            /* point to the signal handle entry */
            tid->sig_ret = tid->sp;
            tid->sp = rt_hw_stack_init((void *)_signal_entry, RT_NULL,
                                       (void *)((char *)tid->sig_ret - 32), RT_NULL);

            rt_hw_interrupt_enable(level);
            LOG_D("signal stack pointer @ 0x%08x", tid->sp);

            /* re-schedule */
            rt_schedule();
        }

    , signal thread, thread , thread , _signal_entry。

 

4、 _signal_entry,

rt_thread_handle_sig

 

5、


#ifdef RT_USING_SMP
    rt_hw_context_switch_to((rt_ubase_t)&(tid->sp), tid);
#else
    rt_hw_context_switch_to((rt_ubase_t)&(tid->sp));
#endif /*RT_USING_SMP*/

 

6、

a,rt_signal_mask

b,rt_signal_unmask

c,rt_signal_wait