Prechádzať zdrojové kódy

Allow functions to be called by SysTick interruptions

DricomDragon 5 rokov pred
rodič
commit
81e6de2a93
2 zmenil súbory, kde vykonal 17 pridanie a 1 odobranie
  1. 11 1
      prog/sources/time.cpp
  2. 6 0
      prog/sources/time.h

+ 11 - 1
prog/sources/time.cpp

@@ -32,7 +32,17 @@ void busyWaitUntil (USER_MODE_ const uint32_t inDeadLineMS) {
 }
 
 void systickInterruptServiceRoutine (SECTION_MODE) {
-	gUptime += 1;
+	const uint32_t newUptime = gUptime + 1 ;
+	gUptime = newUptime ;
+
+	// Run every section routines in real.time.interrupt.routine.array
+	extern void (* __real_time_interrupt_routine_array_start) (SECTION_MODE_ const uint32_t inUptime) ;
+	extern void (* __real_time_interrupt_routine_array_end) (SECTION_MODE_ const uint32_t inUptime) ;
+	void (** ptr) (SECTION_MODE_ const uint32_t) = & __real_time_interrupt_routine_array_start ;
+	while (ptr != & __real_time_interrupt_routine_array_end) {
+		(* ptr) (MODE_ newUptime) ;
+		ptr ++ ;
+	}
 }
 
 uint32_t millis(ANY_MODE) {

+ 6 - 0
prog/sources/time.h

@@ -16,3 +16,9 @@ void systickInterruptServiceRoutine (SECTION_MODE) asm ("interrupt.section.SysTi
 uint32_t millis(ANY_MODE);
 
 uint32_t systick(ANY_MODE);
+
+#define MACRO_REAL_TIME_ISR(ROUTINE) \
+	static void (* UNIQUE_IDENTIFIER) (SECTION_MODE_ const uint32_t inUptime) \
+__attribute__ ((section ("real.time.interrupt.routine.array"))) \
+__attribute__ ((unused)) \
+__attribute__ ((used)) = ROUTINE ;