From 49fe48fd7a816f46eb50a52342d14173ffbd0c1e Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 10 Jan 2009 09:35:58 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@601 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/Win32-MinGW/Makefile | 2 +- demos/Win32-MinGW/chcore.c | 91 +++++++++++++++++++++++++++++++++++---------- demos/Win32-MinGW/chcore.h | 2 +- demos/Win32-MinGW/chcore2.s | 43 --------------------- 4 files changed, 73 insertions(+), 65 deletions(-) delete mode 100644 demos/Win32-MinGW/chcore2.s (limited to 'demos') 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 . */ +#include +#include + +#undef CDECL + /** * @addtogroup WIN32SIM_CORE * @{ @@ -24,20 +29,75 @@ #include +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 . -*/ - -.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 -- cgit v1.2.3