diff options
-rw-r--r-- | demos/Win32-MinGW/Makefile | 2 | ||||
-rw-r--r-- | demos/Win32-MinGW/chcore.c | 91 | ||||
-rw-r--r-- | demos/Win32-MinGW/chcore.h | 2 | ||||
-rw-r--r-- | demos/Win32-MinGW/chcore2.s | 43 |
4 files changed, 73 insertions, 65 deletions
diff --git a/demos/Win32-MinGW/Makefile b/demos/Win32-MinGW/Makefile index 46cb9cad0..bda1426cb 100644 --- a/demos/Win32-MinGW/Makefile +++ b/demos/Win32-MinGW/Makefile @@ -65,7 +65,7 @@ SRC = chcore.c main.c ../../ports/win32/simcom.c \ ${TESTSRC}
# List ASM source files here
-ASRC = chcore2.s
+ASRC =
# List all user directories here
UINCDIR = ../../src/include
diff --git a/demos/Win32-MinGW/chcore.c b/demos/Win32-MinGW/chcore.c index 1d1a134b7..1dc05569c 100644 --- a/demos/Win32-MinGW/chcore.c +++ b/demos/Win32-MinGW/chcore.c @@ -17,6 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <windows.h>
+#include <stdio.h>
+
+#undef CDECL
+
/**
* @addtogroup WIN32SIM_CORE
* @{
@@ -24,20 +29,75 @@ #include <ch.h>
+static LARGE_INTEGER nextcnt;
+static LARGE_INTEGER slice;
+
+void InitSimCom1(void);
+void InitSimCom2(void);
+BOOL Com1ConnInterruptSimCom(void);
+BOOL Com2ConnInterruptSimCom(void);
+BOOL Com1InInterruptSimCom(void);
+BOOL Com2InInterruptSimCom(void);
+BOOL Com1OutInterruptSimCom(void);
+BOOL Com2OutInterruptSimCom(void);
+
/*
- * This file is a template of the system driver functions provided by a port.
- * Some of the following functions may be implemented as macros in chcore.h if
- * the implementer decides that there is an advantage in doing so, as example
- * because performance concerns.
+ * Simulated HW initialization.
*/
+void InitCore(void) {
+ WSADATA wsaData;
+
+ // Initialization.
+ if (WSAStartup(2, &wsaData) != 0) {
+ printf("Unable to locate a winsock DLL\n");
+ exit(1);
+ }
+
+ printf("Win32 ChibiOS/RT simulator\n\n");
+ printf("Thread structure %d bytes\n", sizeof(Thread));
+ if (!QueryPerformanceFrequency(&slice)) {
+ printf("QueryPerformanceFrequency() error");
+ exit(1);
+ }
+ printf("Core Frequency %u Hz\n", (int)slice.LowPart);
+ slice.QuadPart /= CH_FREQUENCY;
+ QueryPerformanceCounter(&nextcnt);
+ nextcnt.QuadPart += slice.QuadPart;
+
+ InitSimCom1();
+ InitSimCom2();
+ fflush(stdout);
+}
+
+/*
+ * Interrupt simulation.
+ */
+void ChkIntSources(void) {
+ LARGE_INTEGER n;
+
+ if (Com1InInterruptSimCom() || Com2InInterruptSimCom() ||
+ Com1OutInterruptSimCom() || Com2OutInterruptSimCom() ||
+ Com1ConnInterruptSimCom() || Com2ConnInterruptSimCom()) {
+ if (chSchRescRequiredI())
+ chSchDoRescheduleI();
+ return;
+ }
+
+ // Interrupt Timer simulation (10ms interval).
+ QueryPerformanceCounter(&n);
+ if (n.QuadPart > nextcnt.QuadPart) {
+ nextcnt.QuadPart += slice.QuadPart;
+ chSysTimerHandlerI();
+ if (chSchRescRequiredI())
+ chSchDoRescheduleI();
+ }
+}
/**
* Prints a message on the system console. * @param msg pointer to the message - * @note The function is declared as a weak symbol, it is possible to redefine
- * it in your application code.
*/
-__attribute__((weak))
+__attribute__((fastcall))
void sys_puts(char *msg) {
}
@@ -45,12 +105,10 @@ void sys_puts(char *msg) { * Performs a context switch between two threads.
* @param otp the thread to be switched out
* @param ntp the thread to be switched in - * @note The function is declared as a weak symbol, it is possible to redefine
- * it in your application code.
*/
-__attribute__((naked, weak))
+__attribute__((fastcall))
void sys_switch(Thread *otp, Thread *ntp) {
- register struct intctx *esp asm("esp");
+ register struct intctx volatile *esp asm("esp");
asm volatile ("push %ebp \n\t" \
"push %esi \n\t" \
@@ -61,16 +119,13 @@ void sys_switch(Thread *otp, Thread *ntp) { asm volatile ("pop %ebx \n\t" \
"pop %edi \n\t" \
"pop %esi \n\t" \
- "pop %ebp \n\t" \
- "ret" : : "r" (esp));
+ "pop %ebp");
}
/**
* Halts the system. In this implementation it just exits the simulation. - * @note The function is declared as a weak symbol, it is possible to redefine
- * it in your application code.
*/
-__attribute__((weak))
+__attribute__((fastcall))
void sys_halt(void) {
exit(2);
@@ -78,15 +133,11 @@ void sys_halt(void) { /**
* Threads return point, it just invokes @p chThdExit(). - * @note The function is declared as a weak symbol, it is possible to redefine
- * it in your application code.
*/
-__attribute__((naked, weak))
void threadexit(void) {
asm volatile ("push %eax \n\t" \
"call _chThdExit");
}
-}
/** @} */
diff --git a/demos/Win32-MinGW/chcore.h b/demos/Win32-MinGW/chcore.h index 6c9bf1f7e..2a9fe7de8 100644 --- a/demos/Win32-MinGW/chcore.h +++ b/demos/Win32-MinGW/chcore.h @@ -66,7 +66,7 @@ struct intctx { * pointer to a @p intctx structure.
*/
typedef struct {
- struct intctx *esp;
+ struct intctx volatile *esp;
} Context;
#define APUSH(p, a) (p) -= sizeof(void *), *(void **)(p) = (void*)(a)
diff --git a/demos/Win32-MinGW/chcore2.s b/demos/Win32-MinGW/chcore2.s deleted file mode 100644 index 9334fbfdc..000000000 --- a/demos/Win32-MinGW/chcore2.s +++ /dev/null @@ -1,43 +0,0 @@ -/*
- ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
-
- This file is part of ChibiOS/RT.
-
- ChibiOS/RT 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.
-
- ChibiOS/RT 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 this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-.text
-
-.p2align 4,,15
-.globl @chSysSwitchI@8
-@chSysSwitchI@8:
- # Switch out
- push %ebp
- push %esi
- push %edi
- push %ebx
- movl %esp,16(%ecx)
- # Switch in
- movl 16(%edx),%esp
- pop %ebx
- pop %edi
- pop %esi
- pop %ebp
- ret
-
-.p2align 4,,15
-.globl @threadstart@0
-@threadstart@0:
- push %eax
- call _chThdExit
|