rockbox/firmware/kernel/include/tick.h
Aidan MacDonald b650e774a1 kernel: Fix unsafe cross-section reference in init_tick()
This is a small wrapper function which calls other init code
and is only called from init code; mark it INIT_ATTR to fix
the unsafe reference.

Change-Id: I5525461e9fd63955c6396d3151d209c457b3d798
2022-12-18 22:23:52 +00:00

67 lines
2 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 by Björn Stenberg
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef TICK_H
#define TICK_H
#include "config.h"
#include "system.h" /* for NULL */
extern void init_tick(void) INIT_ATTR;
#define HZ 100 /* number of ticks per second */
#define MAX_NUM_TICK_TASKS 8
/* global tick variable */
#if defined(CPU_PP) && defined(BOOTLOADER) && \
!defined(HAVE_BOOTLOADER_USB_MODE)
/* We don't enable interrupts in the PP bootloader unless USB mode is
enabled for it, so we need to fake the current_tick variable */
#define current_tick (signed)(USEC_TIMER/10000)
static inline void call_tick_tasks(void)
{
}
#else
extern volatile long current_tick;
/* inline helper for implementing target interrupt handler */
static inline void call_tick_tasks(void)
{
extern void (*tick_funcs[MAX_NUM_TICK_TASKS+1])(void);
void (**p)(void) = tick_funcs;
void (*fn)(void);
current_tick++;
for(fn = *p; fn != NULL; fn = *(++p))
{
fn();
}
}
#endif
/* implemented in target tree */
extern void tick_start(unsigned int interval_in_ms) INIT_ATTR;
extern int tick_add_task(void (*f)(void));
extern int tick_remove_task(void (*f)(void));
#endif /* TICK_H */