推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

RT-Thread快速入门-信号

更新时间:2023-10-03 07:06:49 大小:204K 上传用户:sun2152查看TA发布的资源 标签:RT-Thread 下载积分:1分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

对,你没看错。作为一款 RTOS,RT-Thread 提供了 Linux 才有的信号机制。 其他常用的 RTOS 没有提供信号机制。 在 Linux 中,信号作为进程间通信的一种方式。而在 RT-Thread 中,仿照类似 的原理,实现信号机制,用于线程(任务)间通信。 本篇文章,我们来学习 RT-Thread 信号的相关内容,以及如何进行管理和使用。 信号的工作机制 同 Linux 中的信号类似,是一种软件层次的中断。 在 RT-Thread 中,信号用作异步通信。POSIX 标准定义了很多种信号,在 RT-Thread 中,应用程序能够使用的信号只有两种:  SIGUSR1  SIGUSR2 一个线程不需要任何操作来就可以等待信号的到达。线程对信号的处理分为三类:  类似中断处理,设定信号处理函数。  忽略信号,不进行处理  默认处理,采用系统默认的处理方式 线程接收到信号时,可能处于两种状态:  正在处于挂起状态,此时线程进入就绪状态去处理对应的信号  处于运行状态,系统会创建新的栈空间去处理对应的信号 管理信号 在 RT-Thread 中,对信号的操作包括以下几种: 安装信号、阻塞信号、解除阻塞、信号发送、信号等待。 1.安装信号 安装信号,主要用来确定信号值以及处理信号所采取的动作之间的映射。 RT-Thread 提供的安装信号接口函数如下: rt_sighandler_t rt_signal_install(int signo, rt_sighandler_t handler) 参数 signo 为信号值;handler 为对信号的处理方式函数。 安装成功,返回信号之前的处理函数指针;安装错误,则返回 SIG_ERR。 其中,rt_sighandler_t 的定义如下,是信号处理函数的函数指针类型。 typedef void (*rt_sighandler_t)(int signo); 2.阻塞信号 阻塞信号,也就是屏蔽信号。若信号被阻塞,则该信号将不会传递为安装此信号 的线程。 函数原型如下: void rt_signal_mask(int signo) 3.解除信号阻塞 线程安装好某个信号后,需要对该信号解除阻塞,线程才能够接收到该信号。 RT-Thread 提供的解除信号函数接口如下: void rt_signal_unmask(int signo) 4.发送信号 一个线程给其他线程发送信号的函数接口如下: int rt_thread_kill(rt_thread_t tid, int sig) 参数 tid 为接收信号的线程句柄;sig 为发送的信号值。 发送成功,返回 RT_EOK;发送失败,则返回 -RT_EINVAL。 5.等待信号 线程可以选择挂起等待某个信号。 int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout) 参数 set 指定等待的信号;si 指向存储等待信号信息的指针;timeout 等待的超 时时间。 函数返回 RT_EOK 说明信号到达,接收成功。等待超时,返回 -RT_ETIMEOUT。参 数错误,则返回 -RT_EINVAL。 实战演练 我们用一个示例来演示如何使用 RT-Thread 信号机制。 #include #define THREAD_PRIORITY 8 #define THREAD_TIMESLICE 5 /* 线程控制块指针 */ rt_thread_t thread1 = RT_NULL; /* 线程 1 的信号处理函数 */ void thread1_signal_handler(int sig) { rt_kprintf("thread1 received signal %d\n", sig); } /* 线程 1 入口 */ static void thread1_entry(void *parameter) { rt_uint8_t cnt = 0; /* 安装信号 */ rt_signal_install(SIGUSR1, thread1_signal_handler); /* 解除阻塞信号 */ rt_signal_unmask(SIGUSR1); /* 运行 10 次 */ while (cnt < 10) { /* 线程 1 采用低优先级运行,一直打印计数值 */ rt_kprintf("thread1 count : %d\n", cnt); cnt++; rt_thread_mdelay(100); } } int main() { /* 动态创建线程 1 */ thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 1024, THREAD_PRIORITY, THREAD_TIMESLICE); if(thread1 != RT_NULL) { /* 启动线程 */ rt_thread_startup(thread1); } /* 延时等待 */ rt_thread_mdelay(300); /* 发送信号 SIGUSR1 给线程 1 */ rt_thread_kill(thread1, SIGUSR1); return 0; } 编译、运行结果如下 小结 至此,RT-Thread 提供的线程间通信方式全部介绍完毕:  邮箱  消息队列  信号 三篇文章,三个方面,从原理到函数接口、再到实例演示,将这几种 RT-Thread 系统资源讲解一遍。 希望大家能够快速掌握这几部分的内容,并应用到实际的项目中去。

部分文件列表

文件名 大小
RT-Thread快速入门-信号.pdf 204K

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载