remove mailbox and signal from kernel/threadcommunication.md
This commit is contained in:
parent
7e2171e597
commit
6618d04ba5
|
@ -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)
|
||||
```
|
||||
该函数用于在内存池中给信号分配一片内存区。
|
||||
## 管道
|
Loading…
Reference in New Issue