8000 经过x86测试,得知写入数据大于ringbuffer给出的最大尺寸4096后,剩余的数据虽然走kfifo_put方法,但是数据并没有写入或… · home-coder/ring-buffer@40f3c07 · GitHub
[go: up one dir, main page]

Skip to content

Commit 40f3c07

Browse files
committed
经过x86测试,得知写入数据大于ringbuffer给出的最大尺寸4096后,剩余的数据虽然走kfifo_put方法,但是数据并没有写入或者覆盖掉起始处的buffer,导致数据丢失,所有后续需要针对这个问题进行判断:如果缓冲区满了就等待,当读者将数据取走腾出空间了,写者再写入。这样写线程可以让出cpu,让他在这个等待间隙做其它的事情。当然我的测试方法是写者很快,而读者很慢的情景
1 parent 4ac337b commit 40f3c07

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
ARCH=arm
1+
#ARCH=arm
22
#与硬件相关,需要联调
3-
#ARCH=x86
3+
ARCH=x86
44
#$(info, $(ARCH))//内核 androidmk使用
55
ifeq ($(ARCH), arm)
66
CC = ~/basic/cross_compile/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc

kfifo.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer,
5757
memcpy(fifo->buffer, buffer + l, len - l);
5858

5959
fifo->in += len;
60-
60+
static int i = 0;
61+
printf("put put put %d\n", i++);
6162
return len;
6263
}
6364

test.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ void thread_reader(void *param)
3838
counter++;
3939
}
4040
if (counter > 20) {
41-
break;
41+
//break;
4242
}
43-
usleep(50000);
43+
sleep(1);
44+
//usleep(50000);
4445
}
4546
}
4647

@@ -51,19 +52,19 @@ void thread_writer(void *param)
5152
unsigned char buffer[32];
5253
struct ll_param *p = (struct ll_param *)param;
5354

54-
for (counter = 0; counter < 100; counter++) {
55+
for (counter = 0; counter < 2000; counter++) {
5556
bzero(buffer, 32);
5657
sprintf((char *)buffer, "This is %d message.n", counter);
5758
kfifo_put(p->fifo, buffer, 32); //strlen((char *)buffer)
58-
usleep(100);
59+
// usleep(100);
5960
}
6061
}
6162
#else
6263
void thread_writer(void *param)
6364
{
6465
#define PAGE_SIZE (4*1024)
6566
#define PAGE_OFFSET 0xc0000000 //32位的偏移3G, 但是我在内核求得用户空间地址了,这个变量不需要了
66-
#define KERNEL_VIRT_ADDR 0x2249c000 //此处地址即为内核模块打印的地址p,动态的不固定,需要自行修改
67+
#define KERNEL_VIRT_ADDR 0x22049000 //此处地址即为内核模块打印的地址p,动态的不固定,需要自行修改
6768
unsigned char *buffer;
6869
int fd;
6970
unsigned long phy_addr;
@@ -79,6 +80,8 @@ void thread_writer(void *param)
7980
perror("mmap");
8081
while (1) {
8182
kfifo_put(p->fifo, buffer, 32); //strlen((char *)buffer)
83+
bzero(buffer, 32);
84+
usleep(10);
8285
}
8386

8487
munmap(buffer, PAGE_SIZE);

0 commit comments

Comments
 (0)
0