Thomas,
WaitForEvent() is the efficient way to wait. The DXE Core will notify the
gIdleLoopEventGuid event, when it knows there is no work to do until the next
timer tick. The platform (CPU) specific code is responsible for providing this
event. If the event exists you don’t burn much power when when you sit at the
shell prompt, or any other place where where you are waiting for events.
Definition:
https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Include/Guid/IdleLoopEvent.h
so search the code for gIdleLoopEventGuid.
If this event is not registered you will just burn power in the for loop in
WaitForEvent(). Even if the idle event just does a CpuSleep() (X86 halt) there
is a drastic savings in power when doing a WaitForEvent().
https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdeModulePkg/Core/Dxe/Event/Event.c
/**
Stops execution until an event is signaled.
@param NumberOfEvents The number of events in the UserEvents array
@param UserEvents An array of EFI_EVENT
@param UserIndex Pointer to the index of the event which
satisfied the wait condition
@retval EFI_SUCCESS The event indicated by Index was signaled.
@retval EFI_INVALID_PARAMETER The event indicated by Index has a notification
function or Event was not a valid type
@retval EFI_UNSUPPORTED The current TPL is not TPL_APPLICATION
**/
EFI_STATUS
EFIAPI
CoreWaitForEvent (
IN UINTN NumberOfEvents,
IN EFI_EVENT *UserEvents,
OUT UINTN *UserIndex
)
{
EFI_STATUS Status;
UINTN Index;
//
// Can only WaitForEvent at TPL_APPLICATION
//
if (gEfiCurrentTpl != TPL_APPLICATION) {
return EFI_UNSUPPORTED;
}
for(;;) {
for(Index = 0; Index < NumberOfEvents; Index++) {
Status = CoreCheckEvent (UserEvents[Index]);
//
// provide index of event that caused problem
//
if (Status != EFI_NOT_READY) {
*UserIndex = Index;
return Status;
}
}
//
// Signal the Idle event
//
CoreSignalEvent (gIdleLoopEvent);
}
}
Thanks,
Andrew Fish
On Apr 19, 2014, at 11:42 PM, Thomas Rognon <[email protected]> wrote:
> Here is what I would like to do:
>
> Foo () {
> // do some stuff
> // wait for a signal from a condition in code that's on a periodic timer
> // do some stuff
> }
>
> From what I see in edk2, WaitForEvent is a busy loop around CheckEvent. Is
> there a way to do this so that the execution completely stops until code in
> the periodic timer tells it to resume? Thank you for any help!
>
> Thomas
> ------------------------------------------------------------------------------
> Learn Graph Databases - Download FREE O'Reilly Book
> "Graph Databases" is the definitive new guide to graph databases and their
> applications. Written by three acclaimed leaders in the field,
> this first edition is now available. Download your free book today!
> http://p.sf.net/sfu/NeoTech_______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel