| /* test_ring_buf.c: Simple ring buffer test application */ |
| |
| /* |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <zephyr.h> |
| #include <tc_util.h> |
| #include <misc/ring_buffer.h> |
| |
| SYS_RING_BUF_DECLARE_POW2(ring_buf, 8); |
| |
| char data[] = "ABCDEFGHIJKLMNOPQRSTUVWX"; |
| #define TYPE 1 |
| #define VALUE 2 |
| |
| #define INITIAL_SIZE 2 |
| |
| void main(void) |
| { |
| int ret, put_count, i, rv; |
| uint32_t getdata[6]; |
| uint8_t getsize, getval; |
| uint16_t gettype; |
| int dsize = INITIAL_SIZE; |
| |
| TC_START("Test ring buffers"); |
| |
| rv = TC_FAIL; |
| put_count = 0; |
| while (1) { |
| ret = sys_ring_buf_put(&ring_buf, TYPE, VALUE, |
| (uint32_t *)data, dsize); |
| if (ret == -EMSGSIZE) { |
| printk("ring buffer is full\n"); |
| break; |
| } |
| printk("inserted %d chunks, %d remaining\n", dsize, |
| sys_ring_buf_space_get(&ring_buf)); |
| dsize = (dsize + 1) % SIZE32_OF(data); |
| put_count++; |
| } |
| |
| getsize = INITIAL_SIZE - 1; |
| ret = sys_ring_buf_get(&ring_buf, &gettype, &getval, getdata, &getsize); |
| if (ret != -EMSGSIZE) { |
| printk("Allowed retreival with insufficient destination buffer space\n"); |
| if (getsize != INITIAL_SIZE) |
| printk("Correct size wasn't reported back to the caller\n"); |
| goto done; |
| } |
| |
| for (i = 0; i < put_count; i++) { |
| getsize = SIZE32_OF(getdata); |
| ret = sys_ring_buf_get(&ring_buf, &gettype, &getval, getdata, |
| &getsize); |
| if (ret < 0) { |
| printk("Couldn't retrieve a stored value (%d)\n", |
| ret); |
| goto done; |
| } |
| printk("got %u chunks of type %u and val %u, %u remaining\n", |
| getsize, gettype, getval, |
| sys_ring_buf_space_get(&ring_buf)); |
| |
| if (memcmp((char *)getdata, data, getsize * sizeof(uint32_t))) { |
| printk("data corrupted\n"); |
| goto done; |
| } |
| if (gettype != TYPE) { |
| printk("type information corrupted\n"); |
| goto done; |
| } |
| if (getval != VALUE) { |
| printk("value information corrupted\n"); |
| goto done; |
| } |
| } |
| |
| getsize = SIZE32_OF(getdata); |
| ret = sys_ring_buf_get(&ring_buf, &gettype, &getval, getdata, |
| &getsize); |
| if (ret != -EAGAIN) { |
| printk("Got data out of an empty buffer"); |
| goto done; |
| } |
| printk("empty buffer detected\n"); |
| |
| rv = TC_PASS; |
| done: |
| printk("head: %d tail: %d\n", ring_buf.head, ring_buf.tail); |
| |
| TC_END_RESULT(rv); |
| TC_END_REPORT(rv); |
| } |