sorry for the typo'ed subject and also these corrections are required:

In the first post example this line:
    my_event(&MY_EVENT_QUEUE, my_event);
should be:
    os_eventq_put(&MY_EVENT_QUEUE, my_event);


In the second post example this line:

rc = my_event(&MY_EVENT_QUEUE, OS_EVENT_T_PERUSER+1, arg ); //*1


should read:

rc = os_eventq_put(&MY_EVENT_QUEUE, OS_EVENT_T_PERUSER+1, arg ); //*1



All the best
Wayne

On 4 November 2016 at 12:57, Wayne Keenan <[email protected]> wrote:

> Hi,
>
> I had to move from the commonly found  'statically allocated' os_event
> usage pattern to something dynamic.
>
> This is what I'm using:
>
> // Post event:
>
>     struct os_event* my_event = (struct os_event
> *)os_memblock_get(&bleprph_mbuf_mpool);
>
>     if (!my_event) {
>         // TODO: scream loudly
>         return;
>     }
>     my_event->ev_queued = 0;
>     my_event->ev_arg = arg;
>     my_event->ev_type=OS_EVENT_T_PERUSER+1;   // *1
>     my_event(&MY_EVENT_QUEUE, my_event);
>
>
>
> // Poll handler:
>
>             case OS_EVENT_T_PERUSER+1:
>                 my_data = ev->ev_arg;
>                 os_eventq_remove(&btask_evq, ev);
>                 os_memblock_put(&task_mbuf_mpool, ev);   //* 2
>                 process_data(my_data);
>                 break;
>
>
> This seems to work and will fail quickly (reset) if step *2 isn't
> performed,  but I have some questions.
>
> 1. Is this really correct?  I've not seen it in the samples or the docs.
> 2. The samples and docs didn't make *2 obvious,  e.g. who owns the memory
> pool.
> 3. Would it be better if the Task didn't care which pool the memory came
> from? i.e. inter task events.
> 4. I've assumed OS_EVENT_T_PERUSER+n is a valid thing todo, is it? until
> what n? is there a documented range limit?
>
>
> It would be nice to have the API that perhaps look something like this:
>
> // Post:
>         rc = my_event(&MY_EVENT_QUEUE, OS_EVENT_T_PERUSER+1, arg ); //*1
>         if (rc) {
>             // TODO: scream loudly
>             return;
>         }
>
>
> At *1 a default application pool, registered with the OS,  is used (which
> would require additional API  and setup in the application main startup)
>
>
> // Poll:
>         struct os_event ev;
>
>         os_eventq_get(&task_evq, &ev);   // *1
>
>         switch (ev->ev_type) {
>             case OS_EVENT_T_PERUSER+1:
>                 my_data = ev->ev_arg;
>                 process_data(my_data);
>                 break;
>         }
>
>
> At *1 the event data is copied and the event itself is released by '
> os_eventq_get'
>
>
> All the best
> Wayne
>

Reply via email to