aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler/lib/include
diff options
context:
space:
mode:
Diffstat (limited to 'applications/message_handler/lib/include')
-rw-r--r--applications/message_handler/lib/include/message_handler.hpp187
-rw-r--r--applications/message_handler/lib/include/message_queue.hpp74
-rw-r--r--applications/message_handler/lib/include/networks.hpp64
3 files changed, 0 insertions, 325 deletions
diff --git a/applications/message_handler/lib/include/message_handler.hpp b/applications/message_handler/lib/include/message_handler.hpp
deleted file mode 100644
index 98875f4..0000000
--- a/applications/message_handler/lib/include/message_handler.hpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2020-2022 Arm Limited.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef MESSAGE_HANDLER_H
-#define MESSAGE_HANDLER_H
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-
-#include "message_queue.hpp"
-#include "networks.hpp"
-#include <ethosu_core_interface.h>
-#if defined(ETHOSU)
-#include <ethosu_driver.h>
-#endif
-#include <inference_parser.hpp>
-#include <inference_process.hpp>
-#include <mailbox.hpp>
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdio>
-#include <inttypes.h>
-#include <list>
-#include <vector>
-
-namespace MessageHandler {
-
-template <typename T, size_t capacity = 5>
-class Queue {
-public:
- using Predicate = std::function<bool(const T &data)>;
-
- Queue() {
- mutex = xSemaphoreCreateMutex();
- size = xSemaphoreCreateCounting(capacity, 0u);
-
- if (mutex == nullptr || size == nullptr) {
- printf("Error: failed to allocate memory for inference queue\n");
- }
- }
-
- ~Queue() {
- vSemaphoreDelete(mutex);
- vSemaphoreDelete(size);
- }
-
- bool push(const T &data) {
- xSemaphoreTake(mutex, portMAX_DELAY);
- if (list.size() >= capacity) {
- xSemaphoreGive(mutex);
- return false;
- }
-
- list.push_back(data);
- xSemaphoreGive(mutex);
-
- // increase number of available inferences to pop
- xSemaphoreGive(size);
- return true;
- }
-
- void pop(T &data) {
- // decrease the number of available inferences to pop
- xSemaphoreTake(size, portMAX_DELAY);
-
- xSemaphoreTake(mutex, portMAX_DELAY);
- data = list.front();
- list.pop_front();
- xSemaphoreGive(mutex);
- }
-
- bool erase(Predicate pred) {
- // let's optimistically assume we are removing an inference, so decrease pop
- if (pdFALSE == xSemaphoreTake(size, 0)) {
- // if there are no inferences return immediately
- return false;
- }
-
- xSemaphoreTake(mutex, portMAX_DELAY);
- auto found = std::find_if(list.begin(), list.end(), pred);
- bool erased = found != list.end();
- if (erased) {
- list.erase(found);
- }
- xSemaphoreGive(mutex);
-
- if (!erased) {
- // no inference erased, so let's put the size count back
- xSemaphoreGive(size);
- }
-
- return erased;
- }
-
-private:
- std::list<T> list;
-
- SemaphoreHandle_t mutex;
- SemaphoreHandle_t size;
-};
-
-class IncomingMessageHandler {
-public:
- IncomingMessageHandler(EthosU::ethosu_core_queue &inputMessageQueue,
- EthosU::ethosu_core_queue &outputMessageQueue,
- Mailbox::Mailbox &mailbox,
- std::shared_ptr<Queue<EthosU::ethosu_core_inference_req>> inferenceInputQueue,
- QueueHandle_t inferenceOutputQueue,
- SemaphoreHandle_t messageNotify,
- std::shared_ptr<Networks> networks);
-
- void run();
-
-private:
- bool handleMessage();
- bool handleInferenceOutput();
- static void handleIrq(void *userArg);
-
- 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 sendCancelInferenceRsp(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;
- std::shared_ptr<Queue<EthosU::ethosu_core_inference_req>> inferenceInputQueue;
- QueueHandle_t inferenceOutputQueue;
- SemaphoreHandle_t messageNotify;
- EthosU::ethosu_core_msg_capabilities_rsp capabilities;
- std::shared_ptr<Networks> networks;
-};
-
-class InferenceHandler {
-public:
- InferenceHandler(uint8_t *tensorArena,
- size_t arenaSize,
- std::shared_ptr<Queue<EthosU::ethosu_core_inference_req>> inferenceInputQueue,
- QueueHandle_t inferenceOutputQueue,
- SemaphoreHandle_t messageNotify,
- std::shared_ptr<Networks> networks);
-
- 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
- std::shared_ptr<Queue<EthosU::ethosu_core_inference_req>> inferenceInputQueue;
- QueueHandle_t inferenceOutputQueue;
- SemaphoreHandle_t messageNotify;
- InferenceProcess::InferenceProcess inference;
- EthosU::ethosu_core_inference_req *currentReq;
- EthosU::ethosu_core_inference_rsp *currentRsp;
- std::shared_ptr<Networks> networks;
-};
-
-} // namespace MessageHandler
-
-#endif
diff --git a/applications/message_handler/lib/include/message_queue.hpp b/applications/message_handler/lib/include/message_queue.hpp
deleted file mode 100644
index ec9d7b6..0000000
--- a/applications/message_handler/lib/include/message_queue.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2020-2022 Arm Limited.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef MESSAGE_QUEUE_H
-#define MESSAGE_QUEUE_H
-
-#include <cstddef>
-#include <ethosu_core_interface.h>
-
-namespace MessageQueue {
-
-template <uint32_t SIZE>
-struct Queue {
- EthosU::ethosu_core_queue_header header;
- uint8_t data[SIZE];
-
- constexpr Queue() : header({SIZE, 0, {0}, 0}) {}
-
- constexpr EthosU::ethosu_core_queue *toQueue() {
- return reinterpret_cast<EthosU::ethosu_core_queue *>(&header);
- }
-};
-
-class QueueImpl {
-public:
- struct Vec {
- const void *base;
- size_t length;
- };
-
- QueueImpl(EthosU::ethosu_core_queue &queue);
-
- bool empty() const;
- size_t available() const;
- size_t capacity() const;
- void reset();
- bool read(uint8_t *dst, uint32_t length);
- template <typename T>
- bool read(T &dst) {
- return read(reinterpret_cast<uint8_t *>(&dst), sizeof(dst));
- }
- bool write(const Vec *vec, size_t length);
- bool write(const uint32_t type, const void *src = nullptr, uint32_t length = 0);
- template <typename T>
- bool write(const uint32_t type, const T &src) {
- return write(type, reinterpret_cast<const void *>(&src), sizeof(src));
- }
-
-private:
- void cleanHeader() const;
- void cleanHeaderData() const;
- void invalidateHeader() const;
- void invalidateHeaderData() const;
-
- EthosU::ethosu_core_queue &queue;
-};
-} // namespace MessageQueue
-
-#endif
diff --git a/applications/message_handler/lib/include/networks.hpp b/applications/message_handler/lib/include/networks.hpp
deleted file mode 100644
index eb01d10..0000000
--- a/applications/message_handler/lib/include/networks.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2022 Arm Limited.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NETWORKS_H
-#define NETWORKS_H
-
-#include <ethosu_core_interface.h>
-
-#include <cstdio>
-#include <inttypes.h>
-
-using namespace EthosU;
-
-namespace MessageHandler {
-
-class Networks {
-public:
- virtual ~Networks() {}
- virtual bool getNetwork(const ethosu_core_network_buffer &buffer, void *&data, size_t &size) = 0;
-};
-
-template <typename T>
-class BaseNetworks : public Networks {
-public:
- bool getNetwork(const ethosu_core_network_buffer &buffer, void *&data, size_t &size) override {
- switch (buffer.type) {
- case ETHOSU_CORE_NETWORK_BUFFER:
- data = reinterpret_cast<void *>(buffer.buffer.ptr);
- size = buffer.buffer.size;
- return false;
- case ETHOSU_CORE_NETWORK_INDEX:
- return T::getIndexedNetwork(buffer.index, data, size);
- default:
- printf("Error: Unsupported network model type. type=%" PRIu32 "\n", buffer.type);
- return true;
- }
- }
-};
-
-class NoIndexedNetworks : public BaseNetworks<NoIndexedNetworks> {
- static bool getIndexedNetwork(const uint32_t index, void *&data, size_t &size) {
- printf("Error: Network model index out of range. index=%" PRIu32 "\n", index);
- return true;
- }
-};
-
-} // namespace MessageHandler
-
-#endif