Jiacheng:

First thing with the code excerpt below: TAILQ_FIRST always gives you the head 
of the queue. To iterate through all the queue elements you would use 
TAILQ_FOREACH() or you would modify the code to get the next element using 
TAILQ_NEXT. I would just use TAILQ_FOREACH. There is an example of this in 
ble_ll_sched.c.

Some other things to note about scheduler queue:
1) It is possible for items to be on the queue that have already expired. That 
means that the current cputime might have passed sch->start_time. Depending on 
how you want to deal with things, you are might be  better off doing a signed 
32-bit subtract when calculating time_tmp.
2) You are not taking into account the end time of the scheduled event. The 
event starts at sch->start_time and ends at sch->end_time. Well, if all you 
care about is the time till the next event you wont have to worry about the end 
time of the event, but if you want to iterate through the schedule, the time 
between events is the start time of event N minus the end time of event N - 1.
3) When an event is executed it is removed from the scheduler queue. Thus, if 
you asynchronously look at the first item in the scheduler queue and compare it 
to the time now you have to be aware that an event might be running and that 
the nimble stack is using the PHY. This could also cause you to think that 
nothing is going to be done in the future, but when the scheduled event is over 
that item gets rescheduled and might get put back in the scheduler queue (see 
#4, below).
4) Events in the scheduler queue appear only once. This is not an issue if you 
are only looking at the first item on the queue, but if you iterate through the 
queue this could affect you. For example, say there are two items on the queue 
(item 1 is at head, item 2 is next and is last). You see that the gap between 
the two events is 400 milliseconds (I just made that number up). When item 1 is 
executed and done, that event will get rescheduled. So lets say item 1 is a 
periodic event that occurs every 100 msecs. Item 1 will get rescheduled causing 
you to really only have 100 msecs between events.
5) The “end_time” of the scheduled item may not be the true end time of the 
underlying event. When scheduling connections we schedule them for some fixed 
amount of time. This is done to guarantee that all connections get a place in 
the scheduler queue. When the schedule item executes at “start_time” and the 
item is a connection event, the connection code will keep the current 
connection going past the “end_time” of the scheduled event if there is more 
data to be sent and the next scheduled item wont be missed. So you may think 
you have a gap between scheduled events when in reality the underlying code is 
still running.
6) For better or worse, scanning events are not on the scheduler queue; they 
are dealt with in an entirely different manner. This means that the underlying 
PHY could be used when there is nothing on the schedule queue.

I have an idea of what you are trying to do and it might end up being a bit 
tricky given the current code implementation. You may be better served adding 
an item to the schedule queue but it all depends on how you want to prioritize 
BLE activity with what you want to do.

Will

> On Jan 23, 2017, at 8:56 PM, WangJiacheng <[email protected]> wrote:
> 
> Hi, 
> 
> I’m trying to find out a free time slot between Nimble scheduled events.
> 
> I try to go through  all items on the schedule queue  global variable 
> “g_ble_ll_sched_q” to find out all the scheduled LL events near future, 
> function as
> /********************************************************************************/
> uint32_t ll_eventq_free_time_from_now(void)
> {
>  struct ble_ll_sched_item *sch;
>  uint32_t cpu_time_now;
>  uint32_t time_free;
>  uint32_t time_tmp;
>       
>  time_free = 1000000000;
>  cpu_time_now = os_cputime_get32();
> 
>  /* Look through schedule queue */
>  while ((sch = TAILQ_FIRST(&g_ble_ll_sched_q)) != NULL)
>  {
>    time_tmp = sch->start_time - cpu_time_now;
>    if  (time_tmp < time_free)
>    {
>       time_free = time_tmp;
>    }
>  }    
>       
>  return (time_free);
> }
> /********************************************************************************/
> 
> Does above function make sense to find out the free time at any given time 
> point? or any suggestion to find out the free time slot between LL events?
> 
> 
> Thanks,
> 
> Jiacheng
> 

Reply via email to