From dc28b13e8bf4e5e7a788f289739e6301494c43a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85strand?= Date: Mon, 28 Sep 2020 13:02:18 +0200 Subject: Refactor code to avoid typepunning tricks Change-Id: Iecefa233561ddbef3e04f395f12fb56cd76ffd42 --- .../message_process/include/message_process.hpp | 10 ++++++ .../message_process/src/message_process.cc | 42 ++++++++++++++-------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/applications/message_process/include/message_process.hpp b/applications/message_process/include/message_process.hpp index 51f474d..e820b60 100644 --- a/applications/message_process/include/message_process.hpp +++ b/applications/message_process/include/message_process.hpp @@ -55,12 +55,22 @@ public: 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); + bool skip(uint32_t length); template bool read(T &dst) { return read(reinterpret_cast(&dst), sizeof(dst)); } + template + bool readOrSkip(T &dst, uint32_t expectedLength) { + if (expectedLength == sizeof(dst)) { + return read(reinterpret_cast(&dst), sizeof(dst)); + } else { + return skip(expectedLength); + } + } + template bool write(const uint32_t type, const T &src) { return write(type, reinterpret_cast(&src), sizeof(src)); diff --git a/applications/message_process/src/message_process.cc b/applications/message_process/src/message_process.cc index 1be6958..4333640 100644 --- a/applications/message_process/src/message_process.cc +++ b/applications/message_process/src/message_process.cc @@ -114,6 +114,22 @@ bool QueueImpl::write(const uint32_t type, const void *src, uint32_t length) { return write(vec, 2); } +bool QueueImpl::skip(uint32_t length) { + uint32_t rpos = queue.header.read; + + if (length > available()) { + return false; + } + + queue.header.read = (rpos + length) % queue.header.size; + +#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + SCB_CleanDCache(); +#endif + + return true; +} + MessageProcess::MessageProcess(ethosu_core_queue &in, ethosu_core_queue &out, ::InferenceProcess::InferenceProcess &_inferenceProcess) : @@ -137,10 +153,6 @@ void MessageProcess::handleIrq() { bool MessageProcess::handleMessage() { ethosu_core_msg msg; - union { - ethosu_core_inference_req inferenceReq; - uint8_t data[1000]; - } data; #if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) SCB_InvalidateDCache(); @@ -153,21 +165,18 @@ bool MessageProcess::handleMessage() { printf("Message. type=%" PRIu32 ", length=%" PRIu32 "\n", msg.type, msg.length); - // Read payload - if (!queueIn.read(data.data, msg.length)) { - printf("Failed to read payload.\n"); - return false; - } - switch (msg.type) { case ETHOSU_CORE_MSG_PING: printf("Ping\n"); sendPong(); break; case ETHOSU_CORE_MSG_INFERENCE_REQ: { - std::memcpy(&data.inferenceReq, data.data, sizeof(data.data)); + ethosu_core_inference_req req; - ethosu_core_inference_req &req = data.inferenceReq; + if (!queueIn.readOrSkip(req, msg.length)) { + printf("Failed to read payload.\n"); + return false; + } printf("InferenceReq. user_arg=0x%" PRIx64 ", network={0x%" PRIu32 ", %" PRIu32 "}", req.user_arg, @@ -212,11 +221,14 @@ bool MessageProcess::handleMessage() { bool failed = inferenceProcess.runJob(job); - sendInferenceRsp(data.inferenceReq.user_arg, job.output, failed); + sendInferenceRsp(req.user_arg, job.output, failed); break; } - default: - break; + default: { + printf("Unexpected message type: %" PRIu32 ", skipping %" PRIu32 " bytes\n", msg.type, msg.length); + + queueIn.skip(msg.length); + } break; } return true; -- cgit v1.2.1