git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7 35acf78f-673a-0410-8e92-d51de3d6d3f4
parent
9f5b0b0b76
commit
549f84d120
|
@ -0,0 +1,21 @@
|
|||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ch", "ch.vcproj", "{0A528619-7F3F-4459-AAC5-DE8BA570D51D}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{0A528619-7F3F-4459-AAC5-DE8BA570D51D}.Debug.ActiveCfg = Debug|Win32
|
||||
{0A528619-7F3F-4459-AAC5-DE8BA570D51D}.Debug.Build.0 = Debug|Win32
|
||||
{0A528619-7F3F-4459-AAC5-DE8BA570D51D}.Release.ActiveCfg = Release|Win32
|
||||
{0A528619-7F3F-4459-AAC5-DE8BA570D51D}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,246 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="ch"
|
||||
ProjectGUID="{0A528619-7F3F-4459-AAC5-DE8BA570D51D}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\src\include;."
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="0"
|
||||
AssemblerOutput="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="WS2_32.lib"
|
||||
OutputFile="$(OutDir)/ch.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/ch.pdb"
|
||||
GenerateMapFile="TRUE"
|
||||
MapFileName="Debug\ch.map"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="3"
|
||||
GlobalOptimizations="TRUE"
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="TRUE"
|
||||
AdditionalIncludeDirectories="..\..\src\include;."
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="4"
|
||||
BufferSecurityCheck="FALSE"
|
||||
UsePrecompiledHeader="0"
|
||||
AssemblerOutput="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="WS2_32.lib"
|
||||
OutputFile="$(OutDir)/ch.exe"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/ch.pdb"
|
||||
GenerateMapFile="TRUE"
|
||||
MapFileName="Release\ch.map"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath=".\chcore.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\demo.c">
|
||||
</File>
|
||||
<Filter
|
||||
Name="src"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\..\src\chdelta.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chevents.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chinit.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chmsg.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chqueues.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chschd.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chsem.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chserial.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chsleep.c">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\chthreads.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="win32"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\..\ports\Win32\simcom.c">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
<File
|
||||
RelativePath=".\chconf.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\chcore.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\chtypes.h">
|
||||
</File>
|
||||
<Filter
|
||||
Name="include"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\..\src\include\ch.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\delta.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\events.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\messages.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\queues.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\scheduler.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\semaphores.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\serial.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\sleep.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\src\include\threads.h">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\..\docs\ch.txt">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\license.txt">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\readme.txt">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ToDo.txt">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Configuration file for Visual Studio 7 demo project.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup Config
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _CHCONF_H_
|
||||
#define _CHCONF_H_
|
||||
|
||||
/*
|
||||
* NOTE: this is just documentation for doxigen, the real configuration file
|
||||
* is the one into the project directories.
|
||||
*/
|
||||
|
||||
/** Configuration option: if specified then time efficient rather than space
|
||||
* efficient code is used when two possible implementations exist, note
|
||||
* that this is not related to the compiler optimization options.*/
|
||||
#define CH_OPTIMIZE_SPEED
|
||||
|
||||
/** Configuration option: if specified then the Virtual Timers subsystem is
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_VIRTUAL_TIMERS
|
||||
|
||||
/** Configuration option: if specified then the System Timer subsystem is
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_SYSTEMTIME
|
||||
|
||||
/** Configuration option: if specified then the \p chThdSleep() function is
|
||||
* included in the kernel.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_SLEEP
|
||||
|
||||
/** Configuration option: if specified then the \p chThdResume()
|
||||
* function is included in the kernel.*/
|
||||
#define CH_USE_RESUME
|
||||
|
||||
/** Configuration option: if specified then the \p chThdTerminate()
|
||||
* and \p chThdShouldTerminate() functions are included in the kernel.*/
|
||||
#define CH_USE_TERMINATE
|
||||
|
||||
/** Configuration option: if specified then the \p chThdWait() function
|
||||
* is included in the kernel.*/
|
||||
#define CH_USE_WAITEXIT
|
||||
|
||||
/** Configuration option: if specified then the Semaphores APIs are included
|
||||
* in the kernel.*/
|
||||
#define CH_USE_SEMAPHORES
|
||||
|
||||
/** Configuration option: if specified then the Semaphores with timeout APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_SEMAPHORES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the Semaphores APIs with priority
|
||||
* shift are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES.*/
|
||||
#define CH_USE_RT_SEMAPHORES
|
||||
|
||||
/** Configuration option: if specified then the Events APIs are included in
|
||||
* the kernel.*/
|
||||
#define CH_USE_EVENTS
|
||||
|
||||
/** Configuration option: if specified then the \p chEvtWaitTimeout()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_EVENTS.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_EVENTS_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the Synchronous Messages APIs are
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_MESSAGES
|
||||
|
||||
/** Configuration option: if specified then the \p chMsgSendTimeout()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_MESSAGES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the \p chMsgSendWithEvent()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_MESSAGES_EVENT
|
||||
|
||||
/** Configuration option: if specified then the
|
||||
* \p chThdGetExitEventSource() function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_EVENTS.*/
|
||||
#define CH_USE_EXIT_EVENT
|
||||
|
||||
/** Configuration option: if specified then the I/O queues APIs are included
|
||||
* in the kernel.*/
|
||||
#define CH_USE_QUEUES
|
||||
|
||||
/** Configuration option: if specified then the halfduplex queue APIs are
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_QUEUES_HALFDUPLEX
|
||||
|
||||
/** Configuration option: if specified then the I/O queues with timeout
|
||||
* APIs are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES_TIMEOUT.*/
|
||||
#define CH_USE_QUEUES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the full duplex serial driver APIs
|
||||
* are included in the kernel.*/
|
||||
#define CH_USE_SERIAL_FULLDUPLEX
|
||||
|
||||
/** Configuration option: if specified then the half duplex serial driver APIs
|
||||
* are included in the kernel.*/
|
||||
#define CH_USE_SERIAL_HALFDUPLEX
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 100
|
||||
|
||||
/** Configuration option: This constant is the number of ticks allowed for the
|
||||
* threads before preemption occurs.*/
|
||||
#define CH_TIME_QUANTUM 10
|
||||
|
||||
/** Configuration option: Defines a CPU register to be used as storage for the
|
||||
* global \p currp variable. Caching this variable in a register can greatly
|
||||
* improve both space and time efficiency of the generated code. Another side
|
||||
* effect is that one less register has to be saved during the context switch
|
||||
* resulting in lower RAM usage and faster code.
|
||||
* @note This option is only useable with the GCC compiler and is only useful
|
||||
* on processors with many registers like ARM cores.
|
||||
* @note If this option is enabled then ALL the libraries linked to the
|
||||
* ChibiOS/RT code <b>must</b> be recompiled with the GCC option \p
|
||||
* -ffixed-\<reg\>.
|
||||
*/
|
||||
//#define CH_CURRP_REGISTER_CACHE "reg"
|
||||
|
||||
#endif /* _CHCONF_H_ */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,112 @@
|
|||
#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.
|
||||
*/
|
||||
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 %d Hz\n", slice.LowPart);
|
||||
slice.QuadPart /= CH_FREQUENCY;
|
||||
QueryPerformanceCounter(&nextcnt);
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
|
||||
InitSimCom1();
|
||||
InitSimCom2();
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt simulation.
|
||||
*/
|
||||
static void ChkIntSources(void) {
|
||||
LARGE_INTEGER n;
|
||||
|
||||
if (Com1InInterruptSimCom() || Com2InInterruptSimCom() ||
|
||||
Com1OutInterruptSimCom() || Com2OutInterruptSimCom() ||
|
||||
Com1ConnInterruptSimCom() || Com2ConnInterruptSimCom()) {
|
||||
chSchRescheduleI();
|
||||
return;
|
||||
}
|
||||
|
||||
// Interrupt Timer simulation (10ms interval).
|
||||
QueryPerformanceCounter(&n);
|
||||
if (n.QuadPart > nextcnt.QuadPart) {
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
chSchTimerHandlerI();
|
||||
if (chSchRescRequiredI())
|
||||
chSchDoRescheduleI();
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall chSysPause(void) {
|
||||
|
||||
while (TRUE) {
|
||||
|
||||
ChkIntSources();
|
||||
Sleep(0);
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void __fastcall chSysHalt(void) {
|
||||
|
||||
exit(2);
|
||||
}
|
||||
|
||||
__declspec(naked) void __fastcall chSysSwitchI(Context *oldp, Context *newp) {
|
||||
|
||||
__asm {
|
||||
// Switch out code
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
push ebx
|
||||
mov dword ptr [ecx],esp
|
||||
// Switch in code
|
||||
mov esp,[edx]
|
||||
pop ebx
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void __fastcall threadexit(void) {
|
||||
|
||||
__asm {
|
||||
// add esp,4 ; The thread parameter
|
||||
push eax ; The exit code returned by the thread
|
||||
call chThdExit
|
||||
add esp,4
|
||||
call chSysHalt ; Should *never* happen
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Core file for Visual Studio 7 demo project.
|
||||
*/
|
||||
|
||||
#ifndef _CHCORE_H_
|
||||
#define _CHCORE_H_
|
||||
|
||||
typedef void *regx86;
|
||||
|
||||
/*
|
||||
* Stack saved context.
|
||||
*/
|
||||
struct stackregs {
|
||||
regx86 ebx;
|
||||
regx86 edi;
|
||||
regx86 esi;
|
||||
regx86 ebp;
|
||||
regx86 eip;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct stackregs *esp;
|
||||
} Context;
|
||||
|
||||
#define APUSH(p, a) (p) -= sizeof(void *), *(void **)(p) = (void*)(a)
|
||||
|
||||
#define SETUP_CONTEXT(workspace, wsize, pf, arg) \
|
||||
{ \
|
||||
BYTE8 *esp = (BYTE8 *)workspace + wsize; \
|
||||
APUSH(esp, arg); \
|
||||
APUSH(esp, threadexit); \
|
||||
esp -= sizeof(struct stackregs); \
|
||||
((struct stackregs *)esp)->eip = pf; \
|
||||
((struct stackregs *)esp)->ebx = 0; \
|
||||
((struct stackregs *)esp)->edi = 0; \
|
||||
((struct stackregs *)esp)->esi = 0; \
|
||||
((struct stackregs *)esp)->ebp = 0; \
|
||||
tp->p_ctx.esp = (struct stackregs *)esp; \
|
||||
}
|
||||
|
||||
#define chSysLock()
|
||||
|
||||
#define chSysUnlock()
|
||||
|
||||
#define INT_REQUIRED_STACK 0x0
|
||||
|
||||
#define UserStackSize(n) (sizeof(Thread) + sizeof(PTR_EQ) + sizeof(PTR_EQ) + \
|
||||
sizeof(struct stackregs) + (n) + (INT_REQUIRED_STACK))
|
||||
|
||||
void __fastcall chSysHalt(void);
|
||||
void __fastcall chSysPause(void);
|
||||
void __fastcall chSysSwitchI(Context *oldp, Context *newp);
|
||||
void __fastcall threadexit(void);
|
||||
|
||||
#endif /* _CHCORE_H_ */
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#ifndef _CHTYPES_H_
|
||||
#define _CHTYPES_H_
|
||||
|
||||
/*
|
||||
* Generic types often dependant on the compiler.
|
||||
*/
|
||||
#define BOOL char
|
||||
#define BYTE8 unsigned char
|
||||
#define WORD16 short
|
||||
#define UWORD16 unsigned short
|
||||
#define LONG32 int
|
||||
#define ULONG32 unsigned int
|
||||
#define PTR_EQ int
|
||||
|
||||
typedef BYTE8 t_tmode;
|
||||
typedef BYTE8 t_tstate;
|
||||
typedef WORD16 t_prio;
|
||||
typedef PTR_EQ t_msg;
|
||||
typedef LONG32 t_eventid;
|
||||
typedef ULONG32 t_eventmask;
|
||||
typedef ULONG32 t_time;
|
||||
typedef LONG32 t_semcnt;
|
||||
typedef ULONG32 t_size;
|
||||
|
||||
#define MINPRIO 0x8000
|
||||
#define MAXPRIO 0x7fff
|
||||
|
||||
#define MINDELTA 0
|
||||
#define MAXDELTA 0xffff
|
||||
|
||||
#define INLINE __inline
|
||||
|
||||
#endif /* _CHTYPES_H_ */
|
|
@ -0,0 +1,305 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ch.h>
|
||||
|
||||
static ULONG32 wdguard;
|
||||
static BYTE8 wdarea[UserStackSize(2048)];
|
||||
|
||||
static ULONG32 iguard;
|
||||
static BYTE8 iarea[UserStackSize(2048)];
|
||||
|
||||
static ULONG32 cdguard;
|
||||
static BYTE8 cdarea[UserStackSize(2048)];
|
||||
static Thread *cdtp;
|
||||
|
||||
static t_msg WatchdogThread(void *arg);
|
||||
static t_msg ConsoleThread(void *arg);
|
||||
static t_msg InitThread(void *arg);
|
||||
|
||||
void InitCore(void);
|
||||
extern FullDuplexDriver COM1, COM2;
|
||||
|
||||
#define cprint(msg) chMsgSend(cdtp, (t_msg)msg)
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* Simulator main, start here your threads, examples inside. *
|
||||
*------------------------------------------------------------------------*/
|
||||
int main(void) {
|
||||
|
||||
InitCore();
|
||||
|
||||
// Startup ChibiOS/RT.
|
||||
chSysInit();
|
||||
chThdCreate(NORMALPRIO + 2, 0, wdarea, sizeof(wdarea), WatchdogThread, NULL);
|
||||
cdtp = chThdCreate(NORMALPRIO + 1, 0, cdarea, sizeof(cdarea), ConsoleThread, NULL);
|
||||
chThdCreate(NORMALPRIO, 0, iarea, sizeof(iarea), InitThread, NULL);
|
||||
chSysPause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Watchdog thread, it checks magic values located under the various stack
|
||||
* areas. The system is halted if something is wrong.
|
||||
*/
|
||||
static t_msg WatchdogThread(void *arg) {
|
||||
wdguard = 0xA51F2E3D;
|
||||
iguard = 0xA51F2E3D;
|
||||
cdguard = 0xA51F2E3D;
|
||||
while (TRUE) {
|
||||
|
||||
if ((wdguard != 0xA51F2E3D) ||
|
||||
(iguard != 0xA51F2E3D) ||
|
||||
(cdguard != 0xA51F2E3D)) {
|
||||
printf("Halted by watchdog");
|
||||
chSysHalt();
|
||||
}
|
||||
chThdSleep(5);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Console print server done using synchronous messages. This makes the access
|
||||
* to the C printf() thread safe and the print operation atomic among threads.
|
||||
* In this example the message is the zero termitated string itself.
|
||||
*/
|
||||
static t_msg ConsoleThread(void *arg) {
|
||||
|
||||
while (!chThdShouldTerminate()) {
|
||||
printf((char *)chMsgWait());
|
||||
chMsgRelease(RDY_OK);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void PrintLineFDD(FullDuplexDriver *sd, char *msg) {
|
||||
|
||||
while (*msg)
|
||||
chFDDPut(sd, *msg++);
|
||||
}
|
||||
|
||||
static BOOL GetLineFDD(FullDuplexDriver *sd, char *line, int size) {
|
||||
char *p = line;
|
||||
|
||||
while (TRUE) {
|
||||
short c = chIQGet(&sd->sd_iqueue);
|
||||
if (c < 0)
|
||||
return TRUE;
|
||||
if (c == 4) {
|
||||
PrintLineFDD(sd, "^D\r\n");
|
||||
return TRUE;
|
||||
}
|
||||
if (c == 8) {
|
||||
if (p != line) {
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
chFDDPut(sd, 0x20);
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
p--;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (c == '\r') {
|
||||
PrintLineFDD(sd, "\r\n");
|
||||
*p = 0;
|
||||
return FALSE;
|
||||
}
|
||||
if (c < 0x20)
|
||||
continue;
|
||||
if (p < line + size - 1) {
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
*p++ = (BYTE8)c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Example thread, not much to see here. It simulates the CTRL-C but there
|
||||
* are no real signals involved.
|
||||
*/
|
||||
static t_msg HelloWorldThread(void *arg) {
|
||||
int i;
|
||||
short c;
|
||||
FullDuplexDriver *sd = (FullDuplexDriver *)arg;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
|
||||
PrintLineFDD(sd, "Hello World\r\n");
|
||||
c = chFDDGetTimeout(sd, 33);
|
||||
switch (c) {
|
||||
case -1:
|
||||
continue;
|
||||
case -2:
|
||||
return 1;
|
||||
case 3:
|
||||
PrintLineFDD(sd, "^C\r\n");
|
||||
return 0;
|
||||
default:
|
||||
chThdSleep(33);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BOOL checkend(FullDuplexDriver *sd) {
|
||||
|
||||
char * lp = strtok(NULL, " \009"); /* It is not thread safe but this is a demo.*/
|
||||
if (lp) {
|
||||
PrintLineFDD(sd, lp);
|
||||
PrintLineFDD(sd, " ?\r\n");
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple command shell thread, the argument is the serial line for the
|
||||
* standard input and output. It recognizes few simple commands.
|
||||
*/
|
||||
static t_msg ShellThread(void *arg) {
|
||||
FullDuplexDriver *sd = (FullDuplexDriver *)arg;
|
||||
char *lp, line[64];
|
||||
Thread *tp;
|
||||
BYTE8 tarea[UserStackSize(1024)];
|
||||
|
||||
chIQReset(&sd->sd_iqueue);
|
||||
chOQReset(&sd->sd_oqueue);
|
||||
PrintLineFDD(sd, "ChibiOS/RT Command Shell\r\n\n");
|
||||
while (TRUE) {
|
||||
PrintLineFDD(sd, "ch> ");
|
||||
if (GetLineFDD(sd, line, sizeof(line))) {
|
||||
PrintLineFDD(sd, "\nlogout");
|
||||
break;
|
||||
}
|
||||
lp = strtok(line, " \009"); // Note: not thread safe but it is just a demo.
|
||||
if (lp) {
|
||||
if ((stricmp(lp, "help") == 0) ||
|
||||
(stricmp(lp, "h") == 0) ||
|
||||
(stricmp(lp, "?") == 0)) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
PrintLineFDD(sd, "Commands:\r\n");
|
||||
PrintLineFDD(sd, " help,h,? - This help\r\n");
|
||||
PrintLineFDD(sd, " exit - Logout from ChibiOS/RT\r\n");
|
||||
PrintLineFDD(sd, " time - Prints the system timer value\r\n");
|
||||
PrintLineFDD(sd, " hello - Runs the Hello World demo thread\r\n");
|
||||
}
|
||||
else if (stricmp(lp, "exit") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
PrintLineFDD(sd, "\nlogout");
|
||||
break;
|
||||
}
|
||||
else if (stricmp(lp, "time") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
sprintf(line, "Time: %d\r\n", chSysGetTime());
|
||||
PrintLineFDD(sd, line);
|
||||
}
|
||||
else if (stricmp(lp, "hello") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
tp = chThdCreate(NORMALPRIO, 0, tarea, sizeof(tarea),
|
||||
HelloWorldThread, sd);
|
||||
if (chThdWait(tp))
|
||||
break; // Lost connection while executing the hello thread.
|
||||
}
|
||||
else {
|
||||
PrintLineFDD(sd, lp);
|
||||
PrintLineFDD(sd, " ?\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BYTE8 s1area[UserStackSize(4096)];
|
||||
static Thread *s1;
|
||||
EventListener s1tel;
|
||||
|
||||
static void COM1Handler(t_eventid id) {
|
||||
t_dflags flags;
|
||||
|
||||
if (s1 && chThdTerminated(s1)) {
|
||||
s1 = NULL;
|
||||
cprint("Init: disconnection on COM1\n");
|
||||
}
|
||||
flags = chFDDGetAndClearFlags(&COM1);
|
||||
if ((flags & SD_CONNECTED) && (s1 == NULL)) {
|
||||
cprint("Init: connection on COM1\n");
|
||||
s1 = chThdCreate(NORMALPRIO, P_SUSPENDED, s1area, sizeof(s1area),
|
||||
ShellThread, &COM1);
|
||||
chEvtRegister(chThdGetExitEventSource(s1), &s1tel, 0);
|
||||
chThdResume(s1);
|
||||
}
|
||||
if ((flags & SD_DISCONNECTED) && (s1 != NULL))
|
||||
chIQReset(&COM1.sd_iqueue);
|
||||
}
|
||||
|
||||
static BYTE8 s2area[UserStackSize(4096)];
|
||||
static Thread *s2;
|
||||
EventListener s2tel;
|
||||
|
||||
static void COM2Handler(t_eventid id) {
|
||||
t_dflags flags;
|
||||
|
||||
if (s2 && chThdTerminated(s2)) {
|
||||
s2 = NULL;
|
||||
cprint("Init: disconnection on COM2\n");
|
||||
}
|
||||
flags = chFDDGetAndClearFlags(&COM2);
|
||||
if ((flags & SD_CONNECTED) && (s2 == NULL)) {
|
||||
cprint("Init: connection on COM2\n");
|
||||
s2 = chThdCreate(NORMALPRIO, P_SUSPENDED, s2area, sizeof(s1area),
|
||||
ShellThread, &COM2);
|
||||
chEvtRegister(chThdGetExitEventSource(s2), &s2tel, 1);
|
||||
chThdResume(s2);
|
||||
}
|
||||
if ((flags & SD_DISCONNECTED) && (s2 != NULL))
|
||||
chIQReset(&COM2.sd_iqueue);
|
||||
}
|
||||
|
||||
static t_evhandler fhandlers[2] = {
|
||||
COM1Handler,
|
||||
COM2Handler
|
||||
};
|
||||
|
||||
/*
|
||||
* Init-like thread, it starts the shells and handles their termination.
|
||||
* It is a good example of events usage.
|
||||
*/
|
||||
static t_msg InitThread(void *arg) {
|
||||
EventListener c1fel, c2fel;
|
||||
|
||||
cprint("Console service started on COM1, COM2\n");
|
||||
cprint(" - Listening for connections on COM1\n");
|
||||
chFDDGetAndClearFlags(&COM1);
|
||||
chEvtRegister(&COM1.sd_sevent, &c1fel, 0);
|
||||
cprint(" - Listening for connections on COM2\n");
|
||||
chFDDGetAndClearFlags(&COM2);
|
||||
chEvtRegister(&COM2.sd_sevent, &c2fel, 1);
|
||||
while (!chThdShouldTerminate())
|
||||
chEvtWait(ALL_EVENTS, fhandlers);
|
||||
chEvtUnregister(&COM2.sd_sevent, &c2fel); // Never invoked but this is an example...
|
||||
chEvtUnregister(&COM1.sd_sevent, &c1fel); // Never invoked but this is an example...
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Configuration file for MingGW32 demo project.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup Config
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _CHCONF_H_
|
||||
#define _CHCONF_H_
|
||||
|
||||
/*
|
||||
* NOTE: this is just documentation for doxigen, the real configuration file
|
||||
* is the one into the project directories.
|
||||
*/
|
||||
|
||||
/** Configuration option: if specified then time efficient rather than space
|
||||
* efficient code is used when two possible implementations exist, note
|
||||
* that this is not related to the compiler optimization options.*/
|
||||
#define CH_OPTIMIZE_SPEED
|
||||
|
||||
/** Configuration option: if specified then the Virtual Timers subsystem is
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_VIRTUAL_TIMERS
|
||||
|
||||
/** Configuration option: if specified then the System Timer subsystem is
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_SYSTEMTIME
|
||||
|
||||
/** Configuration option: if specified then the \p chThdSleep() function is
|
||||
* included in the kernel.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_SLEEP
|
||||
|
||||
/** Configuration option: if specified then the \p chThdResume()
|
||||
* function is included in the kernel.*/
|
||||
#define CH_USE_RESUME
|
||||
|
||||
/** Configuration option: if specified then the \p chThdTerminate()
|
||||
* and \p chThdShouldTerminate() functions are included in the kernel.*/
|
||||
#define CH_USE_TERMINATE
|
||||
|
||||
/** Configuration option: if specified then the \p chThdWait() function
|
||||
* is included in the kernel.*/
|
||||
#define CH_USE_WAITEXIT
|
||||
|
||||
/** Configuration option: if specified then the Semaphores APIs are included
|
||||
* in the kernel.*/
|
||||
#define CH_USE_SEMAPHORES
|
||||
|
||||
/** Configuration option: if specified then the Semaphores with timeout APIs
|
||||
* are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_SEMAPHORES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the Semaphores APIs with priority
|
||||
* shift are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES.*/
|
||||
#define CH_USE_RT_SEMAPHORES
|
||||
|
||||
/** Configuration option: if specified then the Events APIs are included in
|
||||
* the kernel.*/
|
||||
#define CH_USE_EVENTS
|
||||
|
||||
/** Configuration option: if specified then the \p chEvtWaitTimeout()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_EVENTS.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_EVENTS_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the Synchronous Messages APIs are
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_MESSAGES
|
||||
|
||||
/** Configuration option: if specified then the \p chMsgSendTimeout()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_MESSAGES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the \p chMsgSendWithEvent()
|
||||
* function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_VIRTUAL_TIMERS.*/
|
||||
#define CH_USE_MESSAGES_EVENT
|
||||
|
||||
/** Configuration option: if specified then the
|
||||
* \p chThdGetExitEventSource() function is included in the kernel.
|
||||
* @note requires \p CH_USE_MESSAGES.
|
||||
* @note requires \p CH_USE_EVENTS.*/
|
||||
#define CH_USE_EXIT_EVENT
|
||||
|
||||
/** Configuration option: if specified then the I/O queues APIs are included
|
||||
* in the kernel.*/
|
||||
#define CH_USE_QUEUES
|
||||
|
||||
/** Configuration option: if specified then the halfduplex queue APIs are
|
||||
* included in the kernel.*/
|
||||
#define CH_USE_QUEUES_HALFDUPLEX
|
||||
|
||||
/** Configuration option: if specified then the I/O queues with timeout
|
||||
* APIs are included in the kernel.
|
||||
* @note requires \p CH_USE_SEMAPHORES_TIMEOUT.*/
|
||||
#define CH_USE_QUEUES_TIMEOUT
|
||||
|
||||
/** Configuration option: if specified then the full duplex serial driver APIs
|
||||
* are included in the kernel.*/
|
||||
#define CH_USE_SERIAL_FULLDUPLEX
|
||||
|
||||
/** Configuration option: if specified then the half duplex serial driver APIs
|
||||
* are included in the kernel.*/
|
||||
#define CH_USE_SERIAL_HALFDUPLEX
|
||||
|
||||
/** Configuration option: Frequency of the system timer that drives the system
|
||||
* ticks. This also defines the system time unit.*/
|
||||
#define CH_FREQUENCY 100
|
||||
|
||||
/** Configuration option: This constant is the number of ticks allowed for the
|
||||
* threads before preemption occurs.*/
|
||||
#define CH_TIME_QUANTUM 10
|
||||
|
||||
/** Configuration option: Defines a CPU register to be used as storage for the
|
||||
* global \p currp variable. Caching this variable in a register can greatly
|
||||
* improve both space and time efficiency of the generated code. Another side
|
||||
* effect is that one less register has to be saved during the context switch
|
||||
* resulting in lower RAM usage and faster code.
|
||||
* @note This option is only useable with the GCC compiler and is only useful
|
||||
* on processors with many registers like ARM cores.
|
||||
* @note If this option is enabled then ALL the libraries linked to the
|
||||
* ChibiOS/RT code <b>must</b> be recompiled with the GCC option \p
|
||||
* -ffixed-\<reg\>.
|
||||
*/
|
||||
//#define CH_CURRP_REGISTER_CACHE "reg"
|
||||
|
||||
#endif /* _CHCONF_H_ */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Core file for MingGW32 demo project.
|
||||
*/
|
||||
|
||||
#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.
|
||||
*/
|
||||
void InitCore(void) {
|
||||
WSADATA wsaData;
|
||||
|
||||
// Initialization.
|
||||
if (WSAStartup(2, &wsaData) != 0) {
|
||||
printf("Unable to locate a winsock DLL\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Win32 ChobiOS/RT simulator\n\n");
|
||||
printf("Thread structure %d bytes\n", sizeof(Thread));
|
||||
if (!QueryPerformanceFrequency(&slice)) {
|
||||
printf("QueryPerformanceFrequency() error");
|
||||
exit(1);
|
||||
}
|
||||
printf("Core Frequency %d Hz\n", (int)slice.LowPart);
|
||||
slice.QuadPart /= CH_FREQUENCY;
|
||||
QueryPerformanceCounter(&nextcnt);
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
|
||||
InitSimCom1();
|
||||
InitSimCom2();
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt simulation.
|
||||
*/
|
||||
static void ChkIntSources(void) {
|
||||
LARGE_INTEGER n;
|
||||
|
||||
if (Com1InInterruptSimCom() || Com2InInterruptSimCom() ||
|
||||
Com1OutInterruptSimCom() || Com2OutInterruptSimCom() ||
|
||||
Com1ConnInterruptSimCom() || Com2ConnInterruptSimCom()) {
|
||||
chSchRescheduleI();
|
||||
return;
|
||||
}
|
||||
|
||||
// Interrupt Timer simulation (10ms interval).
|
||||
QueryPerformanceCounter(&n);
|
||||
if (n.QuadPart > nextcnt.QuadPart) {
|
||||
nextcnt.QuadPart += slice.QuadPart;
|
||||
chSchTimerHandlerI();
|
||||
if (chSchRescRequiredI())
|
||||
chSchDoRescheduleI();
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((fastcall)) void chSysPause(void) {
|
||||
|
||||
while (TRUE) {
|
||||
|
||||
ChkIntSources();
|
||||
Sleep(0);
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((fastcall)) void chSysHalt(void) {
|
||||
|
||||
exit(2);
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Core file for MingGW32 demo project.
|
||||
*/
|
||||
|
||||
#ifndef _CHCORE_H_
|
||||
#define _CHCORE_H_
|
||||
|
||||
typedef void *regx86;
|
||||
|
||||
/*
|
||||
* Stack saved context.
|
||||
*/
|
||||
struct stackregs {
|
||||
regx86 ebx;
|
||||
regx86 edi;
|
||||
regx86 esi;
|
||||
regx86 ebp;
|
||||
regx86 eip;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct stackregs *esp;
|
||||
} Context;
|
||||
|
||||
#define APUSH(p, a) (p) -= sizeof(void *), *(void **)(p) = (void*)(a)
|
||||
|
||||
#define SETUP_CONTEXT(workspace, wsize, pf, arg) \
|
||||
{ \
|
||||
BYTE8 *esp = (BYTE8 *)workspace + wsize; \
|
||||
APUSH(esp, arg); \
|
||||
APUSH(esp, threadstart); \
|
||||
esp -= sizeof(struct stackregs); \
|
||||
((struct stackregs *)esp)->eip = pf; \
|
||||
((struct stackregs *)esp)->ebx = 0; \
|
||||
((struct stackregs *)esp)->edi = 0; \
|
||||
((struct stackregs *)esp)->esi = 0; \
|
||||
((struct stackregs *)esp)->ebp = 0; \
|
||||
tp->p_ctx.esp = (struct stackregs *)esp; \
|
||||
}
|
||||
|
||||
#define chSysLock()
|
||||
|
||||
#define chSysUnlock()
|
||||
|
||||
#define INT_REQUIRED_STACK 0x0
|
||||
|
||||
#define UserStackSize(n) (sizeof(Thread) + sizeof(PTR_EQ) + sizeof(PTR_EQ) + \
|
||||
sizeof(struct stackregs) + (n) + (INT_REQUIRED_STACK))
|
||||
|
||||
__attribute__((fastcall)) void chSysHalt(void);
|
||||
__attribute__((fastcall)) void chSysPause(void);
|
||||
__attribute__((fastcall)) void chSysSwitchI(Context *oldp, Context *newp);
|
||||
__attribute__((fastcall)) void threadstart(void);
|
||||
|
||||
#endif /* _CHCORE_H_ */
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
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,(%ecx)
|
||||
# Switch in
|
||||
movl (%edx),%esp
|
||||
pop %ebx
|
||||
pop %edi
|
||||
pop %esi
|
||||
pop %ebp
|
||||
ret
|
||||
|
||||
.p2align 4,,15
|
||||
.globl @threadstart@0
|
||||
@threadstart@0:
|
||||
push %ecx
|
||||
call _chThdExit
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#ifndef _CHTYPES_H_
|
||||
#define _CHTYPES_H_
|
||||
|
||||
/*
|
||||
* Generic types often dependant on the compiler.
|
||||
*/
|
||||
#define BOOL char
|
||||
#define BYTE8 unsigned char
|
||||
#define WORD16 short
|
||||
#define UWORD16 unsigned short
|
||||
#define LONG32 int
|
||||
#define ULONG32 unsigned int
|
||||
#define PTR_EQ int
|
||||
|
||||
typedef BYTE8 t_tmode;
|
||||
typedef BYTE8 t_tstate;
|
||||
typedef WORD16 t_prio;
|
||||
typedef PTR_EQ t_msg;
|
||||
typedef LONG32 t_eventid;
|
||||
typedef ULONG32 t_eventmask;
|
||||
typedef ULONG32 t_time;
|
||||
typedef LONG32 t_semcnt;
|
||||
typedef ULONG32 t_size;
|
||||
|
||||
#define MINPRIO 0x8000
|
||||
#define MAXPRIO 0x7fff
|
||||
|
||||
#define MINDELTA 0
|
||||
#define MAXDELTA 0xffff
|
||||
|
||||
#define INLINE inline
|
||||
|
||||
#endif /* _CHTYPES_H_ */
|
|
@ -0,0 +1,305 @@
|
|||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ch.h>
|
||||
|
||||
static ULONG32 wdguard;
|
||||
static BYTE8 wdarea[UserStackSize(2048)];
|
||||
|
||||
static ULONG32 iguard;
|
||||
static BYTE8 iarea[UserStackSize(2048)];
|
||||
|
||||
static ULONG32 cdguard;
|
||||
static BYTE8 cdarea[UserStackSize(2048)];
|
||||
static Thread *cdtp;
|
||||
|
||||
static t_msg WatchdogThread(void *arg);
|
||||
static t_msg ConsoleThread(void *arg);
|
||||
static t_msg InitThread(void *arg);
|
||||
|
||||
void InitCore(void);
|
||||
extern FullDuplexDriver COM1, COM2;
|
||||
|
||||
#define cprint(msg) chMsgSend(cdtp, (t_msg)msg)
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* Simulator main, start here your threads, examples inside. *
|
||||
*------------------------------------------------------------------------*/
|
||||
int main(void) {
|
||||
|
||||
InitCore();
|
||||
|
||||
// Startup ChibiOS/RT.
|
||||
chSysInit();
|
||||
chThdCreate(NORMALPRIO + 2, 0, wdarea, sizeof(wdarea), WatchdogThread, NULL);
|
||||
cdtp = chThdCreate(NORMALPRIO + 1, 0, cdarea, sizeof(cdarea), ConsoleThread, NULL);
|
||||
chThdCreate(NORMALPRIO, 0, iarea, sizeof(iarea), InitThread, NULL);
|
||||
chSysPause();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Watchdog thread, it checks magic values located under the various stack
|
||||
* areas. The system is halted if something is wrong.
|
||||
*/
|
||||
static t_msg WatchdogThread(void *arg) {
|
||||
wdguard = 0xA51F2E3D;
|
||||
iguard = 0xA51F2E3D;
|
||||
cdguard = 0xA51F2E3D;
|
||||
while (TRUE) {
|
||||
|
||||
if ((wdguard != 0xA51F2E3D) ||
|
||||
(iguard != 0xA51F2E3D) ||
|
||||
(cdguard != 0xA51F2E3D)) {
|
||||
printf("Halted by watchdog");
|
||||
chSysHalt();
|
||||
}
|
||||
chThdSleep(5);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Console print server done using synchronous messages. This makes the access
|
||||
* to the C printf() thread safe and the print operation atomic among threads.
|
||||
* In this example the message is the zero termitated string itself.
|
||||
*/
|
||||
static t_msg ConsoleThread(void *arg) {
|
||||
|
||||
while (!chThdShouldTerminate()) {
|
||||
printf((char *)chMsgWait());
|
||||
chMsgRelease(RDY_OK);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void PrintLineFDD(FullDuplexDriver *sd, char *msg) {
|
||||
|
||||
while (*msg)
|
||||
chFDDPut(sd, *msg++);
|
||||
}
|
||||
|
||||
static BOOL GetLineFDD(FullDuplexDriver *sd, char *line, int size) {
|
||||
char *p = line;
|
||||
|
||||
while (TRUE) {
|
||||
short c = chIQGet(&sd->sd_iqueue);
|
||||
if (c < 0)
|
||||
return TRUE;
|
||||
if (c == 4) {
|
||||
PrintLineFDD(sd, "^D\r\n");
|
||||
return TRUE;
|
||||
}
|
||||
if (c == 8) {
|
||||
if (p != line) {
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
chFDDPut(sd, 0x20);
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
p--;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (c == '\r') {
|
||||
PrintLineFDD(sd, "\r\n");
|
||||
*p = 0;
|
||||
return FALSE;
|
||||
}
|
||||
if (c < 0x20)
|
||||
continue;
|
||||
if (p < line + size - 1) {
|
||||
chFDDPut(sd, (BYTE8)c);
|
||||
*p++ = (BYTE8)c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Example thread, not much to see here. It simulates the CTRL-C but there
|
||||
* are no real signals involved.
|
||||
*/
|
||||
static t_msg HelloWorldThread(void *arg) {
|
||||
int i;
|
||||
short c;
|
||||
FullDuplexDriver *sd = (FullDuplexDriver *)arg;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
|
||||
PrintLineFDD(sd, "Hello World\r\n");
|
||||
c = chFDDGetTimeout(sd, 33);
|
||||
switch (c) {
|
||||
case -1:
|
||||
continue;
|
||||
case -2:
|
||||
return 1;
|
||||
case 3:
|
||||
PrintLineFDD(sd, "^C\r\n");
|
||||
return 0;
|
||||
default:
|
||||
chThdSleep(33);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BOOL checkend(FullDuplexDriver *sd) {
|
||||
|
||||
char * lp = strtok(NULL, " \009"); /* It is not thread safe but this is a demo.*/
|
||||
if (lp) {
|
||||
PrintLineFDD(sd, lp);
|
||||
PrintLineFDD(sd, " ?\r\n");
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple command shell thread, the argument is the serial line for the
|
||||
* standard input and output. It recognizes few simple commands.
|
||||
*/
|
||||
static t_msg ShellThread(void *arg) {
|
||||
FullDuplexDriver *sd = (FullDuplexDriver *)arg;
|
||||
char *lp, line[64];
|
||||
Thread *tp;
|
||||
BYTE8 tarea[UserStackSize(1024)];
|
||||
|
||||
chIQReset(&sd->sd_iqueue);
|
||||
chOQReset(&sd->sd_oqueue);
|
||||
PrintLineFDD(sd, "ChibiOS/RT Command Shell\r\n\n");
|
||||
while (TRUE) {
|
||||
PrintLineFDD(sd, "ch> ");
|
||||
if (GetLineFDD(sd, line, sizeof(line))) {
|
||||
PrintLineFDD(sd, "\nlogout");
|
||||
break;
|
||||
}
|
||||
lp = strtok(line, " \009"); // Note: not thread safe but it is just a demo.
|
||||
if (lp) {
|
||||
if ((stricmp(lp, "help") == 0) ||
|
||||
(stricmp(lp, "h") == 0) ||
|
||||
(stricmp(lp, "?") == 0)) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
PrintLineFDD(sd, "Commands:\r\n");
|
||||
PrintLineFDD(sd, " help,h,? - This help\r\n");
|
||||
PrintLineFDD(sd, " exit - Logout from ChibiOS/RT\r\n");
|
||||
PrintLineFDD(sd, " time - Prints the system timer value\r\n");
|
||||
PrintLineFDD(sd, " hello - Runs the Hello World demo thread\r\n");
|
||||
}
|
||||
else if (stricmp(lp, "exit") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
PrintLineFDD(sd, "\nlogout");
|
||||
break;
|
||||
}
|
||||
else if (stricmp(lp, "time") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
sprintf(line, "Time: %d\r\n", chSysGetTime());
|
||||
PrintLineFDD(sd, line);
|
||||
}
|
||||
else if (stricmp(lp, "hello") == 0) {
|
||||
if (checkend(sd))
|
||||
continue;
|
||||
tp = chThdCreate(NORMALPRIO, 0, tarea, sizeof(tarea),
|
||||
HelloWorldThread, sd);
|
||||
if (chThdWait(tp))
|
||||
break; // Lost connection while executing the hello thread.
|
||||
}
|
||||
else {
|
||||
PrintLineFDD(sd, lp);
|
||||
PrintLineFDD(sd, " ?\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static BYTE8 s1area[UserStackSize(4096)];
|
||||
static Thread *s1;
|
||||
EventListener s1tel;
|
||||
|
||||
static void COM1Handler(t_eventid id) {
|
||||
t_dflags flags;
|
||||
|
||||
if (s1 && chThdTerminated(s1)) {
|
||||
s1 = NULL;
|
||||
cprint("Init: disconnection on COM1\n");
|
||||
}
|
||||
flags = chFDDGetAndClearFlags(&COM1);
|
||||
if ((flags & SD_CONNECTED) && (s1 == NULL)) {
|
||||
cprint("Init: connection on COM1\n");
|
||||
s1 = chThdCreate(NORMALPRIO, P_SUSPENDED, s1area, sizeof(s1area),
|
||||
ShellThread, &COM1);
|
||||
chEvtRegister(chThdGetExitEventSource(s1), &s1tel, 0);
|
||||
chThdResume(s1);
|
||||
}
|
||||
if ((flags & SD_DISCONNECTED) && (s1 != NULL))
|
||||
chIQReset(&COM1.sd_iqueue);
|
||||
}
|
||||
|
||||
static BYTE8 s2area[UserStackSize(4096)];
|
||||
static Thread *s2;
|
||||
EventListener s2tel;
|
||||
|
||||
static void COM2Handler(t_eventid id) {
|
||||
t_dflags flags;
|
||||
|
||||
if (s2 && chThdTerminated(s2)) {
|
||||
s2 = NULL;
|
||||
cprint("Init: disconnection on COM2\n");
|
||||
}
|
||||
flags = chFDDGetAndClearFlags(&COM2);
|
||||
if ((flags & SD_CONNECTED) && (s2 == NULL)) {
|
||||
cprint("Init: connection on COM2\n");
|
||||
s2 = chThdCreate(NORMALPRIO, P_SUSPENDED, s2area, sizeof(s1area),
|
||||
ShellThread, &COM2);
|
||||
chEvtRegister(chThdGetExitEventSource(s2), &s2tel, 1);
|
||||
chThdResume(s2);
|
||||
}
|
||||
if ((flags & SD_DISCONNECTED) && (s2 != NULL))
|
||||
chIQReset(&COM2.sd_iqueue);
|
||||
}
|
||||
|
||||
static t_evhandler fhandlers[2] = {
|
||||
COM1Handler,
|
||||
COM2Handler
|
||||
};
|
||||
|
||||
/*
|
||||
* Init-like thread, it starts the shells and handles their termination.
|
||||
* It is a good example of events usage.
|
||||
*/
|
||||
static t_msg InitThread(void *arg) {
|
||||
EventListener c1fel, c2fel;
|
||||
|
||||
cprint("Console service started on COM1, COM2\n");
|
||||
cprint(" - Listening for connections on COM1\n");
|
||||
chFDDGetAndClearFlags(&COM1);
|
||||
chEvtRegister(&COM1.sd_sevent, &c1fel, 0);
|
||||
cprint(" - Listening for connections on COM2\n");
|
||||
chFDDGetAndClearFlags(&COM2);
|
||||
chEvtRegister(&COM2.sd_sevent, &c2fel, 1);
|
||||
while (!chThdShouldTerminate())
|
||||
chEvtWait(ALL_EVENTS, fhandlers);
|
||||
chEvtUnregister(&COM2.sd_sevent, &c2fel); // Never invoked but this is an example...
|
||||
chEvtUnregister(&COM1.sd_sevent, &c1fel); // Never invoked but this is an example...
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
#
|
||||
# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!!
|
||||
#
|
||||
##############################################################################################
|
||||
#
|
||||
# On command line:
|
||||
#
|
||||
# make all = Create project
|
||||
#
|
||||
# make clean = Clean project files.
|
||||
#
|
||||
# To rebuild project do "make clean" and "make all".
|
||||
#
|
||||
|
||||
##############################################################################################
|
||||
# Start of default section
|
||||
#
|
||||
|
||||
TRGT = mingw32-
|
||||
CC = $(TRGT)gcc
|
||||
AS = $(TRGT)gcc -x assembler-with-cpp
|
||||
|
||||
# List all default C defines here, like -D_DEBUG=1
|
||||
DDEFS =
|
||||
|
||||
# List all default ASM defines here, like -D_DEBUG=1
|
||||
DADEFS =
|
||||
|
||||
# List all default directories to look for include files here
|
||||
DINCDIR =
|
||||
|
||||
# List the default directory to look for the libraries here
|
||||
DLIBDIR =
|
||||
|
||||
# List all default libraries here
|
||||
DLIBS = -lws2_32
|
||||
|
||||
#
|
||||
# End of default section
|
||||
##############################################################################################
|
||||
|
||||
##############################################################################################
|
||||
# Start of user section
|
||||
#
|
||||
|
||||
# Define project name here
|
||||
PROJECT = ch
|
||||
|
||||
# Define linker script file here
|
||||
LDSCRIPT=
|
||||
|
||||
# List all user C define here, like -D_DEBUG=1
|
||||
UDEFS =
|
||||
|
||||
# Define ASM defines here
|
||||
UADEFS =
|
||||
|
||||
# List C source files here
|
||||
SRC = chcore.c demo.c \
|
||||
../../ports/win32/simcom.c \
|
||||
../../src/chinit.c ../../src/chdelta.c ../../src/chschd.c ../../src/chthreads.c \
|
||||
../../src/chsem.c ../../src/chevents.c ../../src/chmsg.c ../../src/chsleep.c \
|
||||
../../src/chqueues.c ../../src/chserial.c
|
||||
|
||||
# List ASM source files here
|
||||
ASRC = chcore2.s
|
||||
|
||||
# List all user directories here
|
||||
UINCDIR = ../../src/include
|
||||
|
||||
# List the user directory to look for the libraries here
|
||||
ULIBDIR =
|
||||
|
||||
# List all user libraries here
|
||||
ULIBS =
|
||||
|
||||
# Define optimisation level here
|
||||
OPT = -Os -fomit-frame-pointer -fno-strict-aliasing
|
||||
|
||||
#
|
||||
# End of user defines
|
||||
##############################################################################################
|
||||
|
||||
|
||||
INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
|
||||
LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
|
||||
DEFS = $(DDEFS) $(UDEFS)
|
||||
ADEFS = $(DADEFS) $(UADEFS)
|
||||
OBJS = $(ASRC:.s=.o) $(SRC:.c=.o)
|
||||
LIBS = $(DLIBS) $(ULIBS)
|
||||
|
||||
LDFLAGS = -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR)
|
||||
ASFLAGS = -Wa,-amhls=$(<:.s=.lst) $(ADEFS)
|
||||
CPFLAGS = $(OPT) -Wall -Wstrict-prototypes -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS)
|
||||
|
||||
# Generate dependency information
|
||||
CPFLAGS += -MD -MP -MF .dep/$(@F).d
|
||||
|
||||
#
|
||||
# makefile rules
|
||||
#
|
||||
|
||||
all: $(OBJS) $(PROJECT).exe
|
||||
|
||||
%o : %c
|
||||
$(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@
|
||||
|
||||
%o : %s
|
||||
$(AS) -c $(ASFLAGS) $< -o $@
|
||||
|
||||
%exe: $(OBJS)
|
||||
$(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@
|
||||
|
||||
clean:
|
||||
-rm -f $(OBJS)
|
||||
-rm -f $(PROJECT).exe
|
||||
-rm -f $(PROJECT).map
|
||||
-rm -f $(SRC:.c=.c.bak)
|
||||
-rm -f $(SRC:.c=.lst)
|
||||
-rm -f $(ASRC:.s=.s.bak)
|
||||
-rm -f $(ASRC:.s=.lst)
|
||||
-rm -fR .dep
|
||||
|
||||
#
|
||||
# Include the dependency files, should be the last of the makefile
|
||||
#
|
||||
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
|
||||
|
||||
# *** EOF ***
|
Loading…
Reference in New Issue