更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_cir_buf.c 文件参考

浏览源代码.

函数

UINT32 LOS_CirBufUsedSize (CirBuf *cirbufCB)
 返回循环buf已使用的大小 更多...
 
STATIC UINT32 OsCirBufWriteLinear (CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
 
STATIC UINT32 OsCirBufWriteLoop (CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
 
UINT32 LOS_CirBufWrite (CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
 写入数据到循环buf区 更多...
 
STATIC UINT32 OsCirBufReadLinear (CirBuf *cirbufCB, CHAR *buf, UINT32 size)
 
STATIC UINT32 OsCirBufReadLoop (CirBuf *cirbufCB, CHAR *buf, UINT32 size)
 
UINT32 LOS_CirBufRead (CirBuf *cirbufCB, CHAR *buf, UINT32 size)
 读取循环buf的数据 更多...
 
UINT32 LOS_CirBufInit (CirBuf *cirbufCB, CHAR *fifo, UINT32 size)
 初始化循环buf 更多...
 
VOID LOS_CirBufDeinit (CirBuf *cirbufCB)
 删除初始化操作,其实就是清0 更多...
 

函数说明

◆ LOS_CirBufDeinit()

VOID LOS_CirBufDeinit ( CirBuf cirbufCB)

删除初始化操作,其实就是清0

在文件 los_cir_buf.c241 行定义.

242{
243 (VOID)memset_s(cirbufCB, sizeof(CirBuf), 0, sizeof(CirBuf));
244}
这是这个函数的调用关系图:

◆ LOS_CirBufInit()

UINT32 LOS_CirBufInit ( CirBuf cirbufCB,
CHAR fifo,
UINT32  size 
)

初始化循环buf

在文件 los_cir_buf.c225 行定义.

226{
227 if ((cirbufCB == NULL) || (fifo == NULL)) {
228 return LOS_NOK;
229 }
230
231 (VOID)memset_s(cirbufCB, sizeof(CirBuf), 0, sizeof(CirBuf));//清0
232 LOS_SpinInit(&cirbufCB->lock);//自旋锁初始化
233 cirbufCB->size = size; //记录size
234 cirbufCB->remain = size;//剩余size
235 cirbufCB->status = CBUF_USED;//标记为已使用
236 cirbufCB->fifo = fifo; //顺序buf ,这1K buf 是循环利用
237
238 return LOS_OK;
239}
@ CBUF_USED
Definition: los_cir_buf.h:47
VOID LOS_SpinInit(SPIN_LOCK_S *lock)
Definition: los_spinlock.c:37
SPIN_LOCK_S lock
Definition: los_cir_buf.h:55
UINT32 size
Definition: los_cir_buf.h:53
CirBufStatus status
Definition: los_cir_buf.h:56
UINT32 remain
Definition: los_cir_buf.h:54
CHAR * fifo
Definition: los_cir_buf.h:57
函数调用图:
这是这个函数的调用关系图:

◆ LOS_CirBufRead()

UINT32 LOS_CirBufRead ( CirBuf cirbufCB,
CHAR buf,
UINT32  size 
)

读取循环buf的数据

在文件 los_cir_buf.c199 行定义.

200{
201 UINT32 cpSize = 0;
202 UINT32 intSave;
203
204 if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) {
205 return 0;
206 }
207
208 LOS_SpinLockSave(&cirbufCB->lock, &intSave);
209
210 if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == cirbufCB->size)) {
211 goto EXIT;
212 }
213
214 if (cirbufCB->startIdx >= cirbufCB->endIdx) {//开始位置大于结束位置的情况怎么读
215 cpSize = OsCirBufReadLoop(cirbufCB, buf, size);//循环读取buf
216 } else {//开始位置小于结束位置的情况怎么读
217 cpSize = OsCirBufReadLinear(cirbufCB, buf, size);//线性读取,读取 endIdx - startIdx 部分就行了,所以是线性读取
218 }
219
220EXIT:
221 LOS_SpinUnlockRestore(&cirbufCB->lock, intSave);
222 return cpSize;
223}
STATIC UINT32 OsCirBufReadLoop(CirBuf *cirbufCB, CHAR *buf, UINT32 size)
Definition: los_cir_buf.c:173
STATIC UINT32 OsCirBufReadLinear(CirBuf *cirbufCB, CHAR *buf, UINT32 size)
Definition: los_cir_buf.c:144
VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
Definition: los_spinlock.c:108
VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
Definition: los_spinlock.c:98
unsigned int UINT32
Definition: los_typedef.h:57
UINT32 endIdx
Definition: los_cir_buf.h:52
UINT32 startIdx
Definition: los_cir_buf.h:51
函数调用图:
这是这个函数的调用关系图:

◆ LOS_CirBufUsedSize()

UINT32 LOS_CirBufUsedSize ( CirBuf cirbufCB)

返回循环buf已使用的大小

在文件 los_cir_buf.c37 行定义.

38{
39 UINT32 size;
40 UINT32 intSave;
41
42 LOS_SpinLockSave(&cirbufCB->lock, &intSave);
43 size = cirbufCB->size - cirbufCB->remain; //得到已使用大小
44 LOS_SpinUnlockRestore(&cirbufCB->lock, intSave);
45
46 return size;
47}
函数调用图:
这是这个函数的调用关系图:

◆ LOS_CirBufWrite()

UINT32 LOS_CirBufWrite ( CirBuf cirbufCB,
const CHAR buf,
UINT32  size 
)

写入数据到循环buf区

在文件 los_cir_buf.c112 行定义.

