libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
thread.hpp
1#pragma once
2
3#include "libxr_system.hpp"
4#include "libxr_time.hpp"
5#include "logger.hpp"
6
7namespace LibXR
8{
13class Thread
14{
15 public:
20 enum class Priority : uint8_t
21 {
22 IDLE,
23 LOW,
24 MEDIUM,
25 HIGH,
26 REALTIME,
27 NUMBER,
28 };
29
34 Thread() {};
35
42
63 template <typename ArgType>
64 void Create(ArgType arg, void (*function)(ArgType arg), const char *name,
66 {
69
70 // 线程栈大小设定,确保不小于 1
71 if (stack_depth > 256)
72 {
74 }
75 else
76 {
78 }
79
84 class ThreadBlock
85 {
86 public:
94 ThreadBlock(typeof(function) fun, ArgType arg, const char *name)
95 : fun_(fun),
96 arg_(arg),
97 name_(reinterpret_cast<char *>(malloc(strlen(name) + 1)))
98 {
99 strcpy(name_, name);
100 }
101
109 static void *Port(void *arg)
110 {
111 ThreadBlock *block = static_cast<ThreadBlock *>(arg);
112 volatile const char *thread_name = block->name_;
113 block->fun_(block->arg_);
114
115 UNUSED(thread_name);
116 return static_cast<void *>(nullptr);
117 }
118
119 typeof(function) fun_;
120 ArgType arg_;
121 char *name_;
122 };
123
124 auto block = new ThreadBlock(function, arg, name);
125
126 // 优先尝试设置 SCHED_FIFO 和线程优先级
129 bool scheduling_set = false;
130
131 if (max_priority - min_priority >= static_cast<int>(Priority::REALTIME))
132 {
135
136 struct sched_param sp;
137 memset(&sp, 0, sizeof(sp));
138 sp.sched_priority = min_priority + static_cast<int>(priority);
139
141 {
142 scheduling_set = true;
143 }
144 else
145 {
146 XR_LOG_WARN("Failed to set thread priority. Falling back to default policy.");
149 }
150 }
151 else
152 {
153 XR_LOG_WARN(
154 "SCHED_FIFO not supported or insufficient range. Using default policy.");
156 }
157
158 // 创建线程
159 if (auto ans = pthread_create(&this->thread_handle_, &attr, block->Port, block) != 0)
160 {
161 XR_LOG_WARN("Failed to create thread: %s (%s), Falling back to default policy.",
162 name, strerror(ans));
165 if (auto ans =
166 pthread_create(&this->thread_handle_, &attr, block->Port, block) != 0)
167 {
168 XR_LOG_ERROR("Failed to create thread: %s (%s)", ans);
169 }
170 }
171
173 }
174
180 static Thread Current(void);
181
188
195
203
208 static void Yield();
209
215 operator libxr_thread_handle() { return thread_handle_; }
216
217 private:
219};
220
221} // namespace LibXR
线程管理类,封装 FreeRTOS 任务创建和调度 Thread management class encapsulating FreeRTOS task creation and scheduling
Definition thread.hpp:15
Thread(libxr_thread_handle handle)
通过 POSIX 线程句柄创建线程对象 Constructor to create a thread object from a POSIX thread handle
Definition thread.hpp:41
static void Sleep(uint32_t milliseconds)
让线程进入休眠状态 Puts the thread to sleep
Thread()
默认构造函数,初始化空线程 Default constructor initializing an empty thread
Definition thread.hpp:34
Priority
线程优先级枚举 Enumeration for thread priorities
Definition thread.hpp:21
@ NUMBER
优先级数量 Number of priority levels
@ LOW
低优先级 Low priority
@ REALTIME
实时优先级 Realtime priority
@ IDLE
空闲优先级 Idle priority
@ HIGH
高优先级 High priority
@ MEDIUM
中等优先级 Medium priority
libxr_thread_handle thread_handle_
FreeRTOS 线程句柄 FreeRTOS thread handle.
Definition thread.hpp:136
void Create(ArgType arg, void(*function)(ArgType arg), const char *name, size_t stack_depth, Thread::Priority priority)
创建新线程 Creates a new thread
Definition thread.hpp:64
static void Yield()
让出 CPU 以执行其他线程 Yields CPU execution to allow other threads to run
static uint32_t GetTime()
获取当前系统时间(毫秒) Gets the current system time in milliseconds
static void SleepUntil(TimestampMS &last_waskup_time, uint32_t time_to_sleep)
让线程休眠直到指定时间点 Puts the thread to sleep until a specified time
static Thread Current(void)
获取当前线程对象 Gets the current thread object
表示毫秒级时间戳的类。Class representing a timestamp in milliseconds.
LibXR Color Control Library / LibXR终端颜色控制库
TaskHandle_t libxr_thread_handle
线程句柄类型定义 Thread handle type definition
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值