OSDN Git Service

ファイル名~Init.c/hを~.c/hに変更
[mochi/master.git] / src / lib / libMk / MkMsg.c
1 /******************************************************************************/
2 /*                                                                            */
3 /* src/lib/libMk/MkMsg.c                                                      */
4 /*                                                                 2019/07/24 */
5 /* Copyright (C) 2018-2019 Mochi.                                             */
6 /*                                                                            */
7 /******************************************************************************/
8 /******************************************************************************/
9 /* インクルード                                                               */
10 /******************************************************************************/
11 /* 標準ヘッダ */
12 #include <stdint.h>
13
14 /* 共通ヘッダ */
15 #include <kernel/message.h>
16
17
18 /******************************************************************************/
19 /* グローバル関数宣言                                                         */
20 /******************************************************************************/
21 /******************************************************************************/
22 /**
23  * @brief       メッセージ受信
24  * @details     指定したタスクからのメッセージまたは全てのタスクからのメッセー
25  *              ジの受信を待ち合わせる。
26  *
27  * @param[in]   rcvTaskId   受信待ちタスクID
28  *                  - MK_TASKID_NULL     全てのタスク
29  *                  - MK_TASKID_NULL以外 タスク指定
30  * @param[out]  *pBuffer    メッセージバッファ
31  * @param[in]   size        メッセージバッファサイズ
32  * @param[out]  *pSrcTaskId 送信元タスクID
33  * @param[out]  *pErrNo     エラー番号
34  *                  - MK_MSG_ERR_NONE      エラー無し
35  *                  - MK_MSG_ERR_NO_EXIST  存在しないタスクID指定
36  *                  - MK_MSG_ERR_PROC_TYPE 非隣接プロセスタイプ
37  *                  - MK_MSG_ERR_NO_MEMORY メモリ不足
38  *
39  * @return      受信したメッセージサイズを返す。
40  * @retval      MK_MSG_RET_FAILURE     失敗
41  * @retval      MK_MSG_RET_FAILURE以外 受信メッセージサイズ
42  */
43 /******************************************************************************/
44 int32_t MkMsgReceive( MkTaskId_t rcvTaskId,
45                       void       *pBuffer,
46                       size_t     size,
47                       MkTaskId_t *pSrcTaskId,
48                       uint32_t   *pErrNo      )
49 {
50     volatile MkMsgParam_t param;
51
52     /* パラメータ設定 */
53     param.funcId      = MK_MSG_FUNCID_RECEIVE;
54     param.errNo       = MK_MSG_ERR_NONE;
55     param.ret         = MK_MSG_RET_FAILURE;
56     param.rcv.src     = rcvTaskId;
57     param.rcv.pBuffer = pBuffer;
58     param.rcv.size    = size;
59
60     /* カーネルコール */
61     __asm__ __volatile__ ( "mov esi, %0\n"
62                            "int %1"
63                            :
64                            : "a" ( &param                  ),
65                              "i" ( MK_CONFIG_INTNO_MESSAGE )
66                            : "esi"                            );
67
68     /* エラー番号設定要否判定 */
69     if ( pErrNo != NULL ) {
70         /* 必要 */
71
72         /* エラー番号設定 */
73         *pErrNo = param.errNo;
74     }
75
76     /* 送信元タスクID設定要否判定 */
77     if ( pSrcTaskId != NULL ) {
78         /* 必要 */
79
80         *pSrcTaskId = param.rcv.src;
81     }
82
83     return param.ret;
84 }
85
86
87 /******************************************************************************/
88 /**
89  * @brief       メッセージ送信
90  * @details     指定したタスクにメッセージを送信する。送信先タスクがメッセージ
91  *              を受信するまで待ち合わせる。
92  *
93  * @param[in]   dst   送信元タスク
94  * @param[in]   *pMsg メッセージ
95  * @param[in]   size  サイズ
96  * @param[out]  *pErrNo  エラー番号
97  *                  - MK_MSG_ERR_NONE      エラー無し
98  *                  - MK_MSG_ERR_SIZE_OVER 送信サイズ超過
99  *                  - MK_MSG_ERR_NO_EXIST  存在しないタスクID指定
100  *                  - MK_MSG_ERR_PROC_TYPE 非隣接プロセスタイプ
101  *                  - MK_MSG_ERR_NO_MEMORY メモリ不足
102  *
103  * @return      処理結果を返す。
104  * @retval      MK_MSG_RET_SUCCESS 成功
105  * @retval      MK_MSG_RET_FAILURE 失敗
106  */
107 /******************************************************************************/
108 int32_t MkMsgSend( MkTaskId_t dst,
109                    void       *pMsg,
110                    size_t     size,
111                    uint32_t   *pErrNo )
112 {
113     volatile MkMsgParam_t param;
114
115     /* パラメータ設定 */
116     param.funcId   = MK_MSG_FUNCID_SEND;
117     param.errNo    = MK_MSG_ERR_NONE;
118     param.ret      = MK_MSG_RET_FAILURE;
119     param.snd.dst  = dst;
120     param.snd.pMsg = pMsg;
121     param.rcv.size = size;
122
123     /* カーネルコール */
124     __asm__ __volatile__ ( "mov esi, %0\n"
125                            "int %1"
126                            :
127                            : "a" ( &param                  ),
128                              "i" ( MK_CONFIG_INTNO_MESSAGE )
129                            : "esi"                            );
130
131     /* エラー番号設定要否判定 */
132     if ( pErrNo != NULL ) {
133         /* 必要 */
134
135         /* エラー番号設定 */
136         *pErrNo = param.errNo;
137     }
138
139     return param.ret;
140 }
141
142
143 /******************************************************************************/