aboutsummaryrefslogtreecommitdiffstats
path: root/demos/Win32-MinGW/chcore.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/Win32-MinGW/chcore.c')
-rw-r--r--demos/Win32-MinGW/chcore.c125
1 files changed, 55 insertions, 70 deletions
diff --git a/demos/Win32-MinGW/chcore.c b/demos/Win32-MinGW/chcore.c
index 9e9aba3fd..1d1a134b7 100644
--- a/demos/Win32-MinGW/chcore.c
+++ b/demos/Win32-MinGW/chcore.c
@@ -17,91 +17,76 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
- * Core file for MingGW32 demo project.
+/**
+ * @addtogroup WIN32SIM_CORE
+ * @{
*/
-#include <windows.h>
-#include <stdio.h>
-
-#undef CDECL
-
#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);
-
/*
- * Simulated HW initialization.
+ * 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.
*/
-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);
+/**
+ * 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))
+void sys_puts(char *msg) {
}
-/*
- * Interrupt simulation.
+/**
+ * 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.
*/
-void ChkIntSources(void) {
- LARGE_INTEGER n;
+__attribute__((naked, weak))
+void sys_switch(Thread *otp, Thread *ntp) {
+ register struct intctx *esp asm("esp");
+
+ asm volatile ("push %ebp \n\t" \
+ "push %esi \n\t" \
+ "push %edi \n\t" \
+ "push %ebx");
+ otp->p_ctx.esp = esp;
+ esp = ntp->p_ctx.esp;
+ asm volatile ("pop %ebx \n\t" \
+ "pop %edi \n\t" \
+ "pop %esi \n\t" \
+ "pop %ebp \n\t" \
+ "ret" : : "r" (esp));
+}
- if (Com1InInterruptSimCom() || Com2InInterruptSimCom() ||
- Com1OutInterruptSimCom() || Com2OutInterruptSimCom() ||
- Com1ConnInterruptSimCom() || Com2ConnInterruptSimCom()) {
- if (chSchRescRequiredI())
- chSchDoRescheduleI();
- return;
- }
+/**
+ * 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))
+void sys_halt(void) {
- // Interrupt Timer simulation (10ms interval).
- QueryPerformanceCounter(&n);
- if (n.QuadPart > nextcnt.QuadPart) {
- nextcnt.QuadPart += slice.QuadPart;
- chSysTimerHandlerI();
- if (chSchRescRequiredI())
- chSchDoRescheduleI();
- }
+ exit(2);
}
-msg_t _idle(void *p) {
-
- while (TRUE) {
+/**
+ * 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) {
- ChkIntSources();
- Sleep(0);
- }
+ asm volatile ("push %eax \n\t" \
+ "call _chThdExit");
}
-__attribute__((fastcall)) void chSysHalt(void) {
-
- exit(2);
}
+/** @} */