git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@213 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2008-03-04 10:33:38 +00:00
parent ec0a917ae1
commit 99ac65be2a
13 changed files with 40 additions and 1064 deletions

View File

@ -1,21 +0,0 @@
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

View File

@ -1,267 +0,0 @@
<?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\chdebug.c">
</File>
<File
RelativePath="..\..\src\chdelta.c">
</File>
<File
RelativePath="..\..\src\chevents.c">
</File>
<File
RelativePath="..\..\src\chinit.c">
</File>
<File
RelativePath="..\..\src\chlists.c">
</File>
<File
RelativePath="..\..\src\chmsg.c">
</File>
<File
RelativePath="..\..\src\chmtx.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\debug.h">
</File>
<File
RelativePath="..\..\src\include\delta.h">
</File>
<File
RelativePath="..\..\src\include\events.h">
</File>
<File
RelativePath="..\..\src\include\inline.h">
</File>
<File
RelativePath="..\..\src\include\lists.h">
</File>
<File
RelativePath="..\..\src\include\messages.h">
</File>
<File
RelativePath="..\..\src\include\mutexes.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>

View File

@ -1,174 +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/>.
*/
/*
* 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 chThdSuspend()
* function is included in the kernel.*/
#define CH_USE_SUSPEND
/** 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 atomic Signal+Wait
* APIs are included in the kernel.*/
#define CH_USE_SEMSW
/** 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 Mutexes APIs are included in
* the kernel.*/
#define CH_USE_MUTEXES
/** 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 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 enabled then the threads have an option to serve
* messages by priority instead of FIFO order.
* @note requires \p CH_USE_MESSAGES.*/
//#define CH_USE_MESSAGES_PRIORITY
/** 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 1000
/** Configuration option: This constant is the number of ticks allowed for the
* threads before preemption occurs.*/
#define CH_TIME_QUANTUM 20
/** 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"
/** Configuration option: Includes basic debug support to the kernel.
* @note the debug support is port-dependent, it may be not present on some
* targets. In that case stub functions will be included.
*/
//#define CH_USE_DEBUG
/** Debug option: Includes the threads context switch tracing feature.
*/
//#define CH_USE_TRACE
#endif /* _CHCONF_H_ */
/** @} */

View File

@ -1,115 +0,0 @@
#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 %u Hz\n", slice.LowPart);
slice.QuadPart /= CH_FREQUENCY;
QueryPerformanceCounter(&nextcnt);
nextcnt.QuadPart += slice.QuadPart;
InitSimCom1();
InitSimCom2();
}
/*
* 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();
}
}
t_msg _IdleThread(void *p) {
chThdSetPriority(IDLEPRIO);
while (TRUE) {
ChkIntSources();
Sleep(0);
}
}
__declspec(naked) void __fastcall chSysHalt(void) {
exit(2);
}
__declspec(naked) void __fastcall chSysSwitchI(Thread *otp, Thread *ntp) {
__asm {
// Switch out code
push ebp
push esi
push edi
push ebx
mov dword ptr 16[ecx],esp
// Switch in code
mov esp,16[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
}
}

View File

@ -1,82 +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/>.
*/
/*
* Core file for Visual Studio 7 demo project.
*/
#ifndef _CHCORE_H_
#define _CHCORE_H_
typedef void *regx86;
/*
* Stack saved context.
*/
struct intctx {
regx86 ebx;
regx86 edi;
regx86 esi;
regx86 ebp;
regx86 eip;
};
typedef struct {
struct intctx *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 intctx); \
((struct intctx *)esp)->eip = pf; \
((struct intctx *)esp)->ebx = 0; \
((struct intctx *)esp)->edi = 0; \
((struct intctx *)esp)->esi = 0; \
((struct intctx *)esp)->ebp = 0; \
tp->p_ctx.esp = (struct intctx *)esp; \
}
#define chSysLock()
#define chSysUnlock()
#define chSysPuts(msg) {}
#define chSysIRQEnterI()
#define chSysIRQExitI()
#define INT_REQUIRED_STACK 0
#define StackAlign(n) ((((n) - 1) | 3) + 1)
#define UserStackSize(n) StackAlign(sizeof(Thread) + \
sizeof(void *) * 2 + \
sizeof(struct intctx) + \
(n) + \
INT_REQUIRED_STACK)
#define WorkingArea(s, n) ULONG32 s[UserStackSize(n) >> 2];
#define IDLE_THREAD_STACK_SIZE 16384
t_msg _IdleThread(void *p);
void __fastcall chSysHalt(void);
void __fastcall chSysSwitchI(Thread *otp, Thread *ntp);
void __fastcall threadexit(void);
#endif /* _CHCORE_H_ */

