| // Copyright 2021 The Pigweed Authors |
| // |
| // 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 |
| // |
| // https://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. |
| #pragma once |
| |
| #include "RTOS.h" |
| #include "pw_assert/assert.h" |
| #include "pw_thread/thread.h" |
| #include "pw_thread_embos/config.h" |
| #include "pw_thread_embos/context.h" |
| |
| namespace pw::thread::embos { |
| |
| // pw::thread::Options for FreeRTOS. |
| // |
| // Example usage: |
| // |
| // // Uses the default priority, but specifies a custom name and context. |
| // pw::thread::Thread example_thread( |
| // pw::thread::embos::Options() |
| // .set_name("example_thread"), |
| // .set_context(static_example_thread_context), |
| // example_thread_function); |
| // |
| // // Provides the name, priority, and pre-allocated context. |
| // pw::thread::Thread static_example_thread( |
| // pw::thread::embos::Options() |
| // .set_name("static_example_thread") |
| // .set_priority(kFooPriority) |
| // .set_context(static_example_thread_context), |
| // example_thread_function); |
| // |
| class Options : public thread::Options { |
| public: |
| constexpr Options() = default; |
| constexpr Options(const Options&) = default; |
| constexpr Options(Options&& other) = default; |
| |
| // Sets the name for the embOS task, this is optional. |
| // Note that this will be deep copied into the context and may be truncated |
| // based on PW_THREAD_EMBOS_CONFIG_MAX_THREAD_NAME_LEN. |
| constexpr Options& set_name(const char* name) { |
| name_ = name; |
| return *this; |
| } |
| |
| // Sets the priority for the embOS task. Higher values are higher priority, |
| // see embOS OS_CreateTaskEx for more detail. |
| // |
| // Precondition: This must be >= PW_THREAD_EMBOS_CONFIG_MIN_PRIORITY. |
| constexpr Options& set_priority(OS_PRIO priority) { |
| PW_DASSERT(priority >= config::kMinimumPriority); |
| priority_ = priority; |
| return *this; |
| } |
| |
| // Sets the number of ticks this thread is allowed to run before other ready |
| // threads of the same priority are given a chance to run. |
| // |
| // A value of 0 disables time-slicing of this thread. |
| // |
| // Precondition: This must be <= 255 ticks. |
| constexpr Options& set_time_slice_interval(OS_UINT time_slice_interval) { |
| PW_DASSERT(time_slice_interval <= 255); |
| time_slice_interval_ = time_slice_interval; |
| return *this; |
| } |
| |
| // Set the pre-allocated context (all memory needed to run a thread), see the |
| // pw::thread::embos::Context for more detail. |
| constexpr Options& set_context(Context& context) { |
| context_ = &context; |
| return *this; |
| } |
| |
| private: |
| friend thread::Thread; |
| |
| const char* name() const { return name_; } |
| OS_PRIO priority() const { return priority_; } |
| OS_PRIO time_slice_interval() const { return time_slice_interval_; } |
| Context* context() const { return context_; } |
| |
| const char* name_ = nullptr; |
| OS_PRIO priority_ = config::kDefaultPriority; |
| OS_PRIO time_slice_interval_ = config::kDefaultTimeSliceInterval; |
| Context* context_ = nullptr; |
| }; |
| |
| } // namespace pw::thread::embos |