aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler/message_handler.hpp
diff options
context:
space:
mode:
authorDavide Grohmann <davide.grohmann@arm.com>2022-04-25 12:21:12 +0200
committerDavide Grohmann <davide.grohmann@arm.com>2022-05-02 09:40:53 +0200
commit134c39e5e95725d2f79ed2b8cf215d336cc46cd0 (patch)
tree10a9d6869a17346c7e8e53dd0490682dff430e74 /applications/message_handler/message_handler.hpp
parent2c76ec76ec46a4a7a80c34559b6e41c001c765a9 (diff)
downloadethos-u-core-platform-134c39e5e95725d2f79ed2b8cf215d336cc46cd0.tar.gz
Avoid blocking calls in input message handler task
Remove output queue and associated blocking calls. Instead write directly in the mailbox ring buffer. If inference queue is full do not block, instead bail out immeditely and send back a message with rejected status. Change-Id: Id08a39792791fe383f8c01bf28b07a293a49e9b0
Diffstat (limited to 'applications/message_handler/message_handler.hpp')
-rw-r--r--applications/message_handler/message_handler.hpp76
1 files changed, 29 insertions, 47 deletions
diff --git a/applications/message_handler/message_handler.hpp b/applications/message_handler/message_handler.hpp
index b7152f7..60787e8 100644
--- a/applications/message_handler/message_handler.hpp
+++ b/applications/message_handler/message_handler.hpp
@@ -39,82 +39,64 @@ namespace MessageHandler {
class IncomingMessageHandler {
public:
- IncomingMessageHandler(EthosU::ethosu_core_queue &messageQueue,
+ IncomingMessageHandler(EthosU::ethosu_core_queue &inputMessageQueue,
+ EthosU::ethosu_core_queue &outputMessageQueue,
Mailbox::Mailbox &mailbox,
- QueueHandle_t inferenceQueue,
- QueueHandle_t outputQueue);
+ QueueHandle_t inferenceInputQueue,
+ QueueHandle_t inferenceOutputQueue,
+ SemaphoreHandle_t messageNotify);
void run();
private:
bool handleMessage();
- void queueErrorAndResetQueue(EthosU::ethosu_core_msg_err_type type, const char *message);
+ bool handleInferenceOutput();
static void handleIrq(void *userArg);
- MessageQueue::QueueImpl messageQueue;
+ void sendPong();
+ void sendErrorAndResetQueue(EthosU::ethosu_core_msg_err_type type, const char *message);
+ void sendVersionRsp();
+ void sendCapabilitiesRsp(uint64_t userArg);
+ void sendNetworkInfoRsp(uint64_t userArg, EthosU::ethosu_core_network_buffer &network);
+ void sendInferenceRsp(EthosU::ethosu_core_inference_rsp &inference);
+ void sendFailedInferenceRsp(uint64_t userArg, uint32_t status);
+ void readCapabilties(EthosU::ethosu_core_msg_capabilities_rsp &rsp);
+
+ MessageQueue::QueueImpl inputMessageQueue;
+ MessageQueue::QueueImpl outputMessageQueue;
Mailbox::Mailbox &mailbox;
InferenceProcess::InferenceParser parser;
- QueueHandle_t inferenceQueue;
- QueueHandle_t outputQueue;
- SemaphoreHandle_t semaphore;
+ QueueHandle_t inferenceInputQueue;
+ QueueHandle_t inferenceOutputQueue;
+ SemaphoreHandle_t messageNotify;
+ EthosU::ethosu_core_msg_capabilities_rsp capabilities;
};
class InferenceHandler {
public:
- InferenceHandler(uint8_t *tensorArena, size_t arenaSize, QueueHandle_t inferenceQueue, QueueHandle_t outputQueue);
+ InferenceHandler(uint8_t *tensorArena,
+ size_t arenaSize,
+ QueueHandle_t inferenceInputQueue,
+ QueueHandle_t inferenceOutputQueue,
+ SemaphoreHandle_t messageNotify);
void run();
private:
void runInference(EthosU::ethosu_core_inference_req &req, EthosU::ethosu_core_inference_rsp &rsp);
-
bool getInferenceJob(const EthosU::ethosu_core_inference_req &req, InferenceProcess::InferenceJob &job);
#if defined(ETHOSU)
friend void ::ethosu_inference_begin(struct ethosu_driver *drv, void *userArg);
friend void ::ethosu_inference_end(struct ethosu_driver *drv, void *userArg);
#endif
-
- QueueHandle_t inferenceQueue;
- QueueHandle_t outputQueue;
+ QueueHandle_t inferenceInputQueue;
+ QueueHandle_t inferenceOutputQueue;
+ SemaphoreHandle_t messageNotify;
InferenceProcess::InferenceProcess inference;
EthosU::ethosu_core_inference_req *currentReq;
EthosU::ethosu_core_inference_rsp *currentRsp;
};
-struct OutputMessage {
- OutputMessage(EthosU::ethosu_core_msg_type _type = EthosU::ETHOSU_CORE_MSG_MAX) : type(_type) {}
-
- EthosU::ethosu_core_msg_type type;
- union {
- EthosU::ethosu_core_inference_rsp inference;
- EthosU::ethosu_core_network_info_rsp networkInfo;
- EthosU::ethosu_core_msg_err error;
- uint64_t userArg;
- } data;
-};
-
-class OutgoingMessageHandler {
-public:
- OutgoingMessageHandler(EthosU::ethosu_core_queue &messageQueue,
- Mailbox::Mailbox &mailbox,
- QueueHandle_t outputQueue);
- void run();
-
-private:
- void sendPong();
- void sendErrorRsp(EthosU::ethosu_core_msg_err &error);
- void sendVersionRsp();
- void sendCapabilitiesRsp(uint64_t userArg);
- void sendInferenceRsp(EthosU::ethosu_core_inference_rsp &inference);
- void sendNetworkInfoRsp(EthosU::ethosu_core_network_info_rsp &networkInfo);
- void readCapabilties(EthosU::ethosu_core_msg_capabilities_rsp &rsp);
-
- MessageQueue::QueueImpl messageQueue;
- Mailbox::Mailbox &mailbox;
- QueueHandle_t outputQueue;
- EthosU::ethosu_core_msg_capabilities_rsp capabilities;
-};
-
} // namespace MessageHandler
#endif