View File

@ -1,47 +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/>.
*/
#ifndef _CHTYPES_H_
#define _CHTYPES_H_
/*
* Generic types often dependant on the compiler.
*/
#define BOOL char
#define BYTE8 unsigned char
#define SBYTE8 char
#define WORD16 short
#define UWORD16 unsigned short
#define LONG32 int
#define ULONG32 unsigned int
typedef BYTE8 t_tmode;
typedef BYTE8 t_tstate;
typedef UWORD16 t_tid;
typedef ULONG32 t_prio;
typedef LONG32 t_msg;
typedef LONG32 t_eventid;
typedef ULONG32 t_eventmask;
typedef ULONG32 t_time;
typedef LONG32 t_cnt;
typedef ULONG32 t_size;
#define INLINE __inline
#endif /* _CHTYPES_H_ */

View File

@ -1,292 +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/>.
*/
#include <string.h>
#include <stdio.h>
#include <ch.h>
static ULONG32 wdguard;
static WorkingArea(wdarea, 2048);
static ULONG32 cdguard;
static WorkingArea(cdarea, 2048);
static Thread *cdtp;
static t_msg WatchdogThread(void *arg);
static t_msg ConsoleThread(void *arg);
t_msg TestThread(void *p);
void InitCore(void);
extern FullDuplexDriver COM1, COM2;
#define cprint(msg) chMsgSend(cdtp, (t_msg)msg)
/*
* 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;
cdguard = 0xA51F2E3D;
while (TRUE) {
if ((wdguard != 0xA51F2E3D) ||
(cdguard != 0xA51F2E3D)) {
printf("Halted by watchdog");
chSysHalt();
}
chThdSleep(50);
}
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, 333);
switch (c) {
case -1:
continue;
case -2:
return 1;
case 3:
PrintLineFDD(sd, "^C\r\n");
return 0;
default:
chThdSleep(333);
}
}
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;
WorkingArea(tarea, 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 WorkingArea(s1area, 2048);
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 WorkingArea(s2area, 2048);
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
};
/*------------------------------------------------------------------------*
* Simulator main, start here your threads, examples inside. *
*------------------------------------------------------------------------*/
int main(void) {
EventListener c1fel, c2fel;
InitCore();
// Startup ChibiOS/RT.
chSysInit();
chThdCreate(NORMALPRIO + 2, 0, wdarea, sizeof(wdarea), WatchdogThread, NULL);
cdtp = chThdCreate(NORMALPRIO + 1, 0, cdarea, sizeof(cdarea), ConsoleThread, NULL);
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;
}

View File

@ -1,22 +0,0 @@
*****************************************************************************
** ChibiOS/RT port for x86 into a Win32 process **
*****************************************************************************
** TARGET **
The demo runs under any Windows version as an application program. The serial
I/O is simulated over TCP/IP sockets.
** The Demo **
The demo listens on the two serial ports, when a connection is detected a
thread is started that serves a small command shell.
The demo shows how create/terminate threads at runtime, how listen to events,
how ho work with serial ports, how use the messages.
You can develop your ChibiOS/RT application using this demo as a simulator
then you can recompile it for a different architecture.
See demo.c for details.
** Build Procedure **
The demo was built using the Visual Studio 7, any later version should work.

View File

