Skip to content

Commit 8b6b310

Browse files
committed
Allow multiple receive tasks on channel.
1 parent 8218e44 commit 8b6b310

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

Scheduler/Channel.h

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
class Channel {
2525
public:
2626
/**
27-
* Initiate channel.
27+
* Initiate channel for message passing between tasks.
2828
*/
2929
Channel() :
3030
m_buf(NULL),
@@ -45,12 +45,17 @@ class Channel {
4545
*/
4646
int send(const void* buf, size_t size)
4747
{
48+
// Take a ticket and wait for service
4849
uint8_t ticket = m_ticket++;
49-
await(ticket == m_serving && m_max > 0 && m_size == 0);
50+
await(ticket == m_serving && m_buf != NULL);
51+
52+
// Check that the receiver buffer can hold the message
5053
if (size > m_max) {
5154
m_serving += 1;
5255
return (-1);
5356
}
57+
58+
// Copy message to receiver buffer
5459
memcpy(m_buf, buf, size);
5560
m_size = size;
5661
return (size);
@@ -65,20 +70,30 @@ class Channel {
6570
*/
6671
int recv(void* buf, size_t size)
6772
{
73+
// Wait for the channel to be free for receive
74+
await(m_buf == NULL);
6875
m_buf = buf;
6976
m_max = size;
7077
m_size = 0;
78+
79+
// Wait for message from sender
7180
await(m_size != 0);
81+
int res = m_size;
82+
m_buf = NULL;
83+
m_max = 0;
84+
m_size = 0;
7285
m_serving += 1;
86+
87+
// Return size of received message
7388
return (m_size);
7489
}
7590

7691
protected:
77-
void* m_buf;
78-
volatile size_t m_max;
79-
volatile size_t m_size;
80-
volatile uint8_t m_ticket;
81-
volatile uint8_t m_serving;
92+
void* m_buf; //!< Message buffer
93+
volatile size_t m_max; //!< Max message size
94+
volatile size_t m_size; //!< Actual message size
95+
volatile uint8_t m_ticket; //!< Sender ticket
96+
volatile uint8_t m_serving; //!< Next sender ticket
8297
};
8398

8499
#endif

examples/SchedulerChannel/SchedulerChannel.ino

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ void setup()
3535
Scheduler.start(NULL, messageSender);
3636
Scheduler.start(NULL, messageSender);
3737
Scheduler.start(NULL, messageReceiver);
38+
Scheduler.start(NULL, messageReceiver);
3839
}
3940

4041
void loop()
@@ -59,7 +60,7 @@ void messageSender()
5960
Serial.print(millis());
6061
Serial.print(F(":messageSender#"));
6162
Serial.print(msg.ref);
62-
Serial.print(F("::send msg="));
63+
Serial.print(F("::send msg.nr="));
6364
Serial.println(msg.nr);
6465
chan.send(&msg, sizeof(msg));
6566
msg.nr += 1;
@@ -72,9 +73,11 @@ void messageReceiver()
7273
msg_t msg;
7374
chan.recv(&msg, sizeof(msg));
7475
Serial.print(millis());
75-
Serial.print(F(":messageReceiver::receive msg="));
76+
Serial.print(F(":messageReceiver#"));
77+
Serial.print((int) &msg);
78+
Serial.print(F("::receive msg.ref="));
7679
Serial.print(msg.ref);
77-
Serial.print(':');
80+
Serial.print(F(", msg.nr="));
7881
Serial.println(msg.nr);
7982
delay(random(1000));
8083
}

0 commit comments

Comments
 (0)