rtthread - 信号和信号量学习笔记
目录
概述
信号
工作机制
信号函数
安装
屏蔽/使能
发送信号
等待信号
信号量
工作机制
信号量函数
创建/初始化
删除/脱离
获取/释放
rt_signal_install(SIGUSR1, my_signal_handler); /* 给信号 SIGUSR1 安装我们自己的处理函数 */
rt_signal_install(SIGUSR1, SIG_IGN); /* 不处理信号 SIGUSR1 */
rt_signal_install(SIGUSR1, SIG_DFL); /* 给信号 SIGUSR1 安装默认的处理函数,只是打印 */
/* 安装信号,自定义处理函数 */
rt_signal_install(SIGUSR1, my_signal_handler);
/* 解除阻塞 */
rt_signal_unmask(SIGUSR1);
rt_thread_kill(thread1, SIGUSR1); //向线程 1 发送信号 SIGUSR1
/* 安装一个信号,返回安装结果。
* 此函数有两个参数,分别为信号值和信号值的处理方法
* signo:信号值(SIGUSR1 或 SIGUSR2)
* handler:处理方式(SIG_IGN、SIG_DFL、自定义处理函数)
* 返回值: 成功返回 handler 值,错误返回 SIG_ERR
*/
rt_sighandler_t rt_signal_install(int signo, rt_sighandler_t handler);
void rt_signal_mask(int signo);
void rt_signal_unmask(int signo);
/* 发送信号。
* tid:接收信号的线程
* sig:信号值
* 返回值: 成功返回 RT_EOK,错误返回-RT_EINVAL
*/
int rt_thread_kill(rt_thread_t tid, int sig);
/*等待信号
* set : 输入参数:想等待哪个信号,注意它是一个指针,*set 等于信号的编号
* si :输出参数:用来保存等到的信号的信息
* timeout :指定的等待时间
* 返回 : RT_EOK 等到信号
* RT_ETIMEOUT 超时
* RT_EINVAL 参数错误
*/
int rt_signal_wait(const rt_sigset_t *set, rt_siginfo_t *si, rt_int32_t timeout);
在 RT-Thread 中,信号量控制块是操作系统用于管理信号量的一个数据结构,由结构体 struct rt_semaphore 表示。另外一种 C 表达方式 rt_sem_t,表示的是信号量的句柄,在 C 语言中的实现是指向信号量控制块的指针。信号量控制块结构的详细定义如下:
struct rt_semaphore
{
struct rt_ipc_object parent; /**< inherit from ipc_object */
rt_uint16_t value; /**< value of semaphore. */
rt_uint16_t reserved; /**< reserved field */
};
使用信号量之前,要先创建,得到一个句柄;使用信号量时,要使用句柄来表明使用哪个信号量。
信号量的创建有两种方法:动态分配内存、静态分配内存,
rt_sem_t rt_sem_create(const char *name,rt_uint32_t value,rt_uint8_t flag);
参数
|
说明
|
name
|
信号量名称
|
value
|
信号量初始值
|
flag
|
信号量标志,可以取: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
|
返回值
|
信号量句柄:成功,返回句柄,以后使用句柄来操作信号量
RT_NULL :失败
|
rt_sem_init()函数原型如下:
rt_err_t rt_sem_init(rt_sem_t sem,const char *name,rt_uint32_t value,rt_uint8_t flag)
参数
|
说明
|
sem
|
信号量对象的句柄
|
name
|
信号量的名字
|
value
|
信号量的初始值
|
flag
|
信号量标志: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
|
返回值
|
RT_EOK :成功
|
rt_err_t rt_sem_delete(rt_sem_t sem);
rt_err_t rt_sem_detach(rt_sem_t sem);
获取信号量的函数原型如下:
rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t time);
参数 |
说明
|
sem
|
信号量对象的句柄
|
time
|
超时时间,单位为系统时钟节拍( OS Tick )
|
返回值
|
RT_EOK :获取信号量成功
RT_ETIMEOUT :获取信号量超时
RT_ERROR :获取信号量错误
|
rt_err_t rt_sem_trytake(rt_sem_t sem);
参数
|
说明
|
sem
|
信号量的句柄
|
返回值
|
RT_EOK :获取信号量成功
RT_ETIMEOUT :获取信号量超时
|
rt_err_t rt_sem_release(rt_sem_t sem);
参数
|
说明
|
sem
|
信号量的句柄
|
返回值
|
RT_TRUE :释放信号量成功,并唤醒了一个等待的线程
RT_EOK :释放信号量成功
RT_EFULL :信号量的值已经到达极限 0xffff
|