9.信号-非同期通信方式//RT-Threadカーネルプログラミングによる学習記録(非カーネル実装)

3449 ワード

信号、信号は一般的なIPC変数とは異なり、信号は初期化する必要はなく、削除する必要もない.信号にはインストール、監視、送信、応答の操作があります.なぜインストール操作がないのかというと、信号の大部分はシステムで使用されており、すでに作成されており、信号ルームメイトの具体的な記号、例えば私たちが使用できるSIGUSR 1、SIGUSR 2である.私たちが自分で定義できる部分もあります.
/*
* Each of the following macros expand to a positive integral constant
* expression that is the signal number corresponding the the specified
* condition.
*/
#define SIGABRT   1 /* abort                         */
#define SIGFPE    2 /* arithmetic exception          */
#define SIGILL    3 /* illegal instruction           */
#define SIGINT    4 /* attention request from user   */
#define SIGSEGV   5 /* bad memory access             */
#define SIGTERM   6 /* termination request           */
#endif

/* (these following macros are not part of the ANSI standard,
* but private to this implementation)
*/
#define SIGSTAK   7  /* stack overflow                */
#define SIGRTRED  8  /* run-time redirection error    */
#define SIGRTMEM  9  /* run-time memory error         */
/* Signal numbers 10 and 11 are available for the user */
#define SIGUSR1  10
#define SIGUSR2  11
#define SIGPVFN  12 /* pure virtual function called   */
#define SIGCPPL  13 /* miscellaneous exception from C++ library */
#define SIGOUTOFHEAP 14 /* ::operator new or new[] cannot allocate memory */
/* Signal numbers 15-31 are reserved to the implementation */
/* Signal numbers 32 and larger are for more user signals */


/*           ,    32   */
//  
#define sig_mask(sig_no)    (1u << sig_no)
#define sig_valid(sig_no)   (sig_no >= 0 && sig_no < RT_SIG_MAX)

1.信号の取り付け

/*      */
    rt_signal_install(SIGUSR1, Signal_Handler_Function);


/*     Signal_Handler_Function       */

2.信号の監視
/*     */

rt_signal_unmask(SIGUSR1);

//SIGUSR1         ,          

/*
/* Signal numbers 10 and 11 are available for the user */
#define SIGUSR1  10
#define SIGUSR2  11

*/

3.信号の送信
/*     */

rt_thread_kill(tid1, SIGUSR1);

/*tid1             ,SIGUSR1   */

4.信号の応答
/*     */
void Signal_Handler_Function(int sig)
{
    //sig       

}
/*   IPC,           */

//              ,        ,           

5.ルーチン
/*
 *     :    
 *
 *            ,      ,           。
 *
 */
#include 

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

static rt_thread_t tid1 = RT_NULL;

/*   1        */
void thread1_signal_handler(int sig)
{
    rt_kprintf("thread1 received signal %d
", sig); } /* 1 */ static void thread1_entry(void *parameter) { int cnt = 0; /* */ rt_signal_install(SIGUSR1, thread1_signal_handler); rt_signal_unmask(SIGUSR1); /* 10 */ while (cnt < 10) { /* 1 , */ rt_kprintf("thread1 count : %d
", cnt); cnt++; rt_thread_mdelay(100); } } /* */ int signal_sample(void) { /* 1 */ tid1 = rt_thread_create("thread1", thread1_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid1 != RT_NULL) rt_thread_startup(tid1); rt_thread_mdelay(300); /* SIGUSR1 1 */ rt_thread_kill(tid1, SIGUSR1); return 0; }