# generated from XKB map dk include common map 0x406 exclam 0x02 shift exclamdown 0x02 altgr onesuperior 0x02 shift altgr quotedbl 0x03 shift at 0x03 altgr twosuperior 0x03 shift altgr numbersign 0x04 shift sterling 0x04 altgr threesuperior 0x04 shift altgr currency 0x05 shift dollar 0x05 altgr onequarter 0x05 shift altgr percent 0x06 shift onehalf 0x06 altgr cent 0x06 shift altgr ampersand 0x07 shift yen 0x07 altgr fiveeighths 0x07 shift altgr slash 0x08 shift braceleft 0x08 altgr division 0x08 shift altgr parenleft 0x09 shift bracketleft 0x09 altgr guillemotleft 0x09 shift altgr parenright 0x0a shift bracketright 0x0a altgr guillemotright 0x0a shift altgr equal 0x0b shift braceright 0x0b altgr degree 0x0b shift altgr plus 0x0c question 0x0c shift plusminus 0x0c altgr questiondown 0x0c shift altgr dead_acute 0x0d dead_grave 0x0d shift bar 0x0d altgr brokenbar 0x0d shift altgr Greek_OMEGA 0x10 shift altgr lstroke 0x11 altgr Lstroke 0x11 shift altgr EuroSign 0x12 altgr cent 0x12 shift altgr registered 0x13 altgr thorn 0x14 altgr THORN 0x14 shift altgr leftarrow 0x15 altgr yen 0x15 shift altgr downarrow 0x16 altgr uparrow 0x16 shift altgr rightarrow 0x17 altgr idotless 0x17 shift altgr oe 0x18 altgr OE 0x18 shift altgr thorn 0x19 altgr THORN 0x19 shift altgr aring 0x1a Aring 0x1a shift dead_diaeresis 0x1a altgr dead_abovering 0x1a shift altgr dead_diaeresis 0x1b dead_circumflex 0x1b shift dead_tilde 0x1b altgr dead_caron 0x1b shift altgr ordfeminine 0x1e altgr masculine 0x1e shift altgr ssharp 0x1f altgr section 0x1f shift altgr eth 0x20 altgr ETH 0x20 shift altgr dstroke 0x21 altgr ordfeminine 0x21 shift altgr eng 0x22 altgr ENG 0x22 shift altgr hstroke 0x23 altgr Hstroke 0x23 shift altgr kra 0x25 altgr lstroke 0x26 altgr Lstroke 0x26 shift altgr ae 0x27 AE 0x27 shift oslash 0x28 Ooblique 0x28 shift dead_caron 0x28 shift altgr onehalf 0x29 section 0x29 shift threequarters 0x29 altgr paragraph 0x29 shift altgr apostrophe 0x2b asterisk 0x2b shift dead_doubleacute 0x2b altgr multiply 0x2b shift altgr guillemotleft 0x2c altgr guillemotright 0x2d altgr copyright 0x2e altgr leftdoublequotemark 0x2f altgr grave 0x2f shift altgr rightdoublequotemark 0x30 altgr mu 0x32 altgr masculine 0x32 shift altgr comma 0x33 semicolon 0x33 shift dead_cedilla 0x33 altgr dead_ogonek 0x33 shift altgr period 0x34 colon 0x34 shift periodcentered 0x34 altgr dead_abovedot 0x34 shift altgr minus 0x35 underscore 0x35 shift hyphen 0x35 altgr macron 0x35 shift altgr nobreakspace 0x39 altgr less 0x56 greater 0x56 shift backslash 0x56 altgr notsign 0x56 shift altgr /tree/os/rt?id=75c2f8ba464257ec21c4e68f90f84ba91fa9a91f'>rt/src/chmsg.c
blob: 4ab63d0c75c9eb692bbb575aa6da6b054c393238 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
    ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio.

    This file is part of ChibiOS.

    ChibiOS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file    chmsg.c
 * @brief   Messages code.
 *
 * @addtogroup messages
 * @details Synchronous inter-thread messages APIs and services.
 *          <h2>Operation Mode</h2>
 *          Synchronous messages are an easy to use and fast IPC mechanism,
 *          threads can both act as message servers and/or message clients,
 *          the mechanism allows data to be carried in both directions. Note
 *          that messages are not copied between the client and server threads
 *          but just a pointer passed so the exchange is very time
 *          efficient.<br>
 *          Messages are scalar data types of type @p msg_t that are guaranteed
 *          to be size compatible with data pointers. Note that on some
 *          architectures function pointers can be larger that @p msg_t.<br>
 *          Messages are usually processed in FIFO order but it is possible to
 *          process them in priority order by enabling the
 *          @p CH_CFG_USE_MESSAGES_PRIORITY option in @p chconf.h.<br>
 * @pre     In order to use the message APIs the @p CH_CFG_USE_MESSAGES option
 *          must be enabled in @p chconf.h.
 * @post    Enabling messages requires 6-12 (depending on the architecture)
 *          extra bytes in the @p thread_t structure.
 * @{
 */

#include "ch.h"

#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)

/*===========================================================================*/
/* Module exported variables.                                                */
/*===========================================================================*/

/*===========================================================================*/
/* Module local types.                                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Module local variables.                                                   */
/*===========================================================================*/

/*===========================================================================*/
/* Module local functions.                                                   */
/*===========================================================================*/

#if CH_CFG_USE_MESSAGES_PRIORITY == TRUE
#define msg_insert(tp, qp) queue_prio_insert(tp, qp)
#else
#define msg_insert(tp, qp) queue_insert(tp, qp)
#endif

/*===========================================================================*/
/* Module exported functions.                                                */
/*===========================================================================*/

/**
 * @brief   Sends a message to the specified thread.
 * @details The sender is stopped until the receiver executes a
 *          @p chMsgRelease()after receiving the message.
 *
 * @param[in] tp        the pointer to the thread
 * @param[in] msg       the message
 * @return              The answer message from @p chMsgRelease().
 *
 * @api
 */
msg_t chMsgSend(thread_t *tp, msg_t msg) {
  thread_t *ctp = currp;

  chDbgCheck(tp != NULL);

  chSysLock();
  ctp->u.sentmsg = msg;
  msg_insert(ctp, &tp->msgqueue);
  if (tp->state == CH_STATE_WTMSG) {
    (void) chSchReadyI(tp);
  }
  chSchGoSleepS(CH_STATE_SNDMSGQ);
  msg = ctp->u.rdymsg;
  chSysUnlock();

  return msg;
}

/**
 * @brief   Suspends the thread and waits for an incoming message.
 * @post    After receiving a message the function @p chMsgGet() must be
 *          called in order to retrieve the message and then @p chMsgRelease()
 *          must be invoked in order to acknowledge the reception and send
 *          the answer.
 * @note    If the message is a pointer then you can assume that the data
 *          pointed by the message is stable until you invoke @p chMsgRelease()
 *          because the sending thread is suspended until then.
 *
 * @return              A reference to the thread carrying the message.
 *
 * @api
 */
thread_t *chMsgWait(void) {
  thread_t *tp;

  chSysLock();
  if (!chMsgIsPendingI(currp)) {
    chSchGoSleepS(CH_STATE_WTMSG);
  }
  tp = queue_fifo_remove(&currp->msgqueue);
  tp->state = CH_STATE_SNDMSG;
  chSysUnlock();

  return tp;
}

/**
 * @brief   Releases a sender thread specifying a response message.
 * @pre     Invoke this function only after a message has been received
 *          using @p chMsgWait().
 *
 * @param[in] tp        pointer to the thread
 * @param[in] msg       message to be returned to the sender
 *
 * @api
 */
void chMsgRelease(thread_t *tp, msg_t msg) {

  chSysLock();
  chDbgAssert(tp->state == CH_STATE_SNDMSG, "invalid state");
  chMsgReleaseS(tp, msg);
  chSysUnlock();
}

#endif /* CH_CFG_USE_MESSAGES == TRUE */

/** @} */