From 6618d04ba5cc18f3ac29ffbdca2a8bf5de98e030 Mon Sep 17 00:00:00 2001 From: Yan_yan Date: Mon, 26 Oct 2020 11:39:09 +0800 Subject: [PATCH] remove mailbox and signal from kernel/threadcommunication.md --- docs/doc/kernel/threadcommunication.md | 203 +------------------------ 1 file changed, 2 insertions(+), 201 deletions(-) diff --git a/docs/doc/kernel/threadcommunication.md b/docs/doc/kernel/threadcommunication.md index dee0380..f077f2b 100644 --- a/docs/doc/kernel/threadcommunication.md +++ b/docs/doc/kernel/threadcommunication.md @@ -1,134 +1,5 @@ # 线程间通信 -XiUOS 的线程间通信使用邮箱、消息队列和信号三种方式。下面将分别介绍。 - -## 邮箱 -### 邮箱的工作机制 -XiUOS 的每一封邮件大小为4字节,也就是一个指针的大小。典型的邮箱应用是,线程或中断服务发送一封4字节长度的邮件到邮箱中,其他的线程可以从邮箱中接收邮件并进行处理。

-当一个线程向邮箱发送邮件时,如果邮箱没满,就将邮件复制到邮箱中。如果邮箱满了并且超时时间设置为0,则返回`-XS_EFULL`;如果超时时间不为0,先将该发送线程挂起,当邮箱中的邮件被取出空出空间后,等待挂起的发送线程被唤醒继续发送。但是如果到达超时时间仍没有空间,则返回`-XS_EFULL`。

-当一个线程从邮箱中接收邮件时,如果邮箱中有邮件,就读出该邮件的内容,并返回XS_EOK。如果邮箱中没有邮件并且超时设置为0,则返回`-XS_ETIMEOUT`;如果超时时间不为0,则将该线程挂在邮箱的等待线程中,有邮件时唤醒。但是如果到达超时时间仍没有邮件,返回`-XS_ETIMEOUT`。 -### 结构体定义和函数接口 - -#### 邮箱控制块 -```C -struct xs_Mailbox -{ - char name[XS_NAME_MAX]; - xs_uint8 style; - - xs_uint8 sign; - - xs_list_t link; - - xs_list_t pend_list; - - xs_ubase *msg_buf; - xs_uint16 size; - xs_uint16 index; - xs_uint16 in_offset; - xs_uint16 out_offset; - - xs_list_t pend_sender_list; -}; - -typedef struct xs_Mailbox *xs_mailbox_t; -``` -| 参数 | 描述 | -| ------ | ------ | -| name | 邮箱名称 | -| style | 线程等待的方式,可以取FIFO或PRIO | -| sign | 标记邮箱的创建方式,静态创建或动态创建 | -| link | 邮箱存放的列表 | -| pend_list | 线程等待队列 | -| msg_buf | 邮箱缓冲区开始地址 | -| size | 邮箱最大容纳的邮件数 | -| index | 邮箱中邮件的索引 | -| in_offset | 邮箱缓冲的进指针 | -| out_offset | 邮箱缓冲的出指针 | -| pend_sender_list | 发送线程的挂起等待队列 | - -#### 函数接口 - -```C -xs_err_t xs_InitMailbox(xs_mailbox_t mb, - const char* name, - void* msgpool, - xs_size_t size, - xs_uint8 flag); -``` -该函数用于创建一个静态邮箱对象,并将它加入邮箱管理列表中,创建成功返回`XS_OK`。
-| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | -| name | 邮箱名称 | -| msgpool | 缓冲区指针 | -| size | 邮箱容量 | -| flag | 线程等待的方式,可以取FIFO或PRIO | -
- -```C -xs_err_t xs_DetachMailbox(xs_mailbox_t mb); -``` -该函数用于脱离静态初始化的邮箱对象。该函数唤醒所有挂在该邮箱上的线程,然后将该邮箱从邮箱存放的列表中脱离,返回`XS_OK`。 -| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | - -```C -xs_mailbox_t xs_CreateMailbox(const char *name, xs_size_t size, xs_uint8 flag); -``` -该函数用于创建一个动态邮箱对象,并将它加入邮箱管理列表中。创建成功则返回`XS_OK`,创建失败返回`XS_NULL`。
-| 参数 | 描述 | -| ------ | ------ | -| name | 邮箱名称 | -| size | 邮箱容量 | -| flag | 线程等待的方式,可以取FIFO或PRIO | -
- -```C -xs_err_t xs_DeleteMailbox(xs_mailbox_t mb); -``` -该函数用于删除动态邮箱对象。先唤醒挂在邮箱对象上的所有线程,然后释放该邮箱的使用内存,最后删除邮箱对象。返回`XS_OK`。
-| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | -
- -```C -xs_err_t xs_MailboxSendWait(xs_mailbox_t mb, xs_ubase value, xs_int32 timeout); -``` -该函数用于发送邮件。如果邮箱满了并且过了timeout时间仍然没有空位,则返回`-XS_FULL`;否则将邮件存放入邮箱。
-| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | -| value | 邮件内容 | -| timeout | 超时时间 | -
- -```C -xs_err_t xs_MailboxSend(xs_mailbox_t mb, xs_ubase value); -``` -该函数用于发送邮件。与`xs_MailboxSendWait`唯一不同的地方是,该函数的`timeout == 0`。
-| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | -| value | 邮件内容 | -
- -```C -xs_err_t xs_MailboxRecv(xs_mailbox_t mb, xs_ubase *value, xs_int32 timeout); -``` -该函数用于接受邮件。 - -```C -xs_err_t xs_CmdControlMailbox(xs_mailbox_t mb, int cmd, void *arg); -``` -该函数用于获取或设置邮箱的其他属性。目前当`cmd == XS_LINKLIST_CMD_RESET`时,重新初始化邮箱。
-| 参数 | 描述 | -| ------ | ------ | -| mb | 邮箱对象 | -| cmd | 需要执行的命令 | -| arg | 命令的参数 | -
+XiUOS 的线程间通信使用管道和消息队列进行通信。下面将分别介绍。 ## 消息队列 ### 消息队列的工作机制 @@ -305,74 +176,4 @@ xs_err_t xs_CmdControlMessageQueue(xs_messagequeue_t mq, int cmd, void *arg) | arg | 命令的参数 |
- -## 信号 -### 信号的工作机制 -信号是在软件层次对中断机制的一种模拟。XiUOS中提供了信号用作异步通信的方式。

