enableInterrupts(irq); | enableInterrupts(irq); | ||||
} | } | ||||
void pendablesrvreq_isr(void) | |||||
extern "C" void pendablesrvreq_isr(void) | |||||
{ | { | ||||
EventResponder::runFromInterrupt(); | EventResponder::runFromInterrupt(); | ||||
} | } | ||||
// TODO: this doesn't work for IMXRT - no longer using predefined names | // TODO: this doesn't work for IMXRT - no longer using predefined names | ||||
extern "C" volatile uint32_t systick_millis_count; | extern "C" volatile uint32_t systick_millis_count; | ||||
void systick_isr(void) | |||||
extern "C" void systick_isr(void) | |||||
{ | { | ||||
systick_millis_count++; | systick_millis_count++; | ||||
MillisTimer::runFromTimer(); | MillisTimer::runFromTimer(); |
// hide an undocumented divide-by-240 circuit in the hardware? | // hide an undocumented divide-by-240 circuit in the hardware? | ||||
#define SYSTICK_EXT_FREQ 100000 | #define SYSTICK_EXT_FREQ 100000 | ||||
#if 0 | |||||
// moved to EventResponder.cpp | |||||
void systick_isr(void) | void systick_isr(void) | ||||
{ | { | ||||
systick_millis_count++; | systick_millis_count++; | ||||
//delayMicroseconds(1); | //delayMicroseconds(1); | ||||
//digitalWriteFast(12, LOW); | //digitalWriteFast(12, LOW); | ||||
} | } | ||||
#endif | |||||
#if 0 | #if 0 | ||||
void millis_init(void) | void millis_init(void) | ||||
} | } | ||||
#endif | #endif | ||||
void yield(void) | |||||
/*void yield(void) | |||||
{ | { | ||||
} | |||||
}*/ | |||||
void delay(uint32_t msec) | void delay(uint32_t msec) | ||||
{ | { |
static void memory_clear(uint32_t *dest, uint32_t *dest_end); | static void memory_clear(uint32_t *dest, uint32_t *dest_end); | ||||
static void configure_systick(void); | static void configure_systick(void); | ||||
extern void systick_isr(void); | extern void systick_isr(void); | ||||
extern void pendablesrvreq_isr(void); | |||||
void configure_cache(void); | void configure_cache(void); | ||||
void unused_interrupt_vector(void); | void unused_interrupt_vector(void); | ||||
void usb_pll_start(); | void usb_pll_start(); | ||||
static void configure_systick(void) | static void configure_systick(void) | ||||
{ | { | ||||
_VectorsRam[14] = pendablesrvreq_isr; | |||||
_VectorsRam[15] = systick_isr; | _VectorsRam[15] = systick_isr; | ||||
SYST_RVR = (SYSTICK_EXT_FREQ / 1000) - 1; | SYST_RVR = (SYSTICK_EXT_FREQ / 1000) - 1; | ||||
SYST_CVR = 0; | SYST_CVR = 0; |
/* Teensyduino Core Library | |||||
* http://www.pjrc.com/teensy/ | |||||
* Copyright (c) 2017 PJRC.COM, LLC. | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining | |||||
* a copy of this software and associated documentation files (the | |||||
* "Software"), to deal in the Software without restriction, including | |||||
* without limitation the rights to use, copy, modify, merge, publish, | |||||
* distribute, sublicense, and/or sell copies of the Software, and to | |||||
* permit persons to whom the Software is furnished to do so, subject to | |||||
* the following conditions: | |||||
* | |||||
* 1. The above copyright notice and this permission notice shall be | |||||
* included in all copies or substantial portions of the Software. | |||||
* | |||||
* 2. If the Software is incorporated into a build system that allows | |||||
* selection among a list of target devices, then similar target | |||||
* devices manufactured by PJRC.COM must be included in the list of | |||||
* target devices and selectable in the same manner. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
* SOFTWARE. | |||||
*/ | |||||
#include <Arduino.h> | |||||
#include "EventResponder.h" | |||||
void yield(void) __attribute__ ((weak)); | |||||
void yield(void) | |||||
{ | |||||
static uint8_t running=0; | |||||
if (running) return; // TODO: does this need to be atomic? | |||||
running = 1; | |||||
#if 0 | |||||
// TODO: all serialEvent to use EventResponder | |||||
if (Serial.available()) serialEvent(); | |||||
if (Serial1.available()) serialEvent1(); | |||||
if (Serial2.available()) serialEvent2(); | |||||
if (Serial3.available()) serialEvent3(); | |||||
if (Serial4.available()) serialEvent4(); | |||||
if (Serial5.available()) serialEvent5(); | |||||
if (Serial6.available()) serialEvent6(); | |||||
#endif | |||||
running = 0; | |||||
EventResponder::runFromYield(); | |||||
}; |