Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/kernel/queuing_port.c@0:ccdea31d8eba, 2019-08-23 (annotated)
- Committer:
- gawas
- Date:
- Fri Aug 23 16:43:44 2019 +0000
- Revision:
- 0:ccdea31d8eba
init funtion;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| gawas | 0:ccdea31d8eba | 1 | #include <stdint.h> |
| gawas | 0:ccdea31d8eba | 2 | #include <stddef.h> |
| gawas | 0:ccdea31d8eba | 3 | #include <string.h> |
| gawas | 0:ccdea31d8eba | 4 | |
| gawas | 0:ccdea31d8eba | 5 | #include <apex_queuing.h> |
| gawas | 0:ccdea31d8eba | 6 | |
| gawas | 0:ccdea31d8eba | 7 | #include "ports.h" |
| gawas | 0:ccdea31d8eba | 8 | #include "../xml_data.h" |
| gawas | 0:ccdea31d8eba | 9 | #include "kernel/part_scheduler.h" |
| gawas | 0:ccdea31d8eba | 10 | |
| gawas | 0:ccdea31d8eba | 11 | |
| gawas | 0:ccdea31d8eba | 12 | void init_queuing_ports(void) |
| gawas | 0:ccdea31d8eba | 13 | { |
| gawas | 0:ccdea31d8eba | 14 | const size_t nb_partitions = sizeof(partitions) / sizeof(partition_t); |
| gawas | 0:ccdea31d8eba | 15 | for (size_t i = 0; i < nb_partitions; ++i) { |
| gawas | 0:ccdea31d8eba | 16 | port_t *ports = (port_t *)partitions[i].ports; |
| gawas | 0:ccdea31d8eba | 17 | |
| gawas | 0:ccdea31d8eba | 18 | for (APEX_INTEGER n = 0; n < partitions[i].nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 19 | ports[n].activated = false; |
| gawas | 0:ccdea31d8eba | 20 | |
| gawas | 0:ccdea31d8eba | 21 | if (ports[n].is_queuing_port) { |
| gawas | 0:ccdea31d8eba | 22 | ports[n].q_buf.circ_buf.buffer = ports[n].q_buf.buffer; |
| gawas | 0:ccdea31d8eba | 23 | ports[n].q_buf.NB_MESSAGE = 0; |
| gawas | 0:ccdea31d8eba | 24 | } else { |
| gawas | 0:ccdea31d8eba | 25 | /* TODO: Need to setup ports for the sampling ports as well. */ |
| gawas | 0:ccdea31d8eba | 26 | } |
| gawas | 0:ccdea31d8eba | 27 | } |
| gawas | 0:ccdea31d8eba | 28 | } |
| gawas | 0:ccdea31d8eba | 29 | |
| gawas | 0:ccdea31d8eba | 30 | const size_t nb_channels = sizeof(connection_table) / sizeof(channel_t); |
| gawas | 0:ccdea31d8eba | 31 | for (size_t i = 0; i < nb_channels; i++) { |
| gawas | 0:ccdea31d8eba | 32 | channel_t *channel = &connection_table[i]; |
| gawas | 0:ccdea31d8eba | 33 | port_t **port_list = connection_table[i].ports; |
| gawas | 0:ccdea31d8eba | 34 | |
| gawas | 0:ccdea31d8eba | 35 | for (APEX_INTEGER n = 0; n < channel->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 36 | port_list[n]->channel_link = channel; |
| gawas | 0:ccdea31d8eba | 37 | } |
| gawas | 0:ccdea31d8eba | 38 | } |
| gawas | 0:ccdea31d8eba | 39 | } |
| gawas | 0:ccdea31d8eba | 40 | |
| gawas | 0:ccdea31d8eba | 41 | |
| gawas | 0:ccdea31d8eba | 42 | void create_queuing_port( |
| gawas | 0:ccdea31d8eba | 43 | /*in */ QUEUING_PORT_NAME_TYPE QUEUING_PORT_NAME, |
| gawas | 0:ccdea31d8eba | 44 | /*in */ MESSAGE_SIZE_TYPE MAX_MESSAGE_SIZE, |
| gawas | 0:ccdea31d8eba | 45 | /*in */ MESSAGE_RANGE_TYPE MAX_NB_MESSAGE, |
| gawas | 0:ccdea31d8eba | 46 | /*in */ PORT_DIRECTION_TYPE PORT_DIRECTION, |
| gawas | 0:ccdea31d8eba | 47 | /*in */ QUEUING_DISCIPLINE_TYPE QUEUING_DISCIPLINE, |
| gawas | 0:ccdea31d8eba | 48 | /*out*/ QUEUING_PORT_ID_TYPE *QUEUING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 49 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 50 | { |
| gawas | 0:ccdea31d8eba | 51 | (void) QUEUING_DISCIPLINE; |
| gawas | 0:ccdea31d8eba | 52 | |
| gawas | 0:ccdea31d8eba | 53 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 54 | port_t *ports = this_partition->ports; |
| gawas | 0:ccdea31d8eba | 55 | |
| gawas | 0:ccdea31d8eba | 56 | for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 57 | if (!strcmp(ports[n].portname, QUEUING_PORT_NAME) && |
| gawas | 0:ccdea31d8eba | 58 | ports[n].q_buf.MAX_MESSAGE_SIZE == MAX_MESSAGE_SIZE && |
| gawas | 0:ccdea31d8eba | 59 | ports[n].q_buf.MAX_NB_MESSAGE == MAX_NB_MESSAGE && |
| gawas | 0:ccdea31d8eba | 60 | ports[n].q_buf.PORT_DIRECTION == PORT_DIRECTION) |
| gawas | 0:ccdea31d8eba | 61 | { |
| gawas | 0:ccdea31d8eba | 62 | ports[n].activated = true; |
| gawas | 0:ccdea31d8eba | 63 | *QUEUING_PORT_ID = n; |
| gawas | 0:ccdea31d8eba | 64 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 65 | return; |
| gawas | 0:ccdea31d8eba | 66 | } |
| gawas | 0:ccdea31d8eba | 67 | } |
| gawas | 0:ccdea31d8eba | 68 | |
| gawas | 0:ccdea31d8eba | 69 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 70 | } |
| gawas | 0:ccdea31d8eba | 71 | |
| gawas | 0:ccdea31d8eba | 72 | |
| gawas | 0:ccdea31d8eba | 73 | void send_queuing_message( |
| gawas | 0:ccdea31d8eba | 74 | /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 75 | /*in */ MESSAGE_ADDR_TYPE MESSAGE_ADDR, /* by reference */ |
| gawas | 0:ccdea31d8eba | 76 | /*in */ MESSAGE_SIZE_TYPE LENGTH, |
| gawas | 0:ccdea31d8eba | 77 | /*in */ SYSTEM_TIME_TYPE TIME_OUT, |
| gawas | 0:ccdea31d8eba | 78 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 79 | { |
| gawas | 0:ccdea31d8eba | 80 | (void)TIME_OUT; /* Unused parameter */ |
| gawas | 0:ccdea31d8eba | 81 | |
| gawas | 0:ccdea31d8eba | 82 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 83 | |
| gawas | 0:ccdea31d8eba | 84 | /* Return error if invalid QUEUING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 85 | if (QUEUING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 86 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 87 | return; |
| gawas | 0:ccdea31d8eba | 88 | } |
| gawas | 0:ccdea31d8eba | 89 | |
| gawas | 0:ccdea31d8eba | 90 | port_t *port = &this_partition->ports[QUEUING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 91 | channel_t *chan = port->channel_link; |
| gawas | 0:ccdea31d8eba | 92 | |
| gawas | 0:ccdea31d8eba | 93 | /* If the message is never recieved by at least one, |
| gawas | 0:ccdea31d8eba | 94 | 'message_sent' will stay false. */ |
| gawas | 0:ccdea31d8eba | 95 | bool message_sent = false; |
| gawas | 0:ccdea31d8eba | 96 | |
| gawas | 0:ccdea31d8eba | 97 | port_t **ports = chan->ports; |
| gawas | 0:ccdea31d8eba | 98 | for (APEX_INTEGER i = 0; i < chan->nb_ports; i++) { |
| gawas | 0:ccdea31d8eba | 99 | port_t *port = ports[i]; |
| gawas | 0:ccdea31d8eba | 100 | |
| gawas | 0:ccdea31d8eba | 101 | if (!port->is_queuing_port || |
| gawas | 0:ccdea31d8eba | 102 | !port->activated || |
| gawas | 0:ccdea31d8eba | 103 | !(port->q_buf.PORT_DIRECTION == DESTINATION)) |
| gawas | 0:ccdea31d8eba | 104 | { |
| gawas | 0:ccdea31d8eba | 105 | /* Not a valid destination */ |
| gawas | 0:ccdea31d8eba | 106 | continue; |
| gawas | 0:ccdea31d8eba | 107 | } |
| gawas | 0:ccdea31d8eba | 108 | |
| gawas | 0:ccdea31d8eba | 109 | if (port->q_buf.NB_MESSAGE >= port->q_buf.MAX_NB_MESSAGE) { |
| gawas | 0:ccdea31d8eba | 110 | /* Too many messages in buffer. */ |
| gawas | 0:ccdea31d8eba | 111 | continue; |
| gawas | 0:ccdea31d8eba | 112 | } |
| gawas | 0:ccdea31d8eba | 113 | |
| gawas | 0:ccdea31d8eba | 114 | if (LENGTH > port->q_buf.MAX_MESSAGE_SIZE) { |
| gawas | 0:ccdea31d8eba | 115 | /* Message too long. */ |
| gawas | 0:ccdea31d8eba | 116 | continue; |
| gawas | 0:ccdea31d8eba | 117 | } |
| gawas | 0:ccdea31d8eba | 118 | |
| gawas | 0:ccdea31d8eba | 119 | if (push_item(&port->q_buf.circ_buf, (uint8_t *)MESSAGE_ADDR, LENGTH)) { |
| gawas | 0:ccdea31d8eba | 120 | /* We should get clear on the action to take |
| gawas | 0:ccdea31d8eba | 121 | when destination buffer is full. */ |
| gawas | 0:ccdea31d8eba | 122 | continue; |
| gawas | 0:ccdea31d8eba | 123 | } |
| gawas | 0:ccdea31d8eba | 124 | |
| gawas | 0:ccdea31d8eba | 125 | ++port->q_buf.NB_MESSAGE; |
| gawas | 0:ccdea31d8eba | 126 | message_sent = true; |
| gawas | 0:ccdea31d8eba | 127 | } |
| gawas | 0:ccdea31d8eba | 128 | |
| gawas | 0:ccdea31d8eba | 129 | if (message_sent) { |
| gawas | 0:ccdea31d8eba | 130 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 131 | } else { |
| gawas | 0:ccdea31d8eba | 132 | /* No destination ports */ |
| gawas | 0:ccdea31d8eba | 133 | *RETURN_CODE = NO_ACTION; |
| gawas | 0:ccdea31d8eba | 134 | } |
| gawas | 0:ccdea31d8eba | 135 | } |
| gawas | 0:ccdea31d8eba | 136 | |
| gawas | 0:ccdea31d8eba | 137 | |
| gawas | 0:ccdea31d8eba | 138 | void recieve_queuing_message( |
| gawas | 0:ccdea31d8eba | 139 | /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 140 | /*in */ SYSTEM_TIME_TYPE TIME_OUT, |
| gawas | 0:ccdea31d8eba | 141 | /*out*/ MESSAGE_ADDR_TYPE MESSAGE_ADDR, |
| gawas | 0:ccdea31d8eba | 142 | /*out*/ MESSAGE_SIZE_TYPE *LENGTH, |
| gawas | 0:ccdea31d8eba | 143 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 144 | { |
| gawas | 0:ccdea31d8eba | 145 | (void)TIME_OUT; /* Unused parameter */ |
| gawas | 0:ccdea31d8eba | 146 | |
| gawas | 0:ccdea31d8eba | 147 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 148 | |
| gawas | 0:ccdea31d8eba | 149 | /* Return error if invalid QUEUING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 150 | if (QUEUING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 151 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 152 | return; |
| gawas | 0:ccdea31d8eba | 153 | } |
| gawas | 0:ccdea31d8eba | 154 | |
| gawas | 0:ccdea31d8eba | 155 | port_t *port = &this_partition->ports[QUEUING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 156 | |
| gawas | 0:ccdea31d8eba | 157 | if (pop_item(&port->q_buf.circ_buf, MESSAGE_ADDR, (size_t *)LENGTH)) { |
| gawas | 0:ccdea31d8eba | 158 | *RETURN_CODE = NO_ACTION; |
| gawas | 0:ccdea31d8eba | 159 | } else { |
| gawas | 0:ccdea31d8eba | 160 | --port->q_buf.NB_MESSAGE; |
| gawas | 0:ccdea31d8eba | 161 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 162 | } |
| gawas | 0:ccdea31d8eba | 163 | } |
| gawas | 0:ccdea31d8eba | 164 | |
| gawas | 0:ccdea31d8eba | 165 | |
| gawas | 0:ccdea31d8eba | 166 | void get_queuing_port_id( |
| gawas | 0:ccdea31d8eba | 167 | /*in */ QUEUING_PORT_NAME_TYPE QUEUING_PORT_NAME, |
| gawas | 0:ccdea31d8eba | 168 | /*out*/ QUEUING_PORT_ID_TYPE *QUEUING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 169 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 170 | { |
| gawas | 0:ccdea31d8eba | 171 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 172 | port_t *ports = this_partition->ports; |
| gawas | 0:ccdea31d8eba | 173 | |
| gawas | 0:ccdea31d8eba | 174 | for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 175 | if (!strcmp(ports[n].portname, QUEUING_PORT_NAME)) { |
| gawas | 0:ccdea31d8eba | 176 | *QUEUING_PORT_ID = n; |
| gawas | 0:ccdea31d8eba | 177 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 178 | return; |
| gawas | 0:ccdea31d8eba | 179 | } |
| gawas | 0:ccdea31d8eba | 180 | } |
| gawas | 0:ccdea31d8eba | 181 | |
| gawas | 0:ccdea31d8eba | 182 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 183 | } |
| gawas | 0:ccdea31d8eba | 184 | |
| gawas | 0:ccdea31d8eba | 185 | |
| gawas | 0:ccdea31d8eba | 186 | void get_queuing_port_status( |
| gawas | 0:ccdea31d8eba | 187 | /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 188 | /*out*/ QUEUING_PORT_STATUS_TYPE *QUEUING_PORT_STATUS, |
| gawas | 0:ccdea31d8eba | 189 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 190 | { |
| gawas | 0:ccdea31d8eba | 191 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 192 | |
| gawas | 0:ccdea31d8eba | 193 | /* Return error if invalid QUEUING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 194 | if (QUEUING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 195 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 196 | return; |
| gawas | 0:ccdea31d8eba | 197 | } |
| gawas | 0:ccdea31d8eba | 198 | |
| gawas | 0:ccdea31d8eba | 199 | port_t port = this_partition->ports[QUEUING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 200 | |
| gawas | 0:ccdea31d8eba | 201 | QUEUING_PORT_STATUS->NB_MESSAGE = port.q_buf.NB_MESSAGE; |
| gawas | 0:ccdea31d8eba | 202 | QUEUING_PORT_STATUS->MAX_NB_MESSAGE = port.q_buf.MAX_NB_MESSAGE; |
| gawas | 0:ccdea31d8eba | 203 | QUEUING_PORT_STATUS->MAX_MESSAGE_SIZE = port.q_buf.MAX_MESSAGE_SIZE; |
| gawas | 0:ccdea31d8eba | 204 | QUEUING_PORT_STATUS->PORT_DIRECTION = port.q_buf.PORT_DIRECTION; |
| gawas | 0:ccdea31d8eba | 205 | |
| gawas | 0:ccdea31d8eba | 206 | /* A procedure is needed for QUEUING_PORT_STATUS->WAITING_PROCESSES */ |
| gawas | 0:ccdea31d8eba | 207 | |
| gawas | 0:ccdea31d8eba | 208 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 209 | } |
| gawas | 0:ccdea31d8eba | 210 |