随想録(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
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