59 lines
2.6 KiB
C
59 lines
2.6 KiB
C
/***********************************************************************/
|
|
/* */
|
|
/* Heptagon */
|
|
/* */
|
|
/* Gwenael Delaval, LIG/INRIA, UJF */
|
|
/* Leonard Gerard, Parkas, ENS */
|
|
/* Adrien Guatto, Parkas, ENS */
|
|
/* Cedric Pasteur, Parkas, ENS */
|
|
/* Marc Pouzet, Parkas, ENS */
|
|
/* */
|
|
/* Copyright 2012 ENS, INRIA, UJF */
|
|
/* */
|
|
/* This file is part of the Heptagon compiler. */
|
|
/* */
|
|
/* Heptagon 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 3 of the License, or */
|
|
/* (at your option) any later version. */
|
|
/* */
|
|
/* Heptagon is distributed in the hope that it will be useful, */
|
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
|
/* GNU General Public License for more details. */
|
|
/* */
|
|
/* You should have received a copy of the GNU General Public License */
|
|
/* along with Heptagon. If not, see <http://www.gnu.org/licenses/> */
|
|
/* */
|
|
/***********************************************************************/
|
|
|
|
#include <util/atomic.h>
|
|
#include <avr/interrupt.h>
|
|
#include <avr/io.h>
|
|
#include <assert.h>
|
|
#include "avr.h"
|
|
|
|
ISR(TIMER1_COMPA_vect) {
|
|
run_timers();
|
|
}
|
|
|
|
static inline void set_ocr1a(uint16_t value) {
|
|
OCR1AH = value >> 8;
|
|
OCR1AL = value;
|
|
}
|
|
|
|
/* Source: https://adnbr.co.uk/articles/counting-milliseconds */
|
|
void init_timer1(unsigned int ms) {
|
|
assert(ms < 1000);
|
|
TCCR1B |= _BV(WGM12) | _BV(CS11);
|
|
set_ocr1a(((ms * F_CPU) / 1000) / 8);
|
|
TIMSK1 |= _BV(OCIE1A);
|
|
sei();
|
|
}
|
|
|
|
void atomic_memcpy(void *dest, const void *src, size_t size) {
|
|
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
|
memcpy(dest, src, size);
|
|
}
|
|
}
|
|
|