수상록
2195 단어 수상록
2012-2017년 그동안 rtos에 푹 빠졌습니다.시중에서 배울 수 있는 rtos는 일반적으로 코드를 가져와서 어떻게 실현하는지 배운다.현재 linux와 rtos를 말하자면 기본적으로 응용 장면은 여전히 매우 명확하게 나뉜다.중저주파수의 soc이지만 실시간성에 대한 요구가 높은 장면은 일반적으로 rtos를 사용하고 다른 장면은 linux를 사용한다.그러나 많은 장면에서 사람들이 linux 코드를 복용하기를 원하기 때문에 문제가 존재한다.시그널이 그중의 하나야.
일찍이 rtthread에 익숙해졌기 때문에 이번에github에서 rtos에서 signal의 실현 방법을 보고 좀 놀랐다.원래 코드의 주소는 여기에 있는데,https://github.com/RT-Thread/rt-thread/blob/master/src/signal.c.몇몇 경험이 있는 학우들은 모두 이해할 수 있다고 믿는다.
1. signal 함수 등록
rt_signal_install 함수
2. 시그널 보내기
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