随想录(rtos中的signal)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/feixiaoxing/article/details/84592734
今日推荐