-收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类:

-第一种是类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。

-第二种方法是,忽略某个信号,对该信号不做任何处理。

-第三种方法是,对该信号的处理保留系统的默认值。

-具体来说,假设其他线程要向线程1通信,则在线程1中安装一个信号并解除阻塞,在安装的同时,规定对该信号的异常处理方式。其他线程给线程1发送信号,触发线程1对该信号的处理。 -### 函数接口 -```C -xs_sighandler_t xs_InstallSignal(int signo, xs_sighandler_t handler) -``` -该函数用于给当前线程安装一个新的信号。
- -| 参数 | 描述 | -| ------ | ------ | -| signo | 信号值 | -| handler | 设置对信号值的处理方式,可以是用户自定义的函数,`SIG_IGN`或`SIG_DFL` | -
- -handler的值为`SIG_IGN`时,忽略该信号;
-handler的值为`SIG_DFL`时,执行信号默认处理函数`_SignalDefaultHandler`;
-handler为函数句柄时,执行用户函数。
- -```C -void xs_MaskSignal(int signo) -``` -该函数用于屏蔽一个信号。
- -| 参数 | 描述 | -| ------ | ------ | -| signo | 信号值 | -
- -```C -void xs_UnmaskSignal(int signo) -``` -该函数用于解除对一个信号的屏蔽。
- -| 参数 | 描述 | -| ------ | ------ | -| signo | 信号值 | -
- -```C -int xs_WaitSignal(const xs_sigset_t *set, xs_siginfo_t *si, xs_int32 timeout) -``` -等待`set`信号到来。如果没等到这个信号,则将该线程挂起直到等到信号或超过超时时间。如果等到信号,则将`set`信号指针存入`si`。
- -| 参数 | 描述 | -| ------ | ------ | -| set | 指定等待的信号 | -| set | 指向存储等到信号信息的指针 | -| set | 超时时间 | -
- -```C -int xs_KThreadKill(TaskDescriptorPointer tid, int sig) -``` -该函数用于给线程`tid`发送信号`sig`。
- -| 参数 | 描述 | -| ------ | ------ | -| tid | 线程 | -| sig | 信号值 | - -```C -int xs_SysInitSignal(void) -``` -该函数用于在内存池中给信号分配一片内存区。 \ No newline at end of file +## 管道 \ No newline at end of file