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
9namespace OF
10{
11
12 template <typename T>
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
定义 SeqlockBuf.hpp:14
T read()
定义 SeqlockBuf.hpp:47
void manipulate(Func &func)
定义 SeqlockBuf.hpp:32
void write(const T &val)
定义 SeqlockBuf.hpp:17
定义 Mecanum.hpp:6