Browse Source

EventResponder, MillisTimer, yield

main
PaulStoffregen 5 years ago
parent
commit
c4ab57c003
4 changed files with 62 additions and 4 deletions
  1. +2
    -2
      teensy4/EventResponder.cpp
  2. +5
    -2
      teensy4/delay.c
  3. +2
    -0
      teensy4/startup.c
  4. +53
    -0
      teensy4/yield.cpp

+ 2
- 2
teensy4/EventResponder.cpp View File

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();

+ 5
- 2
teensy4/delay.c View File

// 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)
{ {

+ 2
- 0
teensy4/startup.c View File

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;

+ 53
- 0
teensy4/yield.cpp View File

/* 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();
};

Loading…
Cancel
Save