aboutsummaryrefslogtreecommitdiff
path: root/applications/message_handler/lib/include/message_handler.hpp
diff options
context:
space:
mode:
authorKristofer Jonsson <kristofer.jonsson@arm.com>2023-02-08 14:23:00 +0100
committerKristofer Jonsson <kristofer.jonsson@arm.com>2023-02-08 14:44:01 +0100
commit3f5510fa3444217a442ac2e63ae50b27c9c26cf3 (patch)
treedbf2f8bb631af6e3a67d512835e17395e8e07704 /applications/message_handler/lib/include/message_handler.hpp
parent87f6f7ebf5a51be7c819503894f486d05f2a8b31 (diff)
downloadethos-u-core-platform-3f5510fa3444217a442ac2e63ae50b27c9c26cf3.tar.gz
Updating message handler firmware23.02-rc1
The 'message handler' firmware was based on a custom interface between Linux and the firmware. Because the kernel driver has been converted into a rpmsg driver, the 'message handler' application has been updated into an OpenAMP based firmware. Change-Id: I1339180c4f53cbad42501a2827863b7b49561ff4
Diffstat (limited to 'applications/message_handler/lib/include/message_handler.hpp')
-rw-r--r--applications/message_handler/lib/include/message_handler.hpp187
1 files changed, 0 insertions, 187 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