zephyr/tests/kernel/workq/work_queue
Andy Ross 0f444c84e5 drivers/timer: Add a standard workaround for known qemu issues
Qemu doesn't like tickless.  By default[1] it tries to be realtime as
vied by the host CPU -- presenting read values from hardware cycle
counters and interrupt timings at the appropriate real world clock
times according to whatever the simulated counter frequency is.  But
when the host system is loaded, there is always the problem that the
qemu process might not see physical CPU time for large chunks of time
(i.e. a host OS scheduling quantum -- generally about the same size as
guest ticks!) leading to lost cycles.

When those timer interrupts are delivered by the emulated hardware at
fixed frequencies without software intervention, that's not so bad:
the work the guest has to do after the interrupt generally happens
synchronously (because the qemu process has just started running) and
nothing notices the dropout.

But with tickless, the interrupts need to be explicitly programmed by
guest software!  That means the driver needs to be sure it's going to
get some real CPU time within some small fraction of a Zephyr tick of
the right time, otherwise the computations get wonky.

The end result is that qemu tends to work with tickless well on an
unloaded/idle run, but not in situations (like sanitycheck) where it
needs to content with other processes for host CPU.

So, add a flag that drivers can use to "fake" tickless behavior when
run under qemu (only), and enable it (only!) for the small handful of
tests that are having trouble.

[1] There is an -icount feature to implement proper cycle counting at
the expense of real-world-time correspondence.  Maybe someday we might
get it to work for us.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2018-11-13 17:10:07 -05:00
..
src tests: kernel: Do not use exact time in timing checks. 2018-08-14 07:18:44 -07:00
CMakeLists.txt samples, tests: Use semi-accurate project names 2018-10-27 21:31:25 -04:00
prj.conf drivers/timer: Add a standard workaround for known qemu issues 2018-11-13 17:10:07 -05:00
README.txt cleanup: remove nanokernel/nano leftovers 2017-12-05 09:44:23 -06:00
testcase.yaml tests: remove bat_commit, replace core with kernel 2018-10-16 09:17:51 -04:00

Title: Test workqeue APIs

Description:

A simple application verifying the workqueue API

--------------------------------------------------------------------------------

Building and Running Project:

This kernel project outputs to the console.  It can be built and executed
on QEMU as follows:

    make run

--------------------------------------------------------------------------------

Troubleshooting:

Problems caused by out-dated project information can be addressed by
issuing one of the following commands then rebuilding the project:

    make clean          # discard results of previous builds
                        # but keep existing configuration info
or
    make pristine       # discard results of previous builds
                        # and restore pre-defined configuration info

--------------------------------------------------------------------------------


***** BOOTING ZEPHYR OS vxxxx - BUILD: xxxxx *****
Starting sequence test
 - Initializing test items
 - Submitting test items
 - Submitting work 1 from preempt thread
 - Running test item 1
 - Submitting work 2 from coop thread
 - Submitting work 3 from preempt thread
 - Submitting work 4 from coop thread
 - Running test item 2
 - Submitting work 5 from preempt thread
 - Submitting work 6 from coop thread
 - Waiting for work to finish
 - Running test item 3
 - Running test item 4
 - Running test item 5
 - Running test item 6
 - Checking results
Starting resubmit test
 - Submitting work
 - Waiting for work to finish
 - Resubmitting work
 - Resubmitting work
 - Resubmitting work
 - Resubmitting work
 - Resubmitting work
 - Checking results
Starting delayed test
 - Initializing delayed test items
 - Submitting delayed test items
 - Submitting delayed work 1 from preempt thread
 - Submitting delayed work 3 from preempt thread
 - Submitting delayed work 5 from preempt thread
 - Waiting for delayed work to finish
 - Submitting delayed work 2 from coop thread
 - Submitting delayed work 4 from coop thread
 - Submitting delayed work 6 from coop thread
 - Running delayed test item 1
 - Running delayed test item 2
 - Running delayed test item 3
 - Running delayed test item 4
 - Running delayed test item 5
 - Running delayed test item 6
 - Checking results
Starting delayed resubmit test
 - Submitting delayed work
 - Waiting for work to finish
 - Resubmitting delayed work
 - Resubmitting delayed work
 - Resubmitting delayed work
 - Resubmitting delayed work
 - Resubmitting delayed work
 - Checking results
Starting delayed resubmit from coop thread test
 - Resubmitting delayed work with 1 ms
 - Resubmitting delayed work with 1 ms
 - Resubmitting delayed work with 1 ms
 - Resubmitting delayed work with 1 ms
 - Resubmitting delayed work with 1 ms
 - Resubmitting delayed work with 1 ms
 - Waiting for work to finish
 - Running delayed test item 1
 - Checking results
Starting delayed cancel test
 - Cancel delayed work from preempt thread
 - Cancel delayed work from coop thread
 - Cancel pending delayed work from coop thread
 - Waiting for work to finish
 - Checking results
===================================================================
PASS - main.
===================================================================
PROJECT EXECUTION SUCCESSFUL