113{
114 UINT32 cpSize = 0;
115 UINT32 intSave;
116
117 if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) {
118 return 0;
119 }
120
121 LOS_SpinLockSave(&cirbufCB->lock, &intSave);
122
123 if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == 0)) {
124 goto EXIT;;
125 }
126
127 if (cirbufCB->startIdx <= cirbufCB->endIdx) {//开始位置在前面
128 cpSize = OsCirBufWriteLoop(cirbufCB, buf, size);//循环方式写入,分两次拷贝
129 } else {
130 cpSize = OsCirBufWriteLinear(cirbufCB, buf, size);//线性方式写入,分一次拷贝
131 }
132
133EXIT:
134 LOS_SpinUnlockRestore(&cirbufCB->lock, intSave);
135 return cpSize;
136}
STATIC UINT32 OsCirBufWriteLinear(CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
Definition: los_cir_buf.c:56
STATIC UINT32 OsCirBufWriteLoop(CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
Definition: los_cir_buf.c:84
函数调用图:
这是这个函数的调用关系图:

◆ OsCirBufReadLinear()

STATIC UINT32 OsCirBufReadLinear ( CirBuf cirbufCB,
CHAR buf,
UINT32  size 
)

在文件 los_cir_buf.c144 行定义.

145{
146 UINT32 cpSize, remain;
147 errno_t err;
148
149 remain = cirbufCB->endIdx - cirbufCB->startIdx;//这里表示剩余可读区
150 cpSize = (remain < size) ? remain : size;
151
152 if (cpSize == 0) {
153 return 0;
154 }
155
156 err = memcpy_s(buf, size, cirbufCB->fifo + cirbufCB->startIdx, cpSize);//完成拷贝
157 if (err != EOK) {
158 return 0;
159 }
160
161 cirbufCB->remain += cpSize;//读完了那总剩余size肯定是要增加的
162 cirbufCB->startIdx += cpSize;//startIdx也要往前移动
163
164 return cpSize;
165}
这是这个函数的调用关系图:

◆ OsCirBufReadLoop()

STATIC UINT32 OsCirBufReadLoop ( CirBuf cirbufCB,
CHAR buf,
UINT32  size 
)

在文件 los_cir_buf.c173 行定义.

174{
175 UINT32 right, cpSize;
176 errno_t err;
177
178 right = cirbufCB->size - cirbufCB->startIdx;//先算出要读取的部分
179 cpSize = (right < size) ? right : size;
180
181 err = memcpy_s(buf, size, cirbufCB->fifo + cirbufCB->startIdx, cpSize);//先读第一部分数据
182 if (err != EOK) {
183 return 0;
184 }
185
186 cirbufCB->remain += cpSize;//读完了那总剩余size肯定是要增加的
187 cirbufCB->startIdx += cpSize;//startIdx也要往前移动
188 if (cirbufCB->startIdx == cirbufCB->size) {//如果移动到头了
189 cirbufCB->startIdx = 0;//循环buf的关键,新的循环开始了
190 }
191
192 if (cpSize < size) {
193 cpSize += OsCirBufReadLinear(cirbufCB, buf + cpSize, size - cpSize);//剩余的就交给线性方式读取了
194 }
195
196 return cpSize;
197}
函数调用图:
这是这个函数的调用关系图:

◆ OsCirBufWriteLinear()

STATIC UINT32 OsCirBufWriteLinear ( CirBuf cirbufCB,
const CHAR buf,
UINT32  size 
)

在文件 los_cir_buf.c56 行定义.

57{
58 UINT32 cpSize;
59 errno_t err;
60
61 cpSize = (cirbufCB->remain < size) ? cirbufCB->remain : size;//得到cp的大小
62
63 if (cpSize == 0) {
64 return 0;
65 }
66
67 err = memcpy_s(cirbufCB->fifo + cirbufCB->endIdx, cirbufCB->remain, buf, cpSize);//完成拷贝
68 if (err != EOK) {
69 return 0;
70 }
71
72 cirbufCB->remain -= cpSize;//写完了那总剩余size肯定是要减少的
73 cirbufCB->endIdx += cpSize;//结尾变大
74
75 return cpSize;
76}
if(tv==NULL)
Definition: time.c:430
函数调用图:
这是这个函数的调用关系图:

◆ OsCirBufWriteLoop()

STATIC UINT32 OsCirBufWriteLoop ( CirBuf cirbufCB,
const CHAR buf,
UINT32  size 
)

在文件 los_cir_buf.c84 行定义.

85{
86 UINT32 right, cpSize;
87 errno_t err;
88
89 right = cirbufCB->size - cirbufCB->endIdx;//先计算右边部分
90 cpSize = (right < size) ? right : size;//算出cpSize,很可能要分两次
91
92 err = memcpy_s(cirbufCB->fifo + cirbufCB->endIdx, right, buf, cpSize);//先拷贝一部分
93 if (err != EOK) {
94 return 0;
95 }
96
97 cirbufCB->remain -= cpSize;//写完了那总剩余size肯定是要减少的
98 cirbufCB->endIdx += cpSize;//endIdx 增加,一直往后移
99 if (cirbufCB->endIdx == cirbufCB->size) {//这个相当于移到最后一个了
100 cirbufCB->endIdx = 0;//循环从这里开始
101 }
102
103 if (cpSize == size) {//拷贝完了的情况
104 return size;//返回size
105 } else {
106 cpSize += OsCirBufWriteLinear(cirbufCB, buf + cpSize, size - cpSize);//需第二次拷贝
107 }
108
109 return cpSize;
110}
函数调用图:
这是这个函数的调用关系图: