版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feixiaoxing/article/details/84592734
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
从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_install函数
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