aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuji Mano <yuji.mano@am.sony.com>2009-03-23 12:26:05 -0700
committerYuji Mano <yuji.mano@am.sony.com>2009-03-23 12:26:05 -0700
commit1fcbbf5141e6f9683f2fe62eb468222c45f27afb (patch)
tree0e62b815e884b8c3e67555f23406f0f173d0281d
parent4cf7db160a21c920835df154f560616131f180ba (diff)
downloadmars-src-1fcbbf5141e6f9683f2fe62eb468222c45f27afb.tar.gz
samples: Add host callback sample
Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>
-rw-r--r--samples/Makefile1
-rw-r--r--samples/README3
-rw-r--r--samples/host_callback/Makefile29
-rw-r--r--samples/host_callback/host.c121
-rw-r--r--samples/host_callback/mpu_task.c64
5 files changed, 218 insertions, 0 deletions
diff --git a/samples/Makefile b/samples/Makefile
index bedd2c7..ea19465 100644
--- a/samples/Makefile
+++ b/samples/Makefile
@@ -32,6 +32,7 @@ SUBDIRS = \
exit_code \
grayscale \
hello \
+ host_callback \
mandelbrot \
partial_context_save \
priority \
diff --git a/samples/README b/samples/README
index 95a11e9..0e5f124 100644
--- a/samples/README
+++ b/samples/README
@@ -63,6 +63,9 @@ explanations about each sample program are displayed when running the samples.
| that prints "Hello". This sample is the most
| basic of all samples.
|
+|---/host_callback A simple example to show how to execute a task
+| that calls a host callback function.
+|
|---/mandelbrot A mandelbrot program that uses multiple MARS
| tasks to do computations for each frame and
| displays the output on to the screen using the
diff --git a/samples/host_callback/Makefile b/samples/host_callback/Makefile
new file mode 100644
index 0000000..08d5cfd
--- /dev/null
+++ b/samples/host_callback/Makefile
@@ -0,0 +1,29 @@
+## Makefile
+#
+# Copyright 2008 Sony Corporation of America
+#
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+sample = host_callback
+sample_objs = host.o mpu_task.task_eo
+
+include ../config.mk
+include ../rules.mk
diff --git a/samples/host_callback/host.c b/samples/host_callback/host.c
new file mode 100644
index 0000000..bdd2b5c
--- /dev/null
+++ b/samples/host_callback/host.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2008 Sony Corporation of America
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include <libspe2.h>
+#include <mars/task.h>
+
+#define INFO \
+"\
+MARS Host Callback Sample \n\
+------------------------- \n\
+This program is a simple example to show how to create and \n\
+execute a task that calls a host callback function. \n\
+\n"
+
+#define NUM_TASKS 10
+
+extern struct spe_program_handle mpu_task_prog;
+
+static struct mars_context *mars_ctx;
+static struct mars_task_id task_id[NUM_TASKS];
+static struct mars_task_args task_args;
+
+int host_callback_1(struct mars_callback_args *in, struct mars_callback_args *out)
+{
+ printf("HOST : Callback 1 - Called from MPU(%d): Task %d\n",
+ in->type.u32[0], in->type.u32[1]);
+
+ out->type.u32[0] = in->type.u32[1] * 100;
+
+ return in->type.u32[1] * 10;
+}
+
+int host_callback_2(struct mars_callback_args *in, struct mars_callback_args *out)
+{
+ printf("HOST : Callback 2 - Called from MPU(%d): Task %d\n",
+ in->type.u32[0], in->type.u32[1]);
+
+ out->type.u32[0] = in->type.u32[1] * -100;
+
+ return in->type.u32[1] * -10;
+}
+
+int main(void)
+{
+ int ret, i;
+
+ printf(INFO);
+
+ ret = mars_context_create(&mars_ctx, 0, 0);
+ if (ret) {
+ printf("MARS context create failed! (%d)\n", ret);
+ return 1;
+ }
+
+ for (i = 0; i < NUM_TASKS; i++) {
+ char name[MARS_TASK_NAME_LEN_MAX];
+
+ snprintf(name, MARS_TASK_NAME_LEN_MAX, "Task %d", i);
+ ret = mars_task_create(mars_ctx, &task_id[i], name,
+ mpu_task_prog.elf_image, MARS_TASK_CONTEXT_SAVE_SIZE_MAX);
+ if (ret) {
+ printf("MARS task create failed! (%d)\n", ret);
+ return 1;
+ }
+
+ task_args.type.u32[0] = i;
+ task_args.type.u64[1] = mars_ptr_to_ea(host_callback_1);
+ task_args.type.u64[2] = mars_ptr_to_ea(host_callback_2);
+
+ ret = mars_task_schedule(&task_id[i], &task_args, 0);
+ if (ret) {
+ printf("MARS task schedule failed! (%d)\n", ret);
+ return 1;
+ }
+ }
+
+ for (i = 0; i < NUM_TASKS; i++) {
+ ret = mars_task_wait(&task_id[i], NULL);
+ if (ret) {
+ printf("MARS task wait failed! (%d)\n", ret);
+ return 1;
+ }
+
+ ret = mars_task_destroy(&task_id[i]);
+ if (ret) {
+ printf("MARS task destroy failed! (%d)\n", ret);
+ return 1;
+ }
+ }
+
+ ret = mars_context_destroy(mars_ctx);
+ if (ret) {
+ printf("MARS context destroy failed! (%d)\n", ret);
+ return 1;
+ }
+
+ return 0;
+}
+
+
diff --git a/samples/host_callback/mpu_task.c b/samples/host_callback/mpu_task.c
new file mode 100644
index 0000000..65271b6
--- /dev/null
+++ b/samples/host_callback/mpu_task.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2008 Sony Corporation of America
+ *
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <mars/task.h>
+
+int mars_task_main(const struct mars_task_args *task_args)
+{
+ int ret;
+ struct mars_callback_args in, out;
+
+ in.type.u32[0] = mars_task_get_kernel_id();
+ in.type.u32[1] = task_args->type.u32[0];
+
+ printf("MPU(%d): %s - Started\n",
+ mars_task_get_kernel_id(), mars_task_get_name());
+
+ printf("MPU(%d): %s - Calling Host Callback 1...\n",
+ mars_task_get_kernel_id(), mars_task_get_name());
+
+ ret = mars_task_call_host(task_args->type.u64[1], &in, &out);
+
+ printf("MPU(%d): %s - Host Callback 1 returned %d\n",
+ mars_task_get_kernel_id(), mars_task_get_name(), ret);
+
+ printf("MPU(%d): %s - Host Callback 1 output is %d\n",
+ mars_task_get_kernel_id(), mars_task_get_name(), out.type.u32[0]);
+
+ printf("MPU(%d): %s - Calling Host Callback 2...\n",
+ mars_task_get_kernel_id(), mars_task_get_name());
+
+ ret = mars_task_call_host(task_args->type.u64[2], &in, &out);
+
+ printf("MPU(%d): %s - Host Callback 2 returned %d\n",
+ mars_task_get_kernel_id(), mars_task_get_name(), ret);
+
+ printf("MPU(%d): %s - Host Callback 2 output is %d\n",
+ mars_task_get_kernel_id(), mars_task_get_name(), out.type.u32[0]);
+
+ printf("MPU(%d): %s - Finished\n",
+ mars_task_get_kernel_id(), mars_task_get_name());
+
+ return 0;
+}