#include #include #include #include #include #include #define HEAPSIZE 16384 #define MSGSIZE 16 #define NMESSAGES (HEAPSIZE / MSGSIZE) #define POOLSIZE (NMESSAGES * sizeof(void *)) static struct traceobj trobj; static RT_TASK t_pull, t_push; static RT_HEAP heap1, heap2; static RT_QUEUE queue1, queue2; static void pull_task(void *arg) { int ret, n = 0; void *p; traceobj_enter(&trobj); while (n++ < 1000) { ret = rt_heap_alloc(&heap1, MSGSIZE, TM_INFINITE, &p); traceobj_check(&trobj, ret, 0); ret = rt_queue_write(&queue1, &p, sizeof(p), Q_NORMAL); traceobj_assert(&trobj, ret >= 0); ret = rt_queue_read(&queue2, &p, sizeof(p), TM_INFINITE); traceobj_assert(&trobj, ret == sizeof(p)); ret = rt_heap_free(&heap2, p); traceobj_check(&trobj, ret, 0); } traceobj_exit(&trobj); } static void push_task(void *arg) { int ret, n = 0; void *p; traceobj_enter(&trobj); while (n++ < 1000) { ret = rt_queue_read(&queue1, &p, sizeof(p), TM_INFINITE); traceobj_assert(&trobj, ret == sizeof(p)); ret = rt_heap_free(&heap1, p); traceobj_check(&trobj, ret, 0); ret = rt_heap_alloc(&heap2, MSGSIZE, TM_INFINITE, &p); traceobj_check(&trobj, ret, 0); ret = rt_queue_write(&queue2, &p, sizeof(p), Q_NORMAL); traceobj_assert(&trobj, ret >= 0); } traceobj_exit(&trobj); } int main(int argc, char *const argv[]) { int ret; traceobj_init(&trobj, argv[0], 0); ret = rt_heap_create(&heap1, "HEAP1", HEAPSIZE, H_FIFO); traceobj_check(&trobj, ret, 0); ret = rt_heap_create(&heap2, "HEAP2", HEAPSIZE, H_FIFO); traceobj_check(&trobj, ret, 0); ret = rt_queue_create(&queue1, "QUEUE1", POOLSIZE, NMESSAGES, Q_FIFO); traceobj_check(&trobj, ret, 0); ret = rt_queue_create(&queue2, "QUEUE2", POOLSIZE, NMESSAGES, Q_FIFO); traceobj_check(&trobj, ret, 0); ret = rt_task_create(&t_pull, "PULL", 0, 20, 0); traceobj_check(&trobj, ret, 0); ret = rt_task_create(&t_push, "PUSH", 0, 20, 0); traceobj_check(&trobj, ret, 0); ret = rt_task_start(&t_pull, pull_task, NULL); traceobj_check(&trobj, ret, 0); ret = rt_task_start(&t_push, push_task, NULL); traceobj_check(&trobj, ret, 0); traceobj_join(&trobj); exit(0); }