One Framework
0.1.0
RoboMaster嵌入式框架“一键”解决方案,为你的“创意”服务。
载入中...
搜索中...
未找到
SeqlockBuf.hpp
浏览该文件的文档.
1
#ifndef OF_DOUBLEBUFFER_HPP
2
#define OF_DOUBLEBUFFER_HPP
3
4
#include <functional>
5
6
#include <zephyr/sys/atomic.h>
7
#include <zephyr/kernel.h>
8
9
namespace
OF
10
{
11
12
template
<
typename
T>
13
class
SeqlockBuf
14
{
15
public
:
16
// no lock
17
void
write
(
const
T& val)
18
{
19
// 1. version + 1 (odd), writing...
20
atomic_inc(&m_version);
21
22
// 2. writing data
23
compiler_barrier();
24
m_data = val;
25
compiler_barrier();
26
27
// 3. version + 1 (even),written done.
28
atomic_inc(&m_version);
29
}
30
31
template
<
typename
Func>
32
void
manipulate
(Func& func)
33
{
34
// 1. version + 1 (odd), writing...
35
atomic_inc(&m_version);
36
37
// 2. manipulate data
38
compiler_barrier();
39
func(m_data);
40
compiler_barrier();
41
42
// 3. version + 1 (even),written done.
43
atomic_inc(&m_version);
44
};
45
46
// optimistic reading
47
T
read
()
48
{
49
T val;
50
uint32_t v1, v2{};
51
do
52
{
53
// 1. get version
54
v1 = atomic_get(&m_version);
55
56
// odd -> someone's writing, keep waiting...
57
if
(v1 & 1)
58
{
59
k_yield();
60
continue
;
61
}
62
63
// 2. copy data
64
compiler_barrier();
65
val = m_data;
66
compiler_barrier();
67
68
// 3. get version again
69
v2 = atomic_get(&m_version);
70
71
// 4. version changed(v1 != v2) means data corrupted, retry.
72
}
73
while
(v1 != v2);
74
75
return
val;
76
}
77
78
private
:
79
T m_data{};
80
atomic_t m_version = ATOMIC_INIT(0);
81
};
82
};
83
84
#endif
//OF_DOUBLEBUFFER_HPP
OF::SeqlockBuf
定义
SeqlockBuf.hpp:14
OF::SeqlockBuf::read
T read()
定义
SeqlockBuf.hpp:47
OF::SeqlockBuf::manipulate
void manipulate(Func &func)
定义
SeqlockBuf.hpp:32
OF::SeqlockBuf::write
void write(const T &val)
定义
SeqlockBuf.hpp:17
OF
定义
Mecanum.hpp:6
OF
utils
SeqlockBuf.hpp
制作者
1.13.2