diff options
author | Yuji Mano <yuji.mano@am.sony.com> | 2009-03-23 12:26:05 -0700 |
---|---|---|
committer | Yuji Mano <yuji.mano@am.sony.com> | 2009-03-23 12:26:05 -0700 |
commit | 1fcbbf5141e6f9683f2fe62eb468222c45f27afb (patch) | |
tree | 0e62b815e884b8c3e67555f23406f0f173d0281d | |
parent | 4cf7db160a21c920835df154f560616131f180ba (diff) | |
download | mars-src-1fcbbf5141e6f9683f2fe62eb468222c45f27afb.tar.gz |
samples: Add host callback sample
Signed-off-by: Yuji Mano <yuji.mano@am.sony.com>
-rw-r--r-- | samples/Makefile | 1 | ||||
-rw-r--r-- | samples/README | 3 | ||||
-rw-r--r-- | samples/host_callback/Makefile | 29 | ||||
-rw-r--r-- | samples/host_callback/host.c | 121 | ||||
-rw-r--r-- | samples/host_callback/mpu_task.c | 64 |
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; +} |