Yes, at the moment it is not straightforward for packages other than BSP
to register devices. We should make sure we have at least some calls to
os_dev_initialize_all() from sysinit().

I.e. it would be nice to be able to have one package (device driver) be able to
register a device in it’s init routine, and then 2nd package could open that
device in their respective init.

So here’s the proposal:
- move the call to os_dev_initialize_all(OS_DEV_INIT_KERNEL) to take
  place from within sysinit() itself, as the first thing before other packages
  are initialized
- if os_dev_create() gets called after this point, OS calls device’s init
  right away. And the device will then be available from that point on

> On Jan 24, 2017, at 9:54 AM, will sanfilippo <[email protected]> wrote:
> 
> So you are saying that there will still be well-defined places where things 
> get initialized and that there will be defined ranges for these stages? For 
> example:
> 
> 0 - 99 Before os_init() is called.
> 100-199 in os_init() after os_init() code executes
> 200-299: in os_start() somewhere
> 
> Realize that the above are just examples and not meant to be actual ranges or 
> actual places where we initalize.
> 
> 
>> On Jan 23, 2017, at 9:03 PM, Sterling Hughes 
>> <[email protected]> wrote:
>> 
>> Also, one other thing to look at with the new sysinit changes.  I think we 
>> probably need to revise the ordering on device initialization.
>> 
>> Right now device init has the following:
>> 
>> /*
>> * Initialization order, defines when a device should be initialized
>> * by the Mynewt kernel.
>> *
>> */
>> #define OS_DEV_INIT_PRIMARY   (1)
>> #define OS_DEV_INIT_SECONDARY (2)
>> #define OS_DEV_INIT_KERNEL    (3)
>> 
>> #define OS_DEV_INIT_F_CRITICAL (1 << 0)
>> 
>> 
>> #define OS_DEV_INIT_PRIO_DEFAULT (0xff)
>> 
>> And these stages are called:
>> 
>> In os_init():  PRIMARY, SECONDARY
>> In os_start(): KERNEL
>> 
>> I think it makes sense to more clearly map these stages to the new sparsely 
>> designed sysinit stages, and add device init hooks throughout the system 
>> startup.
>> 
>> Given the new sparse IDs, I’m thinking that we could do it per-ID range, 
>> i.e. os_dev_initializeall(100), os_dev_initializeall(200), etc.  Within that 
>> range, devices could be initialized by priority.
>> 
>> Thoughts?
>> 
>> Sterling
>> 
>> On 23 Jan 2017, at 19:12, Jacob Rosenthal wrote:
>> 
>>> Looks like this breaks splitty as app, bleprph as loader
>>> Error: Syscfg ambiguities detected:
>>>   Setting: OS_MAIN_TASK_PRIO, Packages: [apps/bleprph, apps/splitty]
>>> Setting history (newest -> oldest):
>>>   OS_MAIN_TASK_PRIO: [apps/splitty:10, apps/bleprph:1, kernel/os:0xfe]
>>> 
>>> Setting OS_MAIN_TASK_PRIO in splitty to 1 made this go away..but Dont know
>>> if theres other complications related to that though.Then it gets stuck
>>> after confirming image and resetting while entering the app image at
>>> gcc_startup_nrf51.s Default_Handler
>>> 
>>> On Mon, Jan 23, 2017 at 4:48 PM, marko kiiskila <[email protected]> wrote:
>>> 
>>>> I pushed this change to develop.
>>>> 
>>>> You’ll need to update the newt tool as part of this change; as sysinit
>>>> calls should not include call to os_init() anymore.
>>>> 
>>>> After this change you can specify multiple calls to be made to your package
>>>> from sysinit().
>>>> Tell newt to do this by having this kind of block in your pkg.yml.
>>>> 
>>>> pkg.init:
>>>>   ble_hs_init: 200
>>>>   ble_hs_init2: 500
>>>> 
>>>> I.e. in pkg.init block specify function name followed by call order.
>>>> 
>>>> And app main() should minimally look like:
>>>> 
>>>> int
>>>> main(int argc, char **argv)
>>>> {
>>>> #ifdef ARCH_sim
>>>>   mcu_sim_parse_args(argc, argv);
>>>> #endif
>>>> 
>>>>   sysinit();
>>>> 
>>>>   while (1) {
>>>>       os_eventq_run(os_eventq_dflt_get());
>>>>   }
>>>>   assert(0);
>>>> 
>>>>   return rc;
>>>> }
>>>> 
>>>> So there’s a call to mcu_sim_parse_args() (in case app can execute in
>>>> simulator),
>>>> call to sysinit(), which calls all the package init routines, followed by
>>>> this main task
>>>> calling os_eventq_run() for default task.
>>>> 
>>>> I might also want to lock the scheduler for the duration of call to
>>>> sysinit();
>>>> but we don’t have that facility yet. This might be a good time to add it?
>>>> 
>>>>> On Jan 21, 2017, at 9:00 AM, will sanfilippo <[email protected]> wrote:
>>>>> 
>>>>> +1 sounds good to me. I dont think the amount of changes to the app are
>>>> all that many and folks should be able to deal with them pretty easily.
>>>>> 
>>>>> 
>>>>>> On Jan 20, 2017, at 1:35 PM, Sterling Hughes <
>>>> [email protected]> wrote:
>>>>>> 
>>>>>> Hey,
>>>>>> 
>>>>>> Changed the subject to call this out to more people.  :-)
>>>>>> 
>>>>>> Response above, because I generally think this is on the right track.
>>>> In my view, we should bite the bullet prior to 1.0, and move to this
>>>> approach.  I think it greatly simplifies startup, and the concept of the
>>>> default event queue now ties into their being a default task.
>>>>>> 
>>>>>> That said, I’m open to concerns from others — it is a fairly major
>>>> change to system startup, and it would be last minute.  With Fabio’s last
>>>> changes to the hal_flash* APIs, I think we’re mostly good for 1.0
>>>> otherwise, and should roll beta2 soon after this.
>>>>>> 
>>>>>> Sterling
>>>>>> 
>>>>>> On 20 Jan 2017, at 13:26, marko kiiskila wrote:
>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> this is continuation of effort Chris started to improve sysinit.
>>>>>>> 
>>>>>>> What I’ve started on this branch is an attempt to (hopefully) make
>>>> things
>>>>>>> better.
>>>>>>> 
>>>>>>> I added a concept of “main task”, which would be created by the system
>>>>>>> automatically, and it’s job would be to handle events from the os
>>>> default
>>>>>>> event queue.
>>>>>>> Currently, you have to create this queue, and assign processing of it
>>>>>>> to a task inside your app.
>>>>>>> 
>>>>>>> Another thing I’m doing here is move the call to main() to happen
>>>>>>> within this task’s context. At the moment this happens before OS
>>>>>>> has been initialized, or started.
>>>>>>> So now you can count on OS being up when doing package initialization.
>>>>>>> At the moment quite a few packages queue a 'start event’ to take place
>>>>>>> right after OS has started. This would not be needed anymore, as
>>>>>>> you can do everything during the init routine itself.
>>>>>>> 
>>>>>>> Also, the default event queue gets assigned, and initialized before
>>>> any of
>>>>>>> the packages have had their respective init routines called.
>>>> Previously,
>>>>>>> this often happened after sysinit() had been called, and packages did
>>>>>>> not know where to queue that start event.
>>>>>>> 
>>>>>>> I checked this in to a branch, and wanted to hear yay/nay before
>>>> proceeding
>>>>>>> with this further. As this is a bit of an architectural change.
>>>>>>> Also, I want to hear if this should make it’s way in before 1.0.
>>>>>>> 
>>>>>>> More specifically, take a look at how applications would have to
>>>> change their
>>>>>>> main(); instead of calling os_start() in the end, they would start
>>>> processing
>>>>>>> events from default queue. And they’d have specify the priority, and
>>>> stack
>>>>>>> size of the main task.
>>>>>>> 
>>>>>>> Another change I was going to make would involve changes in the way
>>>>>>> packages register routines to be called from sysinit().
>>>>>>> Currently, there’s only one init() per-package.
>>>>>>> I was going to make it possible for a package to register multiple
>>>> routines
>>>>>>> for this. That way you can break the initialization to multiple parts
>>>> in cases
>>>>>>> where packages have interdependencies between each other.
>>>>>>> Also, the app should be able to interject pieces of code that gets
>>>> executed
>>>>>>> in the middle of sysinit().
>>>>>>> To make this easier, I was going to make the current initialization
>>>> level
>>>>>>> numbering a bit wider. So the existing level “1” would become “100”,
>>>>>>> and “2” -> “200”.
>>>>>>> 
>>>>>>> So, feedback about this approach, and then whether this is 1.0 or 1.1
>>>>>>> kind of thing.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> M
>>>>>>> 
>>>>>>>> Begin forwarded message:
>>>>>>>> 
>>>>>>>> From: [email protected]
>>>>>>>> Subject: incubator-mynewt-core git commit: os; spin up OS before
>>>> calling. main() gets called in context of main task.
>>>>>>>> Date: January 20, 2017 at 12:18:03 PM PST
>>>>>>>> To: [email protected]
>>>>>>>> Reply-To: [email protected]
>>>>>>>> 
>>>>>>>> Repository: incubator-mynewt-core
>>>>>>>> Updated Branches:
>>>>>>>> refs/heads/def_task [created] 0c9fe5e2b
>>>>>>>> 
>>>>>>>> 
>>>>>>>> os; spin up OS before calling. main() gets called in context of
>>>>>>>> main task.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/repo
>>>>>>>> Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/commit/0c9fe5e2
>>>>>>>> Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/tree/0c9fe5e2
>>>>>>>> Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/diff/0c9fe5e2
>>>>>>>> 
>>>>>>>> Branch: refs/heads/def_task
>>>>>>>> Commit: 0c9fe5e2b3c6d3f6ca34e570e34eac6e55a40c66
>>>>>>>> Parents: 449ef81
>>>>>>>> Author: Marko Kiiskila <[email protected]>
>>>>>>>> Authored: Fri Jan 20 12:16:20 2017 -0800
>>>>>>>> Committer: Marko Kiiskila <[email protected]>
>>>>>>>> Committed: Fri Jan 20 12:16:20 2017 -0800
>>>>>>>> 
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> apps/bleprph/src/main.c                         |  47 +-
>>>>>>>> apps/bleprph/syscfg.yml                         |   4 +
>>>>>>>> apps/oled_test/pkg.yml                          |  47 ++
>>>>>>>> apps/oled_test/src/main.c                       | 467
>>>> +++++++++++++++++++
>>>>>>>> apps/slinky/src/main.c                          |  44 +-
>>>>>>>> apps/slinky/syscfg.yml                          |   3 +
>>>>>>>> hw/mcu/native/src/hal_system.c                  |  16 +-
>>>>>>>> kernel/os/include/os/os.h                       |   2 +
>>>>>>>> kernel/os/include/os/os_eventq.h                |   1 -
>>>>>>>> kernel/os/src/os.c                              |  24 +
>>>>>>>> kernel/os/src/os_eventq.c                       |  23 +-
>>>>>>>> kernel/os/syscfg.yml                            |   6 +
>>>>>>>> kernel/os/test/src/eventq_test.c                |   1 -
>>>>>>>> kernel/os/test/src/mempool_test.c               |   1 +
>>>>>>>> kernel/os/test/src/mutex_test.c                 |   3 +-
>>>>>>>> kernel/os/test/src/os_test.c                    |   5 +-
>>>>>>>> kernel/os/test/src/sem_test.c                   |  73 +--
>>>>>>>> .../test/src/testcases/event_test_poll_0timo.c  |   2 +-
>>>>>>>> .../src/testcases/event_test_poll_single_sr.c   |   3 +-
>>>>>>>> .../os/test/src/testcases/event_test_poll_sr.c  |   1 +
>>>>>>>> .../src/testcases/event_test_poll_timeout_sr.c  |   5 +-
>>>>>>>> kernel/os/test/src/testcases/event_test_src.c   |   3 +-
>>>>>>>> kernel/os/test/src/testcases/os_callout_test.c  |   7 +-
>>>>>>>> .../test/src/testcases/os_callout_test_speak.c  |   7 +-
>>>>>>>> .../test/src/testcases/os_callout_test_stop.c   |   9 +-
>>>>>>>> libc/baselibc/src/start.c                       |   9 +
>>>>>>>> .../mn_socket/test/src/testcases/socket_tests.c |   1 +
>>>>>>>> test/testutil/src/testutil.c                    |   1 +
>>>>>>>> 28 files changed, 660 insertions(+), 155 deletions(-)
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/bleprph/src/main.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/bleprph/src/main.c b/apps/bleprph/src/main.c
>>>>>>>> index 65911a5..e75264d 100755
>>>>>>>> --- a/apps/bleprph/src/main.c
>>>>>>>> +++ b/apps/bleprph/src/main.c
>>>>>>>> @@ -42,14 +42,6 @@
>>>>>>>> /** Log data. */
>>>>>>>> struct log bleprph_log;
>>>>>>>> 
>>>>>>>> -/** bleprph task settings. */
>>>>>>>> -#define BLEPRPH_TASK_PRIO           1
>>>>>>>> -#define BLEPRPH_STACK_SIZE          (OS_STACK_ALIGN(428))
>>>>>>>> -
>>>>>>>> -struct os_eventq bleprph_evq;
>>>>>>>> -struct os_task bleprph_task;
>>>>>>>> -bssnz_t os_stack_t *bleprph_stack;
>>>>>>>> -
>>>>>>>> static int bleprph_gap_event(struct ble_gap_event *event, void *arg);
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> @@ -248,17 +240,6 @@ bleprph_on_sync(void)
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> - * Event loop for the main bleprph task.
>>>>>>>> - */
>>>>>>>> -static void
>>>>>>>> -bleprph_task_handler(void *unused)
>>>>>>>> -{
>>>>>>>> -    while (1) {
>>>>>>>> -        os_eventq_run(&bleprph_evq);
>>>>>>>> -    }
>>>>>>>> -}
>>>>>>>> -
>>>>>>>> -/**
>>>>>>>> * main
>>>>>>>> *
>>>>>>>> * The main function for the project. This function initializes the
>>>> os, calls
>>>>>>>> @@ -282,19 +263,6 @@ main(void)
>>>>>>>> log_register("bleprph", &bleprph_log, &log_console_handler, NULL,
>>>>>>>>              LOG_SYSLEVEL);
>>>>>>>> 
>>>>>>>> -    /* Initialize eventq */
>>>>>>>> -    os_eventq_init(&bleprph_evq);
>>>>>>>> -
>>>>>>>> -    bleprph_stack = malloc(sizeof bleprph_stack *
>>>> BLEPRPH_STACK_SIZE);
>>>>>>>> -    assert(bleprph_stack != NULL);
>>>>>>>> -
>>>>>>>> -    /* Create the bleprph task.  All application logic and NimBLE
>>>> host
>>>>>>>> -     * operations are performed in this task.
>>>>>>>> -     */
>>>>>>>> -    os_task_init(&bleprph_task, "bleprph", bleprph_task_handler,
>>>>>>>> -                 NULL, BLEPRPH_TASK_PRIO, OS_WAIT_FOREVER,
>>>>>>>> -                 bleprph_stack, BLEPRPH_STACK_SIZE);
>>>>>>>> -
>>>>>>>> /* Initialize the NimBLE host configuration. */
>>>>>>>> log_register("ble_hs", &ble_hs_log, &log_console_handler, NULL,
>>>>>>>>              LOG_SYSLEVEL);
>>>>>>>> @@ -309,9 +277,6 @@ main(void)
>>>>>>>> rc = ble_svc_gap_device_name_set("nimble-bleprph");
>>>>>>>> assert(rc == 0);
>>>>>>>> 
>>>>>>>> -    /* Set the default eventq for packages that lack a dedicated
>>>> task. */
>>>>>>>> -    os_eventq_dflt_set(&bleprph_evq);
>>>>>>>> -
>>>>>>>> conf_load();
>>>>>>>> 
>>>>>>>> /* If this app is acting as the loader in a split image setup, jump
>>>> into
>>>>>>>> @@ -327,11 +292,11 @@ main(void)
>>>>>>>> }
>>>>>>>> #endif
>>>>>>>> 
>>>>>>>> -    /* Start the OS */
>>>>>>>> -    os_start();
>>>>>>>> -
>>>>>>>> -    /* os start should never return. If it does, this should be an
>>>> error */
>>>>>>>> -    assert(0);
>>>>>>>> -
>>>>>>>> +    /*
>>>>>>>> +     * As the last thing, process events from default event queue.
>>>>>>>> +     */
>>>>>>>> +    while (1) {
>>>>>>>> +        os_eventq_run(os_eventq_dflt_get());
>>>>>>>> +    }
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/bleprph/syscfg.yml
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/bleprph/syscfg.yml b/apps/bleprph/syscfg.yml
>>>>>>>> index 6db8c1e..f40e959 100644
>>>>>>>> --- a/apps/bleprph/syscfg.yml
>>>>>>>> +++ b/apps/bleprph/syscfg.yml
>>>>>>>> @@ -42,3 +42,7 @@ syscfg.vals:
>>>>>>>> 
>>>>>>>> # Enable Config.
>>>>>>>> CONFIG_NEWTMGR: 1
>>>>>>>> +
>>>>>>>> +    # OS main/default task
>>>>>>>> +    OS_MAIN_TASK_PRIO: 1
>>>>>>>> +    OS_MAIN_STACK_SIZE: 428
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/oled_test/pkg.yml
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/oled_test/pkg.yml b/apps/oled_test/pkg.yml
>>>>>>>> new file mode 100644
>>>>>>>> index 0000000..89c9cd0
>>>>>>>> --- /dev/null
>>>>>>>> +++ b/apps/oled_test/pkg.yml
>>>>>>>> @@ -0,0 +1,47 @@
>>>>>>>> +#
>>>>>>>> +# Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> +# or more contributor license agreements.  See the NOTICE file
>>>>>>>> +# distributed with this work for additional information
>>>>>>>> +# regarding copyright ownership.  The ASF licenses this file
>>>>>>>> +# to you 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.
>>>>>>>> +#
>>>>>>>> +
>>>>>>>> +pkg.name: apps/oled_test
>>>>>>>> +pkg.type: app
>>>>>>>> +pkg.description: Example application which exercises OLED_display.
>>>>>>>> +pkg.author: "Apache Mynewt <[email protected]>"
>>>>>>>> +pkg.homepage: "http://mynewt.apache.org/";
>>>>>>>> +pkg.keywords:
>>>>>>>> +
>>>>>>>> +pkg.deps:
>>>>>>>> +    - drivers/mpu_3050
>>>>>>>> +    - fs/nffs
>>>>>>>> +    - libs/console/full
>>>>>>>> +    - libs/flash_test
>>>>>>>> +    - libs/imgmgr
>>>>>>>> +    - libs/newtmgr
>>>>>>>> +    - libs/os
>>>>>>>> +    - libs/shell
>>>>>>>> +    - libs/util
>>>>>>>> +    - sys/config
>>>>>>>> +    - sys/id
>>>>>>>> +
>>>>>>>> +pkg.cflags:
>>>>>>>> +    - "-DSTATS_NAME_ENABLE=1"
>>>>>>>> +
>>>>>>>> +pkg.cflags.NFFS:
>>>>>>>> +    - "-DNFFS_PRESENT"
>>>>>>>> +
>>>>>>>> +pkg.cflags.FCB:
>>>>>>>> +    - "-DFCB_PRESENT"
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/oled_test/src/main.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/oled_test/src/main.c b/apps/oled_test/src/main.c
>>>>>>>> new file mode 100755
>>>>>>>> index 0000000..f8494b9
>>>>>>>> --- /dev/null
>>>>>>>> +++ b/apps/oled_test/src/main.c
>>>>>>>> @@ -0,0 +1,467 @@
>>>>>>>> +/**
>>>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>>>>>>> + * or more contributor license agreements.  See the NOTICE file
>>>>>>>> + * distributed with this work for additional information
>>>>>>>> + * regarding copyright ownership.  The ASF licenses this file
>>>>>>>> + * to you 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 <os/os.h>
>>>>>>>> +#include <bsp/bsp.h>
>>>>>>>> +#include <hal/hal_gpio.h>
>>>>>>>> +#include <hal/hal_flash.h>
>>>>>>>> +#include <console/console.h>
>>>>>>>> +#include <shell/shell.h>
>>>>>>>> +#include <config/config.h>
>>>>>>>> +#include <hal/flash_map.h>
>>>>>>>> +#include <hal/hal_system.h>
>>>>>>>> +#ifdef NFFS_PRESENT
>>>>>>>> +#include <fs/fs.h>
>>>>>>>> +#include <nffs/nffs.h>
>>>>>>>> +#include <config/config_file.h>
>>>>>>>> +#elif FCB_PRESENT
>>>>>>>> +#include <fcb/fcb.h>
>>>>>>>> +#include <config/config_fcb.h>
>>>>>>>> +#else
>>>>>>>> +#error "Need NFFS or FCB for config storage"
>>>>>>>> +#endif
>>>>>>>> +#include <newtmgr/newtmgr.h>
>>>>>>>> +#include <bootutil/image.h>
>>>>>>>> +#include <bootutil/bootutil_misc.h>
>>>>>>>> +#include <imgmgr/imgmgr.h>
>>>>>>>> +#include <assert.h>
>>>>>>>> +#include <string.h>
>>>>>>>> +#include <json/json.h>
>>>>>>>> +#include <flash_test/flash_test.h>
>>>>>>>> +#include <reboot/log_reboot.h>
>>>>>>>> +#include <os/os_time.h>
>>>>>>>> +#include <id/id.h>
>>>>>>>> +
>>>>>>>> +#include <mpu_3050/mpu_3050.h>
>>>>>>>> +
>>>>>>>> +#ifdef ARCH_sim
>>>>>>>> +#include <mcu/mcu_sim.h>
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +/* Init all tasks */
>>>>>>>> +volatile int tasks_initialized;
>>>>>>>> +int init_tasks(void);
>>>>>>>> +
>>>>>>>> +/* Task 1 */
>>>>>>>> +#define TASK1_PRIO (8)
>>>>>>>> +#define TASK1_STACK_SIZE    OS_STACK_ALIGN(192)
>>>>>>>> +struct os_task task1;
>>>>>>>> +os_stack_t stack1[TASK1_STACK_SIZE];
>>>>>>>> +static volatile int g_task1_loops;
>>>>>>>> +
>>>>>>>> +/* Task 2 */
>>>>>>>> +#define TASK2_PRIO (9)
>>>>>>>> +#define TASK2_STACK_SIZE    OS_STACK_ALIGN(128)
>>>>>>>> +struct os_task task2;
>>>>>>>> +os_stack_t stack2[TASK2_STACK_SIZE];
>>>>>>>> +
>>>>>>>> +#define SHELL_TASK_PRIO (3)
>>>>>>>> +#define SHELL_MAX_INPUT_LEN     (256)
>>>>>>>> +#define SHELL_TASK_STACK_SIZE (OS_STACK_ALIGN(384))
>>>>>>>> +os_stack_t shell_stack[SHELL_TASK_STACK_SIZE];
>>>>>>>> +
>>>>>>>> +#define NEWTMGR_TASK_PRIO (4)
>>>>>>>> +#define NEWTMGR_TASK_STACK_SIZE (OS_STACK_ALIGN(896))
>>>>>>>> +os_stack_t newtmgr_stack[NEWTMGR_TASK_STACK_SIZE];
>>>>>>>> +
>>>>>>>> +static volatile int g_task2_loops;
>>>>>>>> +
>>>>>>>> +/* Global test semaphore */
>>>>>>>> +struct os_sem g_test_sem;
>>>>>>>> +
>>>>>>>> +/* For LED toggling */
>>>>>>>> +int g_led_pin;
>>>>>>>> +
>>>>>>>> +#ifdef NFFS_PRESENT
>>>>>>>> +/* configuration file */
>>>>>>>> +#define MY_CONFIG_DIR  "/cfg"
>>>>>>>> +#define MY_CONFIG_FILE "/cfg/run"
>>>>>>>> +#define MY_CONFIG_MAX_LINES  32
>>>>>>>> +
>>>>>>>> +static struct conf_file my_conf = {
>>>>>>>> +    .cf_name = MY_CONFIG_FILE,
>>>>>>>> +    .cf_maxlines = MY_CONFIG_MAX_LINES
>>>>>>>> +};
>>>>>>>> +#elif FCB_PRESENT
>>>>>>>> +struct flash_area conf_fcb_area[NFFS_AREA_MAX + 1];
>>>>>>>> +
>>>>>>>> +static struct conf_fcb my_conf = {
>>>>>>>> +    .cf_fcb.f_magic = 0xc09f6e5e,
>>>>>>>> +    .cf_fcb.f_sectors = conf_fcb_area
>>>>>>>> +};
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +#define DEFAULT_MBUF_MPOOL_BUF_LEN (256)
>>>>>>>> +#define DEFAULT_MBUF_MPOOL_NBUFS (10)
>>>>>>>> +
>>>>>>>> +uint8_t default_mbuf_mpool_data[DEFAULT_MBUF_MPOOL_BUF_LEN *
>>>>>>>> +    DEFAULT_MBUF_MPOOL_NBUFS];
>>>>>>>> +
>>>>>>>> +struct os_mbuf_pool default_mbuf_pool;
>>>>>>>> +struct os_mempool default_mbuf_mpool;
>>>>>>>> +
>>>>>>>> +static char *test_conf_get(int argc, char **argv, char *val, int
>>>> max_len);
>>>>>>>> +static int test_conf_set(int argc, char **argv, char *val);
>>>>>>>> +static int test_conf_commit(void);
>>>>>>>> +static int test_conf_export(void (*export_func)(char *name, char
>>>> *val),
>>>>>>>> +  enum conf_export_tgt tgt);
>>>>>>>> +
>>>>>>>> +static struct conf_handler test_conf_handler = {
>>>>>>>> +    .ch_name = "test",
>>>>>>>> +    .ch_get = test_conf_get,
>>>>>>>> +    .ch_set = test_conf_set,
>>>>>>>> +    .ch_commit = test_conf_commit,
>>>>>>>> +    .ch_export = test_conf_export
>>>>>>>> +};
>>>>>>>> +
>>>>>>>> +static uint8_t test8;
>>>>>>>> +static uint8_t test8_shadow;
>>>>>>>> +static char test_str[32];
>>>>>>>> +
>>>>>>>> +static char *
>>>>>>>> +test_conf_get(int argc, char **argv, char *buf, int max_len)
>>>>>>>> +{
>>>>>>>> +    if (argc == 1) {
>>>>>>>> +        if (!strcmp(argv[0], "8")) {
>>>>>>>> +            return conf_str_from_value(CONF_INT8, &test8, buf,
>>>> max_len);
>>>>>>>> +        } else if (!strcmp(argv[0], "str")) {
>>>>>>>> +            return test_str;
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +    return NULL;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static int
>>>>>>>> +test_conf_set(int argc, char **argv, char *val)
>>>>>>>> +{
>>>>>>>> +    if (argc == 1) {
>>>>>>>> +        if (!strcmp(argv[0], "8")) {
>>>>>>>> +            return CONF_VALUE_SET(val, CONF_INT8, test8_shadow);
>>>>>>>> +        } else if (!strcmp(argv[0], "str")) {
>>>>>>>> +            return CONF_VALUE_SET(val, CONF_STRING, test_str);
>>>>>>>> +        }
>>>>>>>> +    }
>>>>>>>> +    return OS_ENOENT;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static int
>>>>>>>> +test_conf_commit(void)
>>>>>>>> +{
>>>>>>>> +    test8 = test8_shadow;
>>>>>>>> +
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +static int
>>>>>>>> +test_conf_export(void (*func)(char *name, char *val), enum
>>>> conf_export_tgt tgt)
>>>>>>>> +{
>>>>>>>> +    char buf[4];
>>>>>>>> +
>>>>>>>> +    conf_str_from_value(CONF_INT8, &test8, buf, sizeof(buf));
>>>>>>>> +    func("test/8", buf);
>>>>>>>> +    func("test/str", test_str);
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +void
>>>>>>>> +task1_handler(void *arg)
>>>>>>>> +{
>>>>>>>> +    struct os_task *t;
>>>>>>>> +
>>>>>>>> +    /* Set the led pin for the E407 devboard */
>>>>>>>> +    g_led_pin = LED_BLINK_PIN;
>>>>>>>> +    hal_gpio_init_out(g_led_pin, 1);
>>>>>>>> +
>>>>>>>> +    while (1) {
>>>>>>>> +        t = os_sched_get_current_task();
>>>>>>>> +        assert(t->t_func == task1_handler);
>>>>>>>> +
>>>>>>>> +        ++g_task1_loops;
>>>>>>>> +
>>>>>>>> +        /* Wait one second */
>>>>>>>> +        os_time_delay(1000);
>>>>>>>> +
>>>>>>>> +        /* Toggle the LED */
>>>>>>>> +        hal_gpio_toggle(g_led_pin);
>>>>>>>> +
>>>>>>>> +        /* Release semaphore to task 2 */
>>>>>>>> +        os_sem_release(&g_test_sem);
>>>>>>>> +    }
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +#if 0
>>>>>>>> +#define SSD1306_DEV ARDUINO_ZERO_I2C
>>>>>>>> +
>>>>>>>> +static int
>>>>>>>> +ssd1306_cli(int argc, char **argv)
>>>>>>>> +{
>>>>>>>> +    int rc;
>>>>>>>> +
>>>>>>>> +    if (argc < 1) {
>>>>>>>> +        console_printf("too few args\n");
>>>>>>>> +        return 0;
>>>>>>>> +    }
>>>>>>>> +    if (!strcmp(argv[1], "init")) {
>>>>>>>> +        rc = ssd1306_init(SSD1306_DEV);
>>>>>>>> +        console_printf("ssd1306_init() = %d\n", rc);
>>>>>>>> +        if (rc) {
>>>>>>>> +            return 0;
>>>>>>>> +        }
>>>>>>>> +        rc = ssd1306_enable();
>>>>>>>> +        console_printf("ssd1306_enable() = %d\n", rc);
>>>>>>>> +    } else if (!strcmp(argv[1], "cls")) {
>>>>>>>> +        rc = ssd1306_fill(0);
>>>>>>>> +        console_printf("ssd1306_fill(0) = %d\n", rc);
>>>>>>>> +    } else if (!strcmp(argv[1], "fill")) {
>>>>>>>> +        rc = ssd1306_fill(255);
>>>>>>>> +        console_printf("ssd1306_fill(255) = %d\n", rc);
>>>>>>>> +    }
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +struct shell_cmd ssd1306_cli_cmd = {
>>>>>>>> +    .sc_cmd = "oled",
>>>>>>>> +    .sc_cmd_func = ssd1306_cli
>>>>>>>> +};
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +#include <hal/hal_i2c.h>
>>>>>>>> +#define GYRO_DEV 5
>>>>>>>> +
>>>>>>>> +static int
>>>>>>>> +mpu3050_cli(int argc, char **argv)
>>>>>>>> +{
>>>>>>>> +    int rc;
>>>>>>>> +    static struct mpu3050 gyro;
>>>>>>>> +    uint16_t x, y, z;
>>>>>>>> +    uint8_t reg, val;
>>>>>>>> +
>>>>>>>> +    if (argc < 2) {
>>>>>>>> +        console_printf("too few args\n");
>>>>>>>> +        return 0;
>>>>>>>> +    }
>>>>>>>> +    if (!strcmp(argv[1], "init")) {
>>>>>>>> +        rc = mpu3050_init(&gyro, GYRO_DEV, MPU3050_I2C_ADDR);
>>>>>>>> +        console_printf("mpu3050_init() = %d\n", rc);
>>>>>>>> +        if (rc) {
>>>>>>>> +            return 0;
>>>>>>>> +        }
>>>>>>>> +    } else if (!strcmp(argv[1], "raw")) {
>>>>>>>> +        rc = mpu3050_read_xyz(&gyro, &x, &y, &z);
>>>>>>>> +        console_printf("mpu3050_read_raw() = %d\n", rc);
>>>>>>>> +        if (rc == 0) {
>>>>>>>> +            console_printf("x=%d y=%d x=%d\n", x, y, z);
>>>>>>>> +        }
>>>>>>>> +    } else if (!strcmp(argv[1], "reg")) {
>>>>>>>> +        if (argc < 3) {
>>>>>>>> +            return 0;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        reg = strtoul(argv[2], 0, 0);
>>>>>>>> +        rc = mpu3050_read_reg(&gyro, reg, &val);
>>>>>>>> +        console_printf("mpu3050_read_reg(%d) = %d\n", reg, rc);
>>>>>>>> +        if (rc == 0) {
>>>>>>>> +            console_printf("val=%x\n", val);
>>>>>>>> +        }
>>>>>>>> +    } else if (!strcmp(argv[1], "probe")) {
>>>>>>>> +        uint32_t now, then;
>>>>>>>> +        if (argc < 3) {
>>>>>>>> +            console_printf("more args needed\n");
>>>>>>>> +            return 0;
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        val = strtoul(argv[2], 0, 0);
>>>>>>>> +        then = os_time_get();
>>>>>>>> +        rc = hal_i2c_master_probe(0, 0x40, val);
>>>>>>>> +        now = os_time_get();
>>>>>>>> +        console_printf("probe=%d %ld->%ld\n", rc, then, now);
>>>>>>>> +    } else {
>>>>>>>> +        console_printf("unknown cmd %s\n", argv[1]);
>>>>>>>> +    }
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +struct shell_cmd mpu3050_cli_cmd = {
>>>>>>>> +    .sc_cmd = "gyro",
>>>>>>>> +    .sc_cmd_func = mpu3050_cli
>>>>>>>> +};
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * init_tasks
>>>>>>>> + *
>>>>>>>> + * Called by main.c after os_init(). This function performs
>>>> initializations
>>>>>>>> + * that are required before tasks are running.
>>>>>>>> + *
>>>>>>>> + * @return int 0 success; error otherwise.
>>>>>>>> + */
>>>>>>>> +int
>>>>>>>> +init_tasks(void)
>>>>>>>> +{
>>>>>>>> +    /* Initialize global test semaphore */
>>>>>>>> +    os_sem_init(&g_test_sem, 0);
>>>>>>>> +
>>>>>>>> +    os_task_init(&task1, "task1", task1_handler, NULL,
>>>>>>>> +            TASK1_PRIO, OS_WAIT_FOREVER, stack1, TASK1_STACK_SIZE);
>>>>>>>> +
>>>>>>>> +    tasks_initialized = 1;
>>>>>>>> +    return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +#ifdef NFFS_PRESENT
>>>>>>>> +static void
>>>>>>>> +setup_for_nffs(void)
>>>>>>>> +{
>>>>>>>> +    /* NFFS_AREA_MAX is defined in the BSP-specified bsp.h header
>>>> file. */
>>>>>>>> +    struct nffs_area_desc descs[NFFS_AREA_MAX + 1];
>>>>>>>> +    int cnt;
>>>>>>>> +    int rc;
>>>>>>>> +
>>>>>>>> +    /* Initialize nffs's internal state. */
>>>>>>>> +    rc = nffs_init();
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    /* Convert the set of flash blocks we intend to use for nffs
>>>> into an array
>>>>>>>> +     * of nffs area descriptors.
>>>>>>>> +     */
>>>>>>>> +    cnt = NFFS_AREA_MAX;
>>>>>>>> +    rc = flash_area_to_nffs_desc(FLASH_AREA_NFFS, &cnt, descs);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    /* Attempt to restore an existing nffs file system from flash. */
>>>>>>>> +    if (nffs_detect(descs) == FS_ECORRUPT) {
>>>>>>>> +        /* No valid nffs instance detected; format a new one. */
>>>>>>>> +        rc = nffs_format(descs);
>>>>>>>> +        assert(rc == 0);
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +    fs_mkdir(MY_CONFIG_DIR);
>>>>>>>> +    rc = conf_file_src(&my_conf);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +    rc = conf_file_dst(&my_conf);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +#elif FCB_PRESENT
>>>>>>>> +
>>>>>>>> +static void
>>>>>>>> +setup_for_fcb(void)
>>>>>>>> +{
>>>>>>>> +    int cnt;
>>>>>>>> +    int rc;
>>>>>>>> +
>>>>>>>> +    rc = flash_area_to_sectors(FLASH_AREA_NFFS, &cnt, NULL);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +    assert(cnt <= sizeof(conf_fcb_area) / sizeof(conf_fcb_area[0]));
>>>>>>>> +    flash_area_to_sectors(FLASH_AREA_NFFS, &cnt, conf_fcb_area);
>>>>>>>> +
>>>>>>>> +    my_conf.cf_fcb.f_sector_cnt = cnt;
>>>>>>>> +
>>>>>>>> +    rc = conf_fcb_src(&my_conf);
>>>>>>>> +    if (rc) {
>>>>>>>> +        for (cnt = 0; cnt < my_conf.cf_fcb.f_sector_cnt; cnt++) {
>>>>>>>> +            flash_area_erase(&conf_fcb_area[cnt], 0,
>>>>>>>> +              conf_fcb_area[cnt].fa_size);
>>>>>>>> +        }
>>>>>>>> +        rc = conf_fcb_src(&my_conf);
>>>>>>>> +    }
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +    rc = conf_fcb_dst(&my_conf);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +/**
>>>>>>>> + * main
>>>>>>>> + *
>>>>>>>> + * The main function for the project. This function initializes the
>>>> os, calls
>>>>>>>> + * init_tasks to initialize tasks (and possibly other objects), then
>>>> starts the
>>>>>>>> + * OS. We should not return from os start.
>>>>>>>> + *
>>>>>>>> + * @return int NOTE: this function should never return!
>>>>>>>> + */
>>>>>>>> +int
>>>>>>>> +main(int argc, char **argv)
>>>>>>>> +{
>>>>>>>> +    int rc;
>>>>>>>> +    struct image_version ver;
>>>>>>>> +
>>>>>>>> +#ifdef ARCH_sim
>>>>>>>> +    mcu_sim_parse_args(argc, argv);
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +    conf_init();
>>>>>>>> +    rc = conf_register(&test_conf_handler);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    os_init();
>>>>>>>> +
>>>>>>>> +    rc = os_mempool_init(&default_mbuf_mpool,
>>>> DEFAULT_MBUF_MPOOL_NBUFS,
>>>>>>>> +            DEFAULT_MBUF_MPOOL_BUF_LEN, default_mbuf_mpool_data,
>>>>>>>> +            "default_mbuf_data");
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    rc = os_mbuf_pool_init(&default_mbuf_pool, &default_mbuf_mpool,
>>>>>>>> +            DEFAULT_MBUF_MPOOL_BUF_LEN, DEFAULT_MBUF_MPOOL_NBUFS);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    rc = os_msys_register(&default_mbuf_pool);
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +    rc = hal_flash_init();
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> +#ifdef NFFS_PRESENT
>>>>>>>> +    setup_for_nffs();
>>>>>>>> +#elif FCB_PRESENT
>>>>>>>> +    setup_for_fcb();
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> +    id_init();
>>>>>>>> +
>>>>>>>> +    shell_task_init(SHELL_TASK_PRIO, shell_stack,
>>>> SHELL_TASK_STACK_SIZE,
>>>>>>>> +                    SHELL_MAX_INPUT_LEN);
>>>>>>>> +
>>>>>>>> +    nmgr_task_init(NEWTMGR_TASK_PRIO, newtmgr_stack,
>>>> NEWTMGR_TASK_STACK_SIZE);
>>>>>>>> +    imgmgr_module_init();
>>>>>>>> +
>>>>>>>> +    if (imgr_my_version(&ver) == 0) {
>>>>>>>> +        console_printf("\nSlinky %u.%u.%u.%u\n",
>>>>>>>> +          ver.iv_major, ver.iv_minor, ver.iv_revision,
>>>>>>>> +          (unsigned int)ver.iv_build_num);
>>>>>>>> +    } else {
>>>>>>>> +        console_printf("\nSlinky\n");
>>>>>>>> +    }
>>>>>>>> +
>>>>>>>> +#if 0
>>>>>>>> +    shell_cmd_register(&ssd1306_cli_cmd);
>>>>>>>> +#endif
>>>>>>>> +    shell_cmd_register(&mpu3050_cli_cmd);
>>>>>>>> +
>>>>>>>> +    conf_load();
>>>>>>>> +
>>>>>>>> +    rc = init_tasks();
>>>>>>>> +
>>>>>>>> +    os_start();
>>>>>>>> +
>>>>>>>> +    /* os start should never return. If it does, this should be an
>>>> error */
>>>>>>>> +    assert(0);
>>>>>>>> +
>>>>>>>> +    return rc;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/slinky/src/main.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/slinky/src/main.c b/apps/slinky/src/main.c
>>>>>>>> index 9007fdd..956ce38 100755
>>>>>>>> --- a/apps/slinky/src/main.c
>>>>>>>> +++ b/apps/slinky/src/main.c
>>>>>>>> @@ -61,11 +61,6 @@ static volatile int g_task1_loops;
>>>>>>>> #define TASK2_STACK_SIZE    OS_STACK_ALIGN(64)
>>>>>>>> static struct os_task task2;
>>>>>>>> 
>>>>>>>> -/* Task 3 */
>>>>>>>> -#define TASK3_PRIO (10)
>>>>>>>> -#define TASK3_STACK_SIZE    OS_STACK_ALIGN(512)
>>>>>>>> -static struct os_task task3;
>>>>>>>> -
>>>>>>>> static struct log my_log;
>>>>>>>> 
>>>>>>>> static volatile int g_task2_loops;
>>>>>>>> @@ -106,8 +101,6 @@ static char test_str[32];
>>>>>>>> static uint32_t cbmem_buf[MAX_CBMEM_BUF];
>>>>>>>> static struct cbmem cbmem;
>>>>>>>> 
>>>>>>>> -static struct os_eventq slinky_evq;
>>>>>>>> -
>>>>>>>> static char *
>>>>>>>> test_conf_get(int argc, char **argv, char *buf, int max_len)
>>>>>>>> {
>>>>>>>> @@ -212,18 +205,6 @@ task2_handler(void *arg)
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> - * This task serves as a container for the shell and newtmgr
>>>> packages.  These
>>>>>>>> - * packages enqueue timer events when they need this task to do work.
>>>>>>>> - */
>>>>>>>> -static void
>>>>>>>> -task3_handler(void *arg)
>>>>>>>> -{
>>>>>>>> -    while (1) {
>>>>>>>> -        os_eventq_run(&slinky_evq);
>>>>>>>> -    }
>>>>>>>> -}
>>>>>>>> -
>>>>>>>> -/**
>>>>>>>> * init_tasks
>>>>>>>> *
>>>>>>>> * Called by main.c after sysinit(). This function performs
>>>> initializations
>>>>>>>> @@ -250,19 +231,6 @@ init_tasks(void)
>>>>>>>> 
>>>>>>>> os_task_init(&task2, "task2", task2_handler, NULL,
>>>>>>>>         TASK2_PRIO, OS_WAIT_FOREVER, pstack, TASK2_STACK_SIZE);
>>>>>>>> -
>>>>>>>> -    pstack = malloc(sizeof(os_stack_t)*TASK3_STACK_SIZE);
>>>>>>>> -    assert(pstack);
>>>>>>>> -
>>>>>>>> -    os_task_init(&task3, "task3", task3_handler, NULL,
>>>>>>>> -            TASK3_PRIO, OS_WAIT_FOREVER, pstack, TASK3_STACK_SIZE);
>>>>>>>> -
>>>>>>>> -    /* Initialize eventq and designate it as the default.  Packages
>>>> that need
>>>>>>>> -     * to schedule work items will piggyback on this eventq.
>>>> Example packages
>>>>>>>> -     * which do this are sys/shell and mgmt/newtmgr.
>>>>>>>> -     */
>>>>>>>> -    os_eventq_init(&slinky_evq);
>>>>>>>> -    os_eventq_dflt_set(&slinky_evq);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> @@ -318,10 +286,10 @@ main(int argc, char **argv)
>>>>>>>> }
>>>>>>>> #endif
>>>>>>>> 
>>>>>>>> -    os_start();
>>>>>>>> -
>>>>>>>> -    /* os start should never return. If it does, this should be an
>>>> error */
>>>>>>>> -    assert(0);
>>>>>>>> -
>>>>>>>> -    return rc;
>>>>>>>> +    /*
>>>>>>>> +     * As the last thing, process events from default event queue.
>>>>>>>> +     */
>>>>>>>> +    while (1) {
>>>>>>>> +        os_eventq_run(os_eventq_dflt_get());
>>>>>>>> +    }
>>>>>>>> }
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/apps/slinky/syscfg.yml
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/apps/slinky/syscfg.yml b/apps/slinky/syscfg.yml
>>>>>>>> index 7438a81..1beee37 100644
>>>>>>>> --- a/apps/slinky/syscfg.yml
>>>>>>>> +++ b/apps/slinky/syscfg.yml
>>>>>>>> @@ -40,3 +40,6 @@ syscfg.vals:
>>>>>>>> STATS_NEWTMGR: 1
>>>>>>>> LOG_NEWTMGR: 1
>>>>>>>> CONFIG_NEWTMGR: 1
>>>>>>>> +
>>>>>>>> +    OS_MAIN_TASK_PRIO: 10
>>>>>>>> +    OS_MAIN_STACKS_SIZE: 512
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/hw/mcu/native/src/hal_system.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/hw/mcu/native/src/hal_system.c b/hw/mcu/native/src/hal_
>>>> system.c
>>>>>>>> index 5931c81..59927c9 100644
>>>>>>>> --- a/hw/mcu/native/src/hal_system.c
>>>>>>>> +++ b/hw/mcu/native/src/hal_system.c
>>>>>>>> @@ -26,6 +26,10 @@
>>>>>>>> #include "hal/hal_system.h"
>>>>>>>> #include "mcu/mcu_sim.h"
>>>>>>>> 
>>>>>>>> +#if MYNEWT_VAL(OS_SCHEDULING)
>>>>>>>> +#include <os/os.h>
>>>>>>>> +#endif
>>>>>>>> +
>>>>>>>> void
>>>>>>>> hal_system_reset(void)
>>>>>>>> {
>>>>>>>> @@ -59,8 +63,14 @@ void
>>>>>>>> mcu_sim_parse_args(int argc, char **argv)
>>>>>>>> {
>>>>>>>> int ch;
>>>>>>>> -    char *progname = argv[0];
>>>>>>>> +    char *progname;
>>>>>>>> 
>>>>>>>> +#if MYNEWT_VAL(OS_SCHEDULING)
>>>>>>>> +    if (g_os_started) {
>>>>>>>> +        return;
>>>>>>>> +    }
>>>>>>>> +#endif
>>>>>>>> +    progname = argv[0];
>>>>>>>> while ((ch = getopt(argc, argv, "hf:u:")) != -1) {
>>>>>>>>     switch (ch) {
>>>>>>>>     case 'f':
>>>>>>>> @@ -77,4 +87,8 @@ mcu_sim_parse_args(int argc, char **argv)
>>>>>>>>         break;
>>>>>>>>     }
>>>>>>>> }
>>>>>>>> +#if MYNEWT_VAL(OS_SCHEDULING)
>>>>>>>> +    os_init();
>>>>>>>> +    os_start();
>>>>>>>> +#endif
>>>>>>>> }
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/include/os/os.h
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/include/os/os.h b/kernel/os/include/os/os.h
>>>>>>>> index 0939dac..17f42a8 100644
>>>>>>>> --- a/kernel/os/include/os/os.h
>>>>>>>> +++ b/kernel/os/include/os/os.h
>>>>>>>> @@ -83,6 +83,8 @@ enum os_error {
>>>>>>>> typedef enum os_error os_error_t;
>>>>>>>> 
>>>>>>>> #define OS_IDLE_PRIO (0xff)
>>>>>>>> +#define OS_MAIN_TASK_PRIO       MYNEWT_VAL(OS_MAIN_TASK_PRIO)
>>>>>>>> +#define OS_MAIN_STACK_SIZE      MYNEWT_VAL(OS_MAIN_STACK_SIZE)
>>>>>>>> 
>>>>>>>> void os_init(void);
>>>>>>>> void os_start(void);
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/include/os/os_eventq.h
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/include/os/os_eventq.h
>>>> b/kernel/os/include/os/os_eventq.h
>>>>>>>> index cfe0d34..092e724 100644
>>>>>>>> --- a/kernel/os/include/os/os_eventq.h
>>>>>>>> +++ b/kernel/os/include/os/os_eventq.h
>>>>>>>> @@ -53,7 +53,6 @@ struct os_event *os_eventq_get(struct os_eventq *);
>>>>>>>> void os_eventq_run(struct os_eventq *evq);
>>>>>>>> struct os_event *os_eventq_poll(struct os_eventq **, int, os_time_t);
>>>>>>>> void os_eventq_remove(struct os_eventq *, struct os_event *);
>>>>>>>> -void os_eventq_dflt_set(struct os_eventq *evq);
>>>>>>>> struct os_eventq *os_eventq_dflt_get(void);
>>>>>>>> void os_eventq_designate(struct os_eventq **dst, struct os_eventq
>>>> *val,
>>>>>>>>                      struct os_event *start_ev);
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/src/os.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/src/os.c b/kernel/os/src/os.c
>>>>>>>> index 6dfe128..374f5f1 100644
>>>>>>>> --- a/kernel/os/src/os.c
>>>>>>>> +++ b/kernel/os/src/os.c
>>>>>>>> @@ -42,6 +42,10 @@ struct os_task g_idle_task;
>>>>>>>> os_stack_t g_idle_task_stack[OS_STACK_ALIGN(OS_IDLE_STACK_SIZE)];
>>>>>>>> 
>>>>>>>> uint32_t g_os_idle_ctr;
>>>>>>>> +
>>>>>>>> +static struct os_task os_main_task;
>>>>>>>> +static os_stack_t os_main_stack[OS_STACK_ALIGN(OS_MAIN_STACK_SIZE)];
>>>>>>>> +
>>>>>>>> /* Default zero.  Set by the architecture specific code when os is
>>>> started.
>>>>>>>> */
>>>>>>>> int g_os_started;
>>>>>>>> @@ -123,6 +127,21 @@ os_started(void)
>>>>>>>> return (g_os_started);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> +static void
>>>>>>>> +os_main(void *arg)
>>>>>>>> +{
>>>>>>>> +    extern int main(int argc, char **argv);
>>>>>>>> +
>>>>>>>> +    os_eventq_init(os_eventq_dflt_get());
>>>>>>>> +#if !MYNEWT_VAL(SELFTEST)
>>>>>>>> +    main(0, NULL);
>>>>>>>> +#else
>>>>>>>> +    while (1) {
>>>>>>>> +        os_eventq_run(os_eventq_dflt_get());
>>>>>>>> +    }
>>>>>>>> +#endif
>>>>>>>> +    assert(0);
>>>>>>>> +}
>>>>>>>> 
>>>>>>>> void
>>>>>>>> os_init_idle_task(void)
>>>>>>>> @@ -138,6 +157,11 @@ os_init_idle_task(void)
>>>>>>>> rc = os_sanity_init();
>>>>>>>> assert(rc == 0);
>>>>>>>> 
>>>>>>>> +    rc = os_task_init(&os_main_task, "main", os_main, NULL,
>>>>>>>> +            OS_MAIN_TASK_PRIO, OS_WAIT_FOREVER, os_main_stack,
>>>>>>>> +            OS_STACK_ALIGN(OS_MAIN_STACK_SIZE));
>>>>>>>> +    assert(rc == 0);
>>>>>>>> +
>>>>>>>> assert(MYNEWT_VAL(WATCHDOG_INTERVAL) - 200 >
>>>> MYNEWT_VAL(SANITY_INTERVAL));
>>>>>>>> 
>>>>>>>> rc = hal_watchdog_init(MYNEWT_VAL(WATCHDOG_INTERVAL));
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/src/os_eventq.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/src/os_eventq.c b/kernel/os/src/os_eventq.c
>>>>>>>> index d443dfd..d5be9ae 100644
>>>>>>>> --- a/kernel/os/src/os_eventq.c
>>>>>>>> +++ b/kernel/os/src/os_eventq.c
>>>>>>>> @@ -29,7 +29,7 @@
>>>>>>>> *   @{
>>>>>>>> */
>>>>>>>> 
>>>>>>>> -static struct os_eventq *os_eventq_main;
>>>>>>>> +static struct os_eventq os_eventq_main;
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> * Initialize the event queue
>>>>>>>> @@ -279,29 +279,14 @@ os_eventq_remove(struct os_eventq *evq, struct
>>>> os_event *ev)
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> - * Assigns the default event queue.  Packages which require an event
>>>> queue, and
>>>>>>>> - * which haven't been explicitly told which one to use, will use
>>>> this one
>>>>>>>> - * automatically.
>>>>>>>> + * Retrieves the default event queue processed by OS main task.
>>>>>>>> *
>>>>>>>> - * @param evq                   The event queue to designate as the
>>>> default.
>>>>>>>> - */
>>>>>>>> -void
>>>>>>>> -os_eventq_dflt_set(struct os_eventq *evq)
>>>>>>>> -{
>>>>>>>> -    os_eventq_main = evq;
>>>>>>>> -}
>>>>>>>> -
>>>>>>>> -/**
>>>>>>>> - * Retrieves the default event queue, if any.  The default event
>>>> queue is
>>>>>>>> - * designated via a call to os_eventq_dflt_set().
>>>>>>>> - *
>>>>>>>> - * @return                      The default event queue, no NULL if
>>>> there isn't
>>>>>>>> - *                                  any.
>>>>>>>> + * @return                      The default event queue.
>>>>>>>> */
>>>>>>>> struct os_eventq *
>>>>>>>> os_eventq_dflt_get(void)
>>>>>>>> {
>>>>>>>> -    return os_eventq_main;
>>>>>>>> +    return &os_eventq_main;
>>>>>>>> }
>>>>>>>> 
>>>>>>>> void
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/syscfg.yml
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/syscfg.yml b/kernel/os/syscfg.yml
>>>>>>>> index e175bce..e329059 100644
>>>>>>>> --- a/kernel/os/syscfg.yml
>>>>>>>> +++ b/kernel/os/syscfg.yml
>>>>>>>> @@ -19,6 +19,12 @@
>>>>>>>> # Package: kernel/os
>>>>>>>> 
>>>>>>>> syscfg.defs:
>>>>>>>> +    OS_MAIN_TASK_PRIO:
>>>>>>>> +        description: 'Priority of initialization and main task'
>>>>>>>> +        value: 0xfe
>>>>>>>> +    OS_MAIN_STACK_SIZE:
>>>>>>>> +        description: 'Stack size of initialization and main task'
>>>>>>>> +        value: 1024
>>>>>>>> OS_CLI:
>>>>>>>>     description: 'TBD'
>>>>>>>>     value: 0
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/eventq_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/eventq_test.c
>>>> b/kernel/os/test/src/eventq_test.c
>>>>>>>> index 01e8f3f..a48546d 100644
>>>>>>>> --- a/kernel/os/test/src/eventq_test.c
>>>>>>>> +++ b/kernel/os/test/src/eventq_test.c
>>>>>>>> @@ -197,7 +197,6 @@ eventq_task_poll_timeout_send(void *arg)
>>>>>>>> 
>>>>>>>> /* This task sleeps until the receive task completes the test. */
>>>>>>>> os_time_delay(1000000);
>>>>>>>> -
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /* Receiving multiple event queues with a time failure */
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/mempool_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/mempool_test.c
>>>> b/kernel/os/test/src/mempool_test.c
>>>>>>>> index 7d86c2c..5be2aca 100644
>>>>>>>> --- a/kernel/os/test/src/mempool_test.c
>>>>>>>> +++ b/kernel/os/test/src/mempool_test.c
>>>>>>>> @@ -60,6 +60,7 @@ mempool_test_get_pool_size(int num_blocks, int
>>>> block_size)
>>>>>>>> void
>>>>>>>> os_mempool_ts_pretest(void* arg)
>>>>>>>> {
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> }
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/mutex_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/mutex_test.c
>>>> b/kernel/os/test/src/mutex_test.c
>>>>>>>> index 6f8ee69..ae05a27 100644
>>>>>>>> --- a/kernel/os/test/src/mutex_test.c
>>>>>>>> +++ b/kernel/os/test/src/mutex_test.c
>>>>>>>> @@ -296,7 +296,7 @@ mutex_task3_handler(void *arg)
>>>>>>>> }
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> +void
>>>>>>>> mutex_task4_handler(void *arg)
>>>>>>>> {
>>>>>>>> os_error_t err;
>>>>>>>> @@ -335,6 +335,7 @@ os_mutex_tc_pretest(void* arg)
>>>>>>>> /*
>>>>>>>>  * Only call if running in "native" simulated environment
>>>>>>>>  */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> return;
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/os_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/os_test.c
>>>> b/kernel/os/test/src/os_test.c
>>>>>>>> index 2e5bf9d..33b0868 100644
>>>>>>>> --- a/kernel/os/test/src/os_test.c
>>>>>>>> +++ b/kernel/os/test/src/os_test.c
>>>>>>>> @@ -73,6 +73,7 @@ os_test_restart(void)
>>>>>>>> void
>>>>>>>> os_selftest_pretest_cb(void* arg)
>>>>>>>> {
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> }
>>>>>>>> 
>>>>>>>> @@ -92,10 +93,10 @@ os_test_all(void)
>>>>>>>> 
>>>>>>>> tu_suite_set_init_cb(os_mempool_test_init, NULL);
>>>>>>>> os_mempool_test_suite();
>>>>>>>> -
>>>>>>>> +#if 1
>>>>>>>> tu_suite_set_init_cb(os_mutex_test_init, NULL);
>>>>>>>> os_mutex_test_suite();
>>>>>>>> -
>>>>>>>> +#endif
>>>>>>>> tu_suite_set_init_cb(os_sem_test_init, NULL);
>>>>>>>> os_sem_test_suite();
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/sem_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/sem_test.c
>>>> b/kernel/os/test/src/sem_test.c
>>>>>>>> index 98348b4..42e7bfe 100644
>>>>>>>> --- a/kernel/os/test/src/sem_test.c
>>>>>>>> +++ b/kernel/os/test/src/sem_test.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> @@ -44,23 +44,23 @@ os_stack_t *stack4;
>>>>>>>> struct os_sem g_sem1;
>>>>>>>> #endif /* MYNEWT_VAL(SELFTEST) */
>>>>>>>> 
>>>>>>>> -/*
>>>>>>>> +/*
>>>>>>>> * TEST NUMBERS:
>>>>>>>> *  10: In this test we have the highest priority task getting the
>>>> semaphore
>>>>>>>> *  then sleeping. Two lower priority tasks then wake up and attempt
>>>> to get
>>>>>>>> *  the semaphore. They are blocked until the higher priority task
>>>> releases
>>>>>>>> *  the semaphore, at which point the lower priority tasks should wake
>>>> up in
>>>>>>>> *  order, get the semaphore, then release it and go back to sleep.
>>>>>>>> - *
>>>>>>>> + *
>>>>>>>> */
>>>>>>>> char sem_test_buf[128];
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> * sem test disp sem
>>>>>>>> - *
>>>>>>>> - * Display semaphore contents
>>>>>>>> - *
>>>>>>>> - * @param sem
>>>>>>>> + *
>>>>>>>> + * Display semaphore contents
>>>>>>>> + *
>>>>>>>> + * @param sem
>>>>>>>> */
>>>>>>>> const char *
>>>>>>>> sem_test_sem_to_s(const struct os_sem *sem)
>>>>>>>> @@ -71,7 +71,7 @@ sem_test_sem_to_s(const struct os_sem *sem)
>>>>>>>> return sem_test_buf;
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> +void
>>>>>>>> sem_test_sleep_task_handler(void *arg)
>>>>>>>> {
>>>>>>>> struct os_task *t;
>>>>>>>> @@ -104,13 +104,13 @@ sem_test_pend_release_loop(int delay, int
>>>> timeout, int itvl)
>>>>>>>> }
>>>>>>>> 
>>>>>>>> /**
>>>>>>>> - * sem test basic
>>>>>>>> - *
>>>>>>>> + * sem test basic
>>>>>>>> + *
>>>>>>>> * Basic semaphore tests
>>>>>>>> - *
>>>>>>>> - * @return int
>>>>>>>> + *
>>>>>>>> + * @return int
>>>>>>>> */
>>>>>>>> -void
>>>>>>>> +void
>>>>>>>> sem_test_basic_handler(void *arg)
>>>>>>>> {
>>>>>>>> struct os_task *t;
>>>>>>>> @@ -178,7 +178,7 @@ sem_test_basic_handler(void *arg)
>>>>>>>> #endif
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> +void
>>>>>>>> sem_test_1_task1_handler(void *arg)
>>>>>>>> {
>>>>>>>> os_error_t err;
>>>>>>>> @@ -208,69 +208,69 @@ sem_test_1_task1_handler(void *arg)
>>>>>>>> #endif
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_1_task2_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_1_task2_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, OS_TICKS_PER_SEC / 10,
>>>>>>>>                            OS_TICKS_PER_SEC / 10);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_1_task3_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_1_task3_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, OS_TIMEOUT_NEVER, OS_TICKS_PER_SEC *
>>>> 2);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_2_task2_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_2_task2_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_2_task3_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_2_task3_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, OS_TIMEOUT_NEVER, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_2_task4_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_2_task4_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_3_task2_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_3_task2_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(100, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_3_task3_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_3_task3_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(150, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_3_task4_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_3_task4_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_4_task2_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_4_task2_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(60, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_4_task3_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_4_task3_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(60, 2000, 2000);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> -void
>>>>>>>> -sem_test_4_task4_handler(void *arg)
>>>>>>>> +void
>>>>>>>> +sem_test_4_task4_handler(void *arg)
>>>>>>>> {
>>>>>>>> sem_test_pend_release_loop(0, 2000, 2000);
>>>>>>>> }
>>>>>>>> @@ -279,6 +279,7 @@ void
>>>>>>>> os_sem_tc_pretest(void* arg)
>>>>>>>> {
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> return;
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/event_test_poll_0timo.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/event_test_poll_0timo.c
>>>> b/kernel/os/test/src/testcases/event_test_poll_0timo.c
>>>>>>>> index 5e86395..b53418e 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/event_test_poll_0timo.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/event_test_poll_0timo.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/event_test_
>>>> poll_single_sr.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/event_test_poll_single_sr.c
>>>> b/kernel/os/test/src/testcases/event_test_poll_single_sr.c
>>>>>>>> index 122980e..72e1a5f 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/event_test_poll_single_sr.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/event_test_poll_single_sr.c
>>>>>>>> @@ -26,10 +26,11 @@ TEST_CASE(event_test_poll_single_sr)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> /* Initialize the task */
>>>>>>>> -    os_task_init(&eventq_task_poll_single_s,
>>>> "eventq_task_poll_single_s",
>>>>>>>> +    os_task_init(&eventq_task_poll_single_s,
>>>> "eventq_task_poll_single_s",
>>>>>>>>     eventq_task_poll_single_send, NULL, SEND_TASK_POLL_SINGLE_PRIO,
>>>>>>>>     OS_WAIT_FOREVER, eventq_task_stack_poll_single_s,
>>>> POLL_STACK_SIZE);
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/event_test_poll_sr.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/event_test_poll_sr.c
>>>> b/kernel/os/test/src/testcases/event_test_poll_sr.c
>>>>>>>> index 1d003d5..e981839 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/event_test_poll_sr.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/event_test_poll_sr.c
>>>>>>>> @@ -25,6 +25,7 @@ TEST_CASE(event_test_poll_sr)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> /* Initialize the task */
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/event_test_
>>>> poll_timeout_sr.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/event_test_poll_timeout_sr.c
>>>> b/kernel/os/test/src/testcases/event_test_poll_timeout_sr.c
>>>>>>>> index 3972fa4..d7bccee 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/event_test_poll_timeout_sr.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/event_test_poll_timeout_sr.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> @@ -25,10 +25,11 @@ TEST_CASE(event_test_poll_timeout_sr)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> /* Initialize the task */
>>>>>>>> -    os_task_init(&eventq_task_poll_timeout_s,
>>>> "eventq_task_poll_timeout_s",
>>>>>>>> +    os_task_init(&eventq_task_poll_timeout_s,
>>>> "eventq_task_poll_timeout_s",
>>>>>>>>     eventq_task_poll_timeout_send, NULL,
>>>> SEND_TASK_POLL_TIMEOUT_PRIO,
>>>>>>>>     OS_WAIT_FOREVER, eventq_task_stack_poll_timeout_s,
>>>> POLL_STACK_SIZE);
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/event_test_src.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/event_test_src.c
>>>> b/kernel/os/test/src/testcases/event_test_src.c
>>>>>>>> index 9d3e35b..f1adbea 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/event_test_src.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/event_test_src.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> @@ -24,6 +24,7 @@ TEST_CASE(event_test_sr)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> /* Initialize the task */
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/os_callout_test.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/os_callout_test.c
>>>> b/kernel/os/test/src/testcases/os_callout_test.c
>>>>>>>> index fdc2926..a03570a 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/os_callout_test.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/os_callout_test.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> @@ -24,9 +24,10 @@ TEST_CASE(callout_test)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> -
>>>>>>>> +
>>>>>>>> /* Initialize the sending task */
>>>>>>>> os_task_init(&callout_task_struct_send, "callout_task_send",
>>>>>>>>     callout_task_send, NULL, SEND_CALLOUT_TASK_PRIO,
>>>> OS_WAIT_FOREVER,
>>>>>>>> @@ -38,7 +39,7 @@ TEST_CASE(callout_test)
>>>>>>>>     callout_task_stack_receive, CALLOUT_STACK_SIZE);
>>>>>>>> 
>>>>>>>> os_eventq_init(&callout_evq);
>>>>>>>> -
>>>>>>>> +
>>>>>>>> /* Initialize the callout function */
>>>>>>>> os_callout_init(&callout_test_c, &callout_evq, my_callout, NULL);
>>>>>>>> 
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/os_callout_test_speak.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/os_callout_test_speak.c
>>>> b/kernel/os/test/src/testcases/os_callout_test_speak.c
>>>>>>>> index 2d08085..de8664f 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/os_callout_test_speak.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/os_callout_test_speak.c
>>>>>>>> @@ -24,9 +24,10 @@ TEST_CASE(callout_test_speak)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> -
>>>>>>>> +
>>>>>>>> /* Initialize the sending task */
>>>>>>>> os_task_init(&callout_task_struct_speak, "callout_task_speak",
>>>>>>>>     callout_task_stop_speak, NULL, SPEAK_CALLOUT_TASK_PRIO,
>>>>>>>> @@ -38,10 +39,10 @@ TEST_CASE(callout_test_speak)
>>>>>>>>     OS_WAIT_FOREVER, callout_task_stack_listen, CALLOUT_STACK_SIZE);
>>>>>>>> 
>>>>>>>> os_eventq_init(&callout_evq);
>>>>>>>> -
>>>>>>>> +
>>>>>>>> /* Initialize the callout function */
>>>>>>>> os_callout_init(&callout_speak, &callout_evq,
>>>>>>>> -        my_callout_speak_func, NULL);
>>>>>>>> +        my_callout_speak_func, NULL);
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Does not return until OS_restart is called */
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/kernel/os/test/src/testcases/os_callout_test_stop.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/kernel/os/test/src/testcases/os_callout_test_stop.c
>>>> b/kernel/os/test/src/testcases/os_callout_test_stop.c
>>>>>>>> index 15733c1..6b1a8e7 100644
>>>>>>>> --- a/kernel/os/test/src/testcases/os_callout_test_stop.c
>>>>>>>> +++ b/kernel/os/test/src/testcases/os_callout_test_stop.c
>>>>>>>> @@ -6,7 +6,7 @@
>>>>>>>> * to you 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,
>>>>>>>> @@ -25,6 +25,7 @@ TEST_CASE(callout_test_stop)
>>>>>>>> 
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> /* Initializing the OS */
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> 
>>>>>>>> @@ -39,12 +40,12 @@ TEST_CASE(callout_test_stop)
>>>>>>>>     RECEIVE_STOP_CALLOUT_TASK_PRIO, OS_WAIT_FOREVER,
>>>>>>>>     callout_task_stack_stop_receive, CALLOUT_STACK_SIZE);
>>>>>>>> 
>>>>>>>> -    for(k = 0; k< MULTI_SIZE; k++){
>>>>>>>> +    for(k = 0; k < MULTI_SIZE; k++){
>>>>>>>>     os_eventq_init(&callout_stop_evq[k]);
>>>>>>>> }
>>>>>>>> -
>>>>>>>> +
>>>>>>>> /* Initialize the callout function */
>>>>>>>> -    for(k = 0; k<MULTI_SIZE; k++){
>>>>>>>> +    for (k = 0; k < MULTI_SIZE; k++){
>>>>>>>>     os_callout_init(&callout_stop_test[k], &callout_stop_evq[k],
>>>>>>>>        my_callout_stop_func, NULL);
>>>>>>>> }
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/libc/baselibc/src/start.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/libc/baselibc/src/start.c b/libc/baselibc/src/start.c
>>>>>>>> index 9848c76..febf5b2 100644
>>>>>>>> --- a/libc/baselibc/src/start.c
>>>>>>>> +++ b/libc/baselibc/src/start.c
>>>>>>>> @@ -18,17 +18,26 @@
>>>>>>>> */
>>>>>>>> #include <stdlib.h>
>>>>>>>> 
>>>>>>>> +#include <sysinit/sysinit.h>
>>>>>>>> +
>>>>>>>> extern int main(int argc, char **argv);
>>>>>>>> +extern void os_init(void);
>>>>>>>> +extern void os_start(void);
>>>>>>>> 
>>>>>>>> /*
>>>>>>>> * Rudimentary startup function.
>>>>>>>> */
>>>>>>>> void _start(void)
>>>>>>>> {
>>>>>>>> +#if !MYNEWT_VAL(OS_SCHEDULING)
>>>>>>>> int rc;
>>>>>>>> 
>>>>>>>> rc = main(0, NULL);
>>>>>>>> exit(rc);
>>>>>>>> +#else
>>>>>>>> +    os_init();
>>>>>>>> +    os_start();
>>>>>>>> +#endif
>>>>>>>> }
>>>>>>>> 
>>>>>>>> void
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/net/ip/mn_socket/test/src/testcases/socket_tests.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/net/ip/mn_socket/test/src/testcases/socket_tests.c
>>>> b/net/ip/mn_socket/test/src/testcases/socket_tests.c
>>>>>>>> index 3a81cc8..8bfc2b8 100644
>>>>>>>> --- a/net/ip/mn_socket/test/src/testcases/socket_tests.c
>>>>>>>> +++ b/net/ip/mn_socket/test/src/testcases/socket_tests.c
>>>>>>>> @@ -20,6 +20,7 @@
>>>>>>>> 
>>>>>>>> TEST_CASE(socket_tests)
>>>>>>>> {
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> 
>>>>>>>> os_sem_init(&test_sem, 0);
>>>>>>>> 
>>>>>>>> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-
>>>> core/blob/0c9fe5e2/test/testutil/src/testutil.c
>>>>>>>> ------------------------------------------------------------
>>>> ----------
>>>>>>>> diff --git a/test/testutil/src/testutil.c
>>>> b/test/testutil/src/testutil.c
>>>>>>>> index 6abb62b..9a1c0fe 100644
>>>>>>>> --- a/test/testutil/src/testutil.c
>>>>>>>> +++ b/test/testutil/src/testutil.c
>>>>>>>> @@ -41,6 +41,7 @@ int
>>>>>>>> tu_init(void)
>>>>>>>> {
>>>>>>>> #if MYNEWT_VAL(SELFTEST)
>>>>>>>> +    os_init();
>>>>>>>> sysinit();
>>>>>>>> #endif
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>> 
>>>> 
>>>> 
> 

Reply via email to