Я обычно использую такой вид функций
Код
uint8_t foo(uint8_t cmd, void *arg)
т.е. в параметрах функции задается код команды и указатель на список аргументов. Список аргументов может состоять из одной переменной, массива переменных или структуры. Возвращает функция код ошибки выполнения команды. А если нужно возвращать какие-то данные, то они опять с помощью указателя на переменную, массив или структуру данных возвращаются. Указатель совсем не обязательно типа void. Тип указателя может быть вполне определенным. Такой способ передачи параметров более универсальный и схож с тем, что использует сам компилятор (IAR в моем случае).