From 641c09157ebe25590e0ba378f70f05fc7466b8b1 Mon Sep 17 00:00:00 2001 From: Kristofer Jonsson Date: Mon, 31 Aug 2020 11:34:14 +0200 Subject: Moving message- and inference processes to core software Change-Id: I76e94440402d58848116d06ff3fd1ed2000ac505 --- .../message_process/include/message_process.hpp | 90 ++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 applications/message_process/include/message_process.hpp (limited to 'applications/message_process/include') diff --git a/applications/message_process/include/message_process.hpp b/applications/message_process/include/message_process.hpp new file mode 100644 index 0000000..8044f7c --- /dev/null +++ b/applications/message_process/include/message_process.hpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Arm Limited. All rights reserved. + * + * 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_PROCESS_H +#define MESSAGE_PROCESS_H + +#include +#include + +#include +#include + +namespace MessageProcess { + +template +struct Queue { + ethosu_core_queue_header header; + uint8_t data[SIZE]; + + constexpr Queue() : header({SIZE, 0, 0}) {} + + constexpr ethosu_core_queue *toQueue() { + return reinterpret_cast(&header); + } +}; + +class QueueImpl { +public: + struct Vec { + const void *base; + size_t length; + }; + + QueueImpl(ethosu_core_queue &queue); + + bool empty() const; + size_t available() const; + size_t capacity() const; + bool read(uint8_t *dst, uint32_t length); + bool write(const Vec *vec, size_t length); + bool write(const uint32_t type, const void *src = nullptr, uint32_t length = 0); + + template + bool read(T &dst) { + return read(reinterpret_cast(&dst), sizeof(dst)); + } + + template + bool write(const uint32_t type, const T &src) { + return write(type, reinterpret_cast(&src), sizeof(src)); + } + +private: + ethosu_core_queue &queue; +}; + +class MessageProcess { +public: + MessageProcess(ethosu_core_queue &in, ethosu_core_queue &out, InferenceProcess::InferenceProcess &inferenceProcess); + + void run(); + void handleIrq(); + bool handleMessage(); + void sendPong(); + void sendInferenceRsp(uint64_t userArg, size_t ofmSize, bool failed); + +private: + QueueImpl queueIn; + QueueImpl queueOut; + InferenceProcess::InferenceProcess &inferenceProcess; +}; + +} // namespace MessageProcess + +#endif -- cgit v1.2.1