halx
読み取り中…
検索中…
一致する文字列を見つけられません
thread.hpp
[詳解]
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <functional>
6#include <memory>
7#include <type_traits>
8
9#include <cmsis_os2.h>
10
11namespace halx::rtos {
12
13class Thread {
14private:
15 struct Deleter {
16 void operator()(osThreadId_t thread_id) { osThreadTerminate(thread_id); }
17 };
18
19 using ThreadId =
20 std::unique_ptr<std::remove_pointer_t<osThreadId_t>, Deleter>;
21
22public:
23 Thread(void (*func)(void *), void *args, size_t stack_size,
24 osPriority_t priority, uint32_t attr_bits = 0) {
25 osThreadAttr_t attr{};
26 attr.stack_size = stack_size;
27 attr.priority = priority;
28 attr.attr_bits = attr_bits;
29 thread_id_ = ThreadId{osThreadNew(func, args, &attr)};
30 }
31
32 Thread(std::function<void()> &&func, size_t stack_size, osPriority_t priority,
33 uint32_t attr_bits = 0)
34 : func_{std::move(func)} {
35 osThreadAttr_t attr{};
36 attr.stack_size = stack_size;
37 attr.priority = priority;
38 attr.attr_bits = attr_bits;
39 thread_id_ = ThreadId{osThreadNew(
40 [](void *args) {
41 auto func = reinterpret_cast<std::function<void()> *>(args);
42 (*func)();
43 },
44 &func_, &attr)};
45 }
46
47 bool detach() { return osThreadDetach(thread_id_.get()) == osOK; }
48
49 bool join() { return osThreadJoin(thread_id_.get()) == osOK; }
50
51private:
52 ThreadId thread_id_;
53 std::function<void()> func_;
54};
55
56} // namespace halx::rtos
Thread(void(*func)(void *), void *args, size_t stack_size, osPriority_t priority, uint32_t attr_bits=0)
Definition thread.hpp:23
bool detach()
Definition thread.hpp:47
bool join()
Definition thread.hpp:49
Thread(std::function< void()> &&func, size_t stack_size, osPriority_t priority, uint32_t attr_bits=0)
Definition thread.hpp:32
Definition mutex.hpp:9