docs: ARM updates for Code_Overview.md

Some details on the code flow and organization have changed since
support for ARM processors was added.  Update Code_Overview.md
accordingly.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2016-07-26 10:58:33 -04:00
parent 92f81d51f4
commit a17229a4c1
1 changed files with 35 additions and 22 deletions

View File

@ -6,13 +6,22 @@ Directory Layout
The **src/** directory contains the C source for the micro-controller The **src/** directory contains the C source for the micro-controller
code. The **src/avr/** directory contains specific code for Atmel code. The **src/avr/** directory contains specific code for Atmel
ATmega micro-controllers. The **src/simulator/** contains code stubs ATmega micro-controllers. The **src/sam3x8e/** directory contains code
that allow the micro-controller to be test compiled on other specific to the Arduino Due style ARM micro-controllers. The
architectures. **src/simulator/** contains code stubs that allow the micro-controller
to be test compiled on other architectures. The **src/generic/**
directory contains helper code that may be useful across different
host architectures. The build arranges for includes of
"board/somefile.h" to first look in the current architecture directory
(eg, src/avr/somefile.h) and then in the generic directory (eg,
src/generic/somefile.h).
The **klippy/** directory contains the C and Python source for the The **klippy/** directory contains the C and Python source for the
host part of the firmware. host part of the firmware.
The **lib/** directory contains external 3rd-party library code that
is necessary to build some targets.
The **config/** directory contains example printer configuration The **config/** directory contains example printer configuration
files. files.
@ -21,16 +30,18 @@ compiling the micro-controller code.
During compilation, the build may create an **out/** directory. This During compilation, the build may create an **out/** directory. This
contains temporary build time objects. The final micro-controller contains temporary build time objects. The final micro-controller
object that is built is in **out/klipper.elf.hex** object that is built is **out/klipper.elf.hex** on AVR and
**out/klipper.bin** on ARM.
Micro-controller code flow Micro-controller code flow
========================== ==========================
Execution of the micro-controller code starts in **src/avr/main.c** Execution of the micro-controller code starts in architecture specific
which calls sched_main() located in **src/sched.c**. The sched_main() code (eg, **src/avr/main.c**) which ultimately calls sched_main()
code starts by running all functions that have been tagged with the located in **src/sched.c**. The sched_main() code starts by running
DECL_INIT() macro. It then goes on to repeatedly run all functions all functions that have been tagged with the DECL_INIT() macro. It
tagged with the DECL_TASK() macro. then goes on to repeatedly run all functions tagged with the
DECL_TASK() macro.
One of the main task functions is command_task() located in One of the main task functions is command_task() located in
**src/command.c**. This function processes incoming serial commands **src/command.c**. This function processes incoming serial commands
@ -46,12 +57,13 @@ times by scheduling timers.
Timer functions are scheduled by calling sched_timer() (located in Timer functions are scheduled by calling sched_timer() (located in
**src/sched.c**). The scheduler code will arrange for the given **src/sched.c**). The scheduler code will arrange for the given
function to be called at the requested clock time. Timer interrupts function to be called at the requested clock time. Timer interrupts
are initially handled in an interrupt handler in **src/avr/timer.c**, are initially handled in an architecture specific interrupt handler
but this just calls sched_timer_kick() located in **src/sched.c**. The (eg, **src/avr/timer.c**), but this just calls sched_timer_kick()
timer interrupt leads to execution of schedule timer functions. Timer located in **src/sched.c**. The timer interrupt leads to execution of
functions always run with interrupts disabled. The timer functions schedule timer functions. Timer functions always run with interrupts
should always complete within a few micro-seconds. At completion of disabled. The timer functions should always complete within a few
the timer event, the function may choose to reschedule itself. micro-seconds. At completion of the timer event, the function may
choose to reschedule itself.
In the event an error is detected the code can invoke shutdown() (a In the event an error is detected the code can invoke shutdown() (a
macro which calls sched_shutdown() located in **src/sched.c**). macro which calls sched_shutdown() located in **src/sched.c**).
@ -62,12 +74,12 @@ interrupts disabled.
Much of the functionality of the micro-controller involves working Much of the functionality of the micro-controller involves working
with General-Purpose Input/Output pins (GPIO). In order to abstract with General-Purpose Input/Output pins (GPIO). In order to abstract
the low-level architecture specific code from the high-level task the low-level architecture specific code from the high-level task
code, all GPIO events are implemented via wrappers. These wrappers are code, all GPIO events are implemented in architectures specific
located in **src/avr/gpio.c**. The code is compiled with gcc's "-flto wrappers (eg, **src/avr/gpio.c**). The code is compiled with gcc's
-fwhole-program" optimization which does an excellent job of inlining "-flto -fwhole-program" optimization which does an excellent job of
functions across compilation units, so most of these tiny gpio inlining functions across compilation units, so most of these tiny
functions are inlined into their callers, and there is no run-time gpio functions are inlined into their callers, and there is no
cost to using them. run-time cost to using them.
Klippy code overview Klippy code overview
==================== ====================
@ -90,4 +102,5 @@ There are three threads in the Klippy host code. The main thread
handles incoming gcode commands. A second thread (which resides handles incoming gcode commands. A second thread (which resides
entirely in the **klippy/serialqueue.c** C code) handles low-level IO entirely in the **klippy/serialqueue.c** C code) handles low-level IO
with the serial port. The third thread is used to process response with the serial port. The third thread is used to process response
messages from the micro-controller in the Python code. messages from the micro-controller in the Python code (see
**klippy/serialhdl.py**).