@ -45,7 +45,7 @@ typedef struct {
#define SETUP_CONTEXT(workspace, wsize, pf, arg) \ #define SETUP_CONTEXT(workspace, wsize, pf, arg) \
{ \ { \
BYTE8 *esp = (BYTE8 *)workspace + wsize; \ uint8_t *esp = (uint8_t *)workspace + wsize; \
APUSH(esp, arg); \ APUSH(esp, arg); \
APUSH(esp, threadstart); \ APUSH(esp, threadstart); \
esp -= sizeof(struct intctx); \ esp -= sizeof(struct intctx); \
@ -70,7 +70,7 @@ typedef struct {
sizeof(struct intctx) + \ sizeof(struct intctx) + \
(n) + \ (n) + \
INT_REQUIRED_STACK) INT_REQUIRED_STACK)
#define WorkingArea(s, n) ULONG32 s[UserStackSize(n) >> 2]; #define WorkingArea(s, n) uint32_t s[UserStackSize(n) >> 2];
#define IDLE_THREAD_STACK_SIZE 16384 #define IDLE_THREAD_STACK_SIZE 16384
t_msg _IdleThread(void *p); t_msg _IdleThread(void *p);

View File

@ -20,27 +20,21 @@
#ifndef _CHTYPES_H_ #ifndef _CHTYPES_H_
#define _CHTYPES_H_ #define _CHTYPES_H_
/* #if !defined(_STDINT_H) && !defined(__STDINT_H_)
* Generic types often dependant on the compiler. #include <stdint.h>
*/ #endif
#define BOOL char
#define BYTE8 unsigned char
#define SBYTE8 char
#define WORD16 short
#define UWORD16 unsigned short
#define LONG32 int
#define ULONG32 unsigned int
typedef BYTE8 t_tmode; typedef int8_t t_bool;
typedef BYTE8 t_tstate; typedef uint8_t t_tmode;
typedef UWORD16 t_tid; typedef uint8_t t_tstate;
typedef ULONG32 t_prio; typedef uint16_t t_tid;
typedef LONG32 t_msg; typedef uint32_t t_prio;
typedef LONG32 t_eventid; typedef int32_t t_msg;
typedef ULONG32 t_eventmask; typedef int32_t t_eventid;
typedef ULONG32 t_time; typedef uint32_t t_eventmask;
typedef LONG32 t_cnt; typedef uint32_t t_time;
typedef ULONG32 t_size; typedef int32_t t_cnt;
typedef uint32_t t_size;
#define INLINE inline #define INLINE inline

View File

@ -22,10 +22,10 @@
#include <ch.h> #include <ch.h>
static ULONG32 wdguard; static uint32_t wdguard;
static WorkingArea(wdarea, 2048); static WorkingArea(wdarea, 2048);
static ULONG32 cdguard; static uint32_t cdguard;
static WorkingArea(cdarea, 2048); static WorkingArea(cdarea, 2048);
static Thread *cdtp; static Thread *cdtp;
@ -78,7 +78,7 @@ static void PrintLineFDD(FullDuplexDriver *sd, char *msg) {
chFDDPut(sd, *msg++); chFDDPut(sd, *msg++);
} }
static BOOL GetLineFDD(FullDuplexDriver *sd, char *line, int size) { static t_bool GetLineFDD(FullDuplexDriver *sd, char *line, int size) {
char *p = line; char *p = line;
while (TRUE) { while (TRUE) {
@ -91,9 +91,9 @@ static BOOL GetLineFDD(FullDuplexDriver *sd, char *line, int size) {
} }
if (c == 8) { if (c == 8) {
if (p != line) { if (p != line) {
chFDDPut(sd, (BYTE8)c); chFDDPut(sd, (uint8_t)c);
chFDDPut(sd, 0x20); chFDDPut(sd, 0x20);
chFDDPut(sd, (BYTE8)c); chFDDPut(sd, (uint8_t)c);
p--; p--;
} }
continue; continue;
@ -106,8 +106,8 @@ static BOOL GetLineFDD(FullDuplexDriver *sd, char *line, int size) {
if (c < 0x20) if (c < 0x20)
continue; continue;
if (p < line + size - 1) { if (p < line + size - 1) {
chFDDPut(sd, (BYTE8)c); chFDDPut(sd, (uint8_t)c);
*p++ = (BYTE8)c; *p++ = (uint8_t)c;
} }
} }
} }
@ -140,7 +140,7 @@ static t_msg HelloWorldThread(void *arg) {
return 0; return 0;
} }
static BOOL checkend(FullDuplexDriver *sd) { static t_bool checkend(FullDuplexDriver *sd) {
char * lp = strtok(NULL, " \009"); /* It is not thread safe but this is a demo.*/ char * lp = strtok(NULL, " \009"); /* It is not thread safe but this is a demo.*/
if (lp) { if (lp) {

View File

@ -35,8 +35,8 @@
struct simcom { struct simcom {
BYTE8 com_ib[1024]; uint8_t com_ib[1024];
BYTE8 com_ob[1024]; uint8_t com_ob[1024];
SOCKET com_listen; SOCKET com_listen;
SOCKET com_data; SOCKET com_data;
}; };
@ -108,7 +108,7 @@ void InitSimCom2(void) {
init("COM2", &COM2, &sc2, COM2PORT); init("COM2", &COM2, &sc2, COM2PORT);
} }
static BOOL connint(char *name, FullDuplexDriver *sd, struct simcom *sc) { static t_bool connint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
if (sc->com_data == INVALID_SOCKET) { if (sc->com_data == INVALID_SOCKET) {
struct sockaddr addr; struct sockaddr addr;
@ -134,21 +134,21 @@ abort:
exit(1); exit(1);
} }
BOOL Com1ConnInterruptSimCom(void) { t_bool Com1ConnInterruptSimCom(void) {
return connint("COM1", &COM1, &sc1); return connint("COM1", &COM1, &sc1);
} }
BOOL Com2ConnInterruptSimCom(void) { t_bool Com2ConnInterruptSimCom(void) {
return connint("COM2", &COM2, &sc2); return connint("COM2", &COM2, &sc2);
} }
static BOOL inint(char *name, FullDuplexDriver *sd, struct simcom *sc) { static t_bool inint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
if (sc->com_data != INVALID_SOCKET) { if (sc->com_data != INVALID_SOCKET) {
int i; int i;
BYTE8 data[32]; uint8_t data[32];
/* /*
* Input. * Input.
@ -174,21 +174,21 @@ static BOOL inint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
return FALSE; return FALSE;
} }
BOOL Com1InInterruptSimCom(void) { t_bool Com1InInterruptSimCom(void) {
return inint("COM1", &COM1, &sc1); return inint("COM1", &COM1, &sc1);
} }
BOOL Com2InInterruptSimCom(void) { t_bool Com2InInterruptSimCom(void) {
return inint("COM2", &COM2, &sc2); return inint("COM2", &COM2, &sc2);
} }
static BOOL outint(char *name, FullDuplexDriver *sd, struct simcom *sc) { static t_bool outint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
if (sc->com_data != INVALID_SOCKET) { if (sc->com_data != INVALID_SOCKET) {
int n; int n;
BYTE8 data[1]; uint8_t data[1];
/* /*
* Input. * Input.
@ -196,7 +196,7 @@ static BOOL outint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
n = chFDDRequestDataI(sd); n = chFDDRequestDataI(sd);
if (n < 0) if (n < 0)
return FALSE; return FALSE;
data[0] = (BYTE8)n; data[0] = (uint8_t)n;
n = send(sc->com_data, data, sizeof(data), 0); n = send(sc->com_data, data, sizeof(data), 0);
switch (n) { switch (n) {
case 0: case 0:
@ -216,12 +216,12 @@ static BOOL outint(char *name, FullDuplexDriver *sd, struct simcom *sc) {
return FALSE; return FALSE;
} }
BOOL Com1OutInterruptSimCom(void) { t_bool Com1OutInterruptSimCom(void) {
return outint("COM1", &COM1, &sc1); return outint("COM1", &COM1, &sc1);
} }
BOOL Com2OutInterruptSimCom(void) { t_bool Com2OutInterruptSimCom(void) {
return outint("COM2", &COM2, &sc2); return outint("COM2", &COM2, &sc2);
} }

View File

@ -68,6 +68,8 @@ AVR-AT90CANx-GCC - Port on AVR AT90CAN128, not complete yet, scheduled
etc are now replaced by the proper definitions provided by the compiler etc are now replaced by the proper definitions provided by the compiler
into stdint.h. This has an impact on some API prototypes but we can't into stdint.h. This has an impact on some API prototypes but we can't
help it. help it.
- MSVC demo dropped, it is still possible to use the MinGW demo as simulator
in Win32.
*** 0.5.5 *** *** 0.5.5 ***
- Added an AVRmega128 port. The previous AT90CANx port is still present but - Added an AVRmega128 port. The previous AT90CANx port is still present but