Das kann einige Gründe haben.

Wenn deine reset-Func nicht returnt, muss GCC das in dem Modul wissem, das die reset-Func verwendet. Am besten attribuiert man also am Prototyp im Header:
Code:
// reset.h
extern void __attribute__((noreturn)) reset(void);
Code:
// foo.c
#include "reset.h"
...
   reset();
...
statische Funktionen, die nur 1x verwendet werden, werden von GCC idR geinline, falls kein f-pointer genommen wird und man optimieren lässt.

Ansonsten kann es günstiger sein, die Func nicht zu inlinen. Wenn der Code sehr kurz ist, kann man dem Compiler helfen, indem man "inline" sagt oder __attribute__((always_inline))

Für Funktionen, die extern inline sind, muss GCC dennoch Code erzeugen, weil er nicht wissen kann, ob die Funk extern aufgerufen wird.

In diesem Falle sollte die Funktion also static inline sein. Um sie in mehreren Modulen verwenden zu können, definiert man sie also im Header
Code:
// acd.h
#ifndef _ADC_H_
...
static inline void getADC()
{
    blah
}
...
Beachte, daß trotz Inlining ein C-Compiler Argumente und Return-Werte promoten muss (C-Spec). Falls das stört (die Werte sind dann immer 16-Bit, auch wenn man sie als 8-Bit Werte deklariert hat) kommt man nur über ein Makro drumrum, weil das keine Argumente im Sinne von C hat.

Als Optimierungsstufe find ich -Os übrigens besser als -O2. Vielleicht bringt das schon nen Codegewinn?