RT-Thread 25. 信号-按键发送

1.设置
include:
..\rt-thread-v4.1.0\components\libc\compilers\common
..\rt-thread-v4.1.0\components\libc\compilers\common\extension
开启signal,保存并退出menuconfig,这样在rtconfig.h中自动添加RT_USING_SIGNALS宏定义

RT-Thread 25. 信号-按键发送_第1张图片

//rtconfig.h
/* Inter-Thread communication */

#define RT_USING_SEMAPHORE
#define RT_USING_MUTEX
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_MESSAGEQUEUE
#define RT_USING_SIGNALS
2.代码

如果线程要处理某一信号,那么就要在线程中安装该信号。安装信号主要用来确定信号值及线程针对 该信号值的动作之间的映射关系,即线程将要处理哪个信号,该信号被传递给线程时,将执行何种操作。
//sg.c

#include 
#include 
#include "drv_gpio.h"

#define THREAD_PRIORITY   27
#define THREAD_TIMESLICE  10

#define THREAD_STACK_SIZE    500

static rt_thread_t thread61 = RT_NULL;
/* 线 程 1 的 信 号 处 理 函 数 */
void thread1_signal_handler(int sig)
{
  rt_kprintf("thread1 received signal %d\n", sig);
}

/* 线 程 1 的 入 口 函 数 */
static void thread61_entry(void *parameter)
{
  int cnt = 0;
  /* 安 装 信 号 */
  rt_signal_install(SIGUSR1, thread1_signal_handler);
  rt_signal_unmask(SIGUSR1);
  while (1)
  {
    /* 线 程 1 采 用 低 优 先 级 运 行, 一 直 打 印 计 数 值 */
    rt_kprintf("thread1 count : %d\n", cnt);
    cnt++;
    rt_thread_mdelay(5000);
  }
}

void SgKeyScanCallBack(void)
{
  /* 发 送 信 号 SIGUSR1 给 线 程 1 */
  rt_thread_kill(thread61, SIGUSR1);  
}

int SgTaskInit(void)
{
  /* 创 建 线 程 1 */
  thread61 = rt_thread_create("thread61",
                          thread61_entry, RT_NULL,
                          THREAD_STACK_SIZE,
                          THREAD_PRIORITY, THREAD_TIMESLICE);
  if (thread61 != RT_NULL)
  {
    rt_thread_startup(thread61);
  }  
  return 0;
}

/* 信 号 示 例 的 初 始 化 */
int signal_sample(void)
{

  rt_thread_mdelay(300);
  /* 发 送 信 号 SIGUSR1 给 线 程 1 */
  rt_thread_kill(thread61, SIGUSR1);
  return 0;
}
/* 导 出 到 msh 命 令 列 表 中 */
//MSH_CMD_EXPORT(signal_sample, signal sample);
2. 输出
thread1 count : 27

key press val is 1
thread1 received signal 10
thread1 count : 28

key press val is 1
thread1 received signal 10
thread1 count : 29

thread1 count : 30

你可能感兴趣的:(#,RT-Thread,mcu)