remove mailbox and signal from kernel/threadcommunication.md

This commit is contained in:
Yan_yan 2020-10-26 11:39:09 +08:00
parent 7e2171e597
commit 6618d04ba5
1 changed files with 2 additions and 201 deletions

View File

@ -1,134 +1,5 @@
# 线程间通信
XiUOS 的线程间通信使用邮箱、消息队列和信号三种方式。下面将分别介绍。
## 邮箱
### 邮箱的工作机制
XiUOS 的每一封邮件大小为4字节也就是一个指针的大小。典型的邮箱应用是线程或中断服务发送一封4字节长度的邮件到邮箱中其他的线程可以从邮箱中接收邮件并进行处理。</br></br>
当一个线程向邮箱发送邮件时如果邮箱没满就将邮件复制到邮箱中。如果邮箱满了并且超时时间设置为0则返回`-XS_EFULL`如果超时时间不为0先将该发送线程挂起当邮箱中的邮件被取出空出空间后等待挂起的发送线程被唤醒继续发送。但是如果到达超时时间仍没有空间则返回`-XS_EFULL`。</br></br>
当一个线程从邮箱中接收邮件时如果邮箱中有邮件就读出该邮件的内容并返回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`。</br>
| 参数 | 描述 |
| ------ | ------ |
| mb | 邮箱对象 |
| name | 邮箱名称 |
| msgpool | 缓冲区指针 |
| size | 邮箱容量 |
| flag | 线程等待的方式可以取FIFO或PRIO |
</br>
```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`。</br>
| 参数 | 描述 |
| ------ | ------ |
| name | 邮箱名称 |
| size | 邮箱容量 |
| flag | 线程等待的方式可以取FIFO或PRIO |
</br>
```C
xs_err_t xs_DeleteMailbox(xs_mailbox_t mb);
```
该函数用于删除动态邮箱对象。先唤醒挂在邮箱对象上的所有线程,然后释放该邮箱的使用内存,最后删除邮箱对象。返回`XS_OK`。</br>
| 参数 | 描述 |
| ------ | ------ |
| mb | 邮箱对象 |
</br>
```C
xs_err_t xs_MailboxSendWait(xs_mailbox_t mb, xs_ubase value, xs_int32 timeout);
```
该函数用于发送邮件。如果邮箱满了并且过了timeout时间仍然没有空位则返回`-XS_FULL`;否则将邮件存放入邮箱。</br>
| 参数 | 描述 |
| ------ | ------ |
| mb | 邮箱对象 |
| value | 邮件内容 |
| timeout | 超时时间 |
</br>
```C
xs_err_t xs_MailboxSend(xs_mailbox_t mb, xs_ubase value);
```
该函数用于发送邮件。与`xs_MailboxSendWait`唯一不同的地方是,该函数的`timeout == 0`。</br>
| 参数 | 描述 |
| ------ | ------ |
| mb | 邮箱对象 |
| value | 邮件内容 |
</br>
```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`时,重新初始化邮箱。</br>
| 参数 | 描述 |
| ------ | ------ |
| mb | 邮箱对象 |
| cmd | 需要执行的命令 |
| arg | 命令的参数 |
</br>
XiUOS 的线程间通信使用管道和消息队列进行通信。下面将分别介绍。
## 消息队列
### 消息队列的工作机制
@ -305,74 +176,4 @@ xs_err_t xs_CmdControlMessageQueue(xs_messagequeue_t mq, int cmd, void *arg)
| arg | 命令的参数 |
</br>
## 信号
### 信号的工作机制
信号是在软件层次对中断机制的一种模拟。XiUOS中提供了信号用作异步通信的方式。</br></br>
收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类:</br></br>
第一种是类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。</br></br>
第二种方法是,忽略某个信号,对该信号不做任何处理。</br></br>
第三种方法是,对该信号的处理保留系统的默认值。</br></br>
具体来说假设其他线程要向线程1通信则在线程1中安装一个信号并解除阻塞在安装的同时规定对该信号的异常处理方式。其他线程给线程1发送信号触发线程1对该信号的处理。
### 函数接口
```C
xs_sighandler_t xs_InstallSignal(int signo, xs_sighandler_t handler)
```
该函数用于给当前线程安装一个新的信号。</br>
| 参数 | 描述 |
| ------ | ------ |
| signo | 信号值 |
| handler | 设置对信号值的处理方式,可以是用户自定义的函数,`SIG_IGN`或`SIG_DFL` |
</br>
handler的值为`SIG_IGN`时,忽略该信号;</br>
handler的值为`SIG_DFL`时,执行信号默认处理函数`_SignalDefaultHandler`</br>
handler为函数句柄时执行用户函数。 </br>
```C
void xs_MaskSignal(int signo)
```
该函数用于屏蔽一个信号。</br>
| 参数 | 描述 |
| ------ | ------ |
| signo | 信号值 |
</br>
```C
void xs_UnmaskSignal(int signo)
```
该函数用于解除对一个信号的屏蔽。</br>
| 参数 | 描述 |
| ------ | ------ |
| signo | 信号值 |
</br>
```C
int xs_WaitSignal(const xs_sigset_t *set, xs_siginfo_t *si, xs_int32 timeout)
```
等待`set`信号到来。如果没等到这个信号,则将该线程挂起直到等到信号或超过超时时间。如果等到信号,则将`set`信号指针存入`si`。</br>
| 参数 | 描述 |
| ------ | ------ |
| set | 指定等待的信号 |
| set | 指向存储等到信号信息的指针 |
| set | 超时时间 |
</br>
```C
int xs_KThreadKill(TaskDescriptorPointer tid, int sig)
```
该函数用于给线程`tid`发送信号`sig`。</br>
| 参数 | 描述 |
| ------ | ------ |
| tid | 线程 |
| sig | 信号值 |
```C
int xs_SysInitSignal(void)
```
该函数用于在内存池中给信号分配一片内存区。
## 管道