diff --git a/app/app.c b/app/app.c new file mode 100644 index 00000000..c80f0973 --- /dev/null +++ b/app/app.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2009 Travis Geiselbrecht + * + * 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 +#include +#include + +extern const struct _app_descriptor __apps_start; +extern const struct _app_descriptor __apps_end; + +static void start_app(const struct _app_descriptor *app); + +/* one time setup */ +void apps_init(void) +{ + const struct _app_descriptor *app; + for (app = &__apps_start; app != &__apps_end; app++) { +// printf("app '%s'\n", app->name); + + if (app->entry && app->flags & APP_FLAG_BOOT_START) { + start_app(app); + } + } +} + +static int app_thread_entry(void *arg) +{ + const struct _app_descriptor *app = (const struct _app_descriptor *)arg; + + app->entry(app, NULL); + + return 0; +} + +static void start_app(const struct _app_descriptor *app) +{ + printf("starting app %s\n", app->name); + if (app->flags & APP_FLAG_THREAD) { + thread_resume(thread_create(app->name, &app_thread_entry, (void *)app, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE)); + } else { + app->entry(app, NULL); + } +} + diff --git a/app/rules.mk b/app/rules.mk new file mode 100644 index 00000000..74abd568 --- /dev/null +++ b/app/rules.mk @@ -0,0 +1,5 @@ +LOCAL_DIR := $(GET_LOCAL_DIR) + +OBJS += \ + $(LOCAL_DIR)/app.o + diff --git a/arch/arm/system-onesegment.ld b/arch/arm/system-onesegment.ld index 643ecbd8..9f0e7fc6 100644 --- a/arch/arm/system-onesegment.ld +++ b/arch/arm/system-onesegment.ld @@ -42,6 +42,10 @@ SECTIONS __commands_start = .; KEEP (*(.commands)) __commands_end = .; + . = ALIGN(4); + __apps_start = .; + KEEP (*(.apps)) + __apps_end = .; . = ALIGN(4); __rodata_end = . ; } diff --git a/arch/arm/system-twosegment.ld b/arch/arm/system-twosegment.ld index 748d5653..3a1c04c6 100644 --- a/arch/arm/system-twosegment.ld +++ b/arch/arm/system-twosegment.ld @@ -42,6 +42,10 @@ SECTIONS __commands_start = .; KEEP (*(.commands)) __commands_end = .; + . = ALIGN(4); + __apps_start = .; + KEEP (*(.apps)) + __apps_end = .; . = ALIGN(4); __rodata_end = . ; } diff --git a/include/app.h b/include/app.h new file mode 100644 index 00000000..1a9a93cf --- /dev/null +++ b/include/app.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2009 Travis Geiselbrecht + * + * 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. + */ +#ifndef __APP_H +#define __APP_H + +/* app support api */ +void apps_init(void); /* one time setup */ + +/* app entry point */ +struct _app_descriptor; +typedef void (*app_entry)(const struct _app_descriptor *, void *args); + +/* app startup flags */ +#define APP_FLAG_BOOT_START 0x1 +#define APP_FLAG_THREAD 0x2 + +/* each app needs to define one of these to define its startup conditions */ +struct _app_descriptor { + const char *name; + app_entry entry; + unsigned int flags; +}; + +#define APP_START(appname) struct _app_descriptor _app_##appname __SECTION(".apps") = { .name = #appname, +#define APP_END }; + +#endif + diff --git a/kernel/main.c b/kernel/main.c index 16a4099c..77e6a5d1 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -119,6 +120,9 @@ static int bootstrap2(void *arg) dprintf(SPEW, "initializing target\n"); target_init(); + dprintf(SPEW, "calling apps_init()\n"); + apps_init(); + dprintf(SPEW, "calling project_init()\n"); project_init(); diff --git a/makefile b/makefile index b045e719..33cd10ec 100644 --- a/makefile +++ b/makefile @@ -62,6 +62,7 @@ include platform/rules.mk include target/rules.mk include kernel/rules.mk include dev/rules.mk +include app/rules.mk # recursively include any modules in the MODULE variable, leaving a trail of included # modules in the ALLMODULES list