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宏定义
//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 <rtthread.h>
#include <rtdevice.h>
#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