关于异步信号处理

11 views
Skip to first unread message

高航

unread,
Mar 22, 2009, 10:43:12 PM3/22/09
to RTEMS Chinese User Group
问题:异步信号处理到底发生在什么时候?我通过看源码和例子程序好像发现了矛盾,请指教。
阅读源码得:发现信号处理函数被注册在api extension中,应该是每次任务切换时调用其中的函数,
看例子程序sp27得:任务收到信号后立即进行信号处理。

julyon

unread,
Mar 22, 2009, 11:21:19 PM3/22/09
to RTEMS Chinese User Group
异步信号处理一般是在任务返回原来的执行路径前,也就是切换到本任务运行时,会检测是否有异步信号需要处理。一般在中断处理完毕以后,也会检测是否有异
步信号需要处理。

我不知道你用的是哪个版本,我看的是4.6的,例子sp27好像不是你说的例子。
任务收到信号后立即进行信号处理是正常的啊,因为在rtems_signal_catch()函数的最后会调用
_Thread_Enable_dispatch();而此时处理器可能还是切换到本任务,这时就会检测是否有异步信号了,有则立刻进行处理。
你说的是这个意思吗?

高航

unread,
Mar 23, 2009, 8:43:00 PM3/23/09
to RTEMS Chinese User Group
应该是4.6中的sp17,我又看了rtems_signal_send()的源码,正如你所说,函数末尾会调用
_thread_enable_dispatch(),此时虽不发生任务切换,但会检查正在运行的线程是否有信号需要处理。十分感谢。
又有一个问题,我修改hello,想在其中完成信号注册和处理,但是每次运行到rtems_signal_catch(),程序就不往下走了,在其中加
入sis_print()也不打印。为了保证程序的正确,我把sp17中的程序原封不动的合到hello.c中,可还是一到
rtems_signal_catch()就不走了,在makefile.am中也加入了manager = signal,还是一样。你遇到过这种
问题吗?

julyon

unread,
Mar 24, 2009, 5:11:48 AM3/24/09
to RTEMS Chinese User Group
更正:

我不知道你用的是哪个版本,我看的是4.6的,例子sp27好像不是你说的例子。
任务收到信号后立即进行信号处理是正常的啊,因为在rtems_signal_catch()函数的最后会调用
_Thread_Enable_dispatch();而此时处理器可能还是切换到本任务,这时就会检测是否有异步信号了,有则立刻进行处理。
你说的是这个意思吗?

其中:rtems_signal_catch()函数的最后会调用 _Thread_Enable_dispatch();
应改为
“rtems_signal_sent()函数的最后会调用 _Thread_Enable_dispatch();”

高航

unread,
Mar 24, 2009, 9:17:19 PM3/24/09
to RTEMS Chinese User Group
将sp17中的init.c asr.c task1.c 和task2.c都粘贴到hello.c中,也用sp17中的system.h替换
hello包中的system.h,可以说代码已经一摸一样了。又在makefile.am中的manager = 后也加入signal。编译通过,
就是一运行到rtems_signal_catch(),程序就不走了。遇到过这种情况吗?
Reply all
Reply to author
Forward
0 new messages