158 lines
4.3 KiB
C
158 lines
4.3 KiB
C
#ifndef _CONFIG_H
|
|
#define _CONFIG_H
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#if defined(__TINYC__)
|
|
#pragma pack(1)
|
|
#endif
|
|
|
|
#define DEBUG 1
|
|
#define PROFILE 1
|
|
|
|
#define HAS_TYPES 1
|
|
#define HAS_FLOAT 0
|
|
/* Support for functions and local variables (stack) */
|
|
#define HAS_FUNC 1
|
|
/* Speed-up variable look-up with small hash table */
|
|
#define HASH_VAR 1
|
|
|
|
/*
|
|
A stack undeflow can only occur if compiler generates wrong code or VM is faulty.
|
|
Or external ccalls are wrong.
|
|
Should only be enabled for testing and debugging.
|
|
*/
|
|
#define STACKUNDERFLOWCHECK 0
|
|
|
|
/* Default length of strings (heap) */
|
|
#define DEFSTRINGLEN 16
|
|
/* event module: maximal number of events (table) */
|
|
#define MAXEVENTS 16
|
|
/* maximum length of identifiers */
|
|
#define MAXNAMELEN 8
|
|
/* maximum number of context tasks. At least 1, typical 2 (0: main program, foreground, 1:command line, background) */
|
|
#define MAXTASKS 4
|
|
/* Memory alignment of data part of variables (scalars, strings, arrays) */
|
|
#define MEMALIGN 2
|
|
/* Memory alignment of data part of variables (scalars, strings, arrays) */
|
|
/* Total padding is HAS_LOCK + VARPADDING */
|
|
#define VARPADDING 0
|
|
/* Variable/Function locking via lock(x) and unlock(x) */
|
|
#define HAS_LOCK 1
|
|
|
|
/* Default stack size */
|
|
#define DEFSTACKSIZE 100
|
|
|
|
/* Defaukt number type, inherited by stacks, too */
|
|
#define NUMBER_T int16_t
|
|
|
|
/* Some functions can be inlined, leave empty if these function candidates should not be converted to inline code */
|
|
#define INLINE
|
|
|
|
/* SHM support for debgging and hw-signal simulation? */
|
|
#define SHM 1
|
|
|
|
/* With network module supporting serial communication devices? */
|
|
#define HAS_NET 1
|
|
/* W/o routing a simplified network module is used providing only down- and up-direction message proapagation with 1 link per node */
|
|
#define HAS_NET_ROUTING 0
|
|
/* Maximal number of serial ports (1 if HAS_NET and HAS_NET_ROUTING=0) */
|
|
#define NUMPORTS 1
|
|
/* Port buffer PORTRXBUFFERSIZE:[rx,inp] PORTTXBUFFERSIZE:[tx], one port*/
|
|
#define PORTRXBUFFERSIZE 1024
|
|
/* only needed if HAS_NET_ROUTING==1 */
|
|
#define PORTTXBUFFERSIZE 1024
|
|
/* message log buffer (shared by all ports), number of messages, only for HAS_NET_ROUTING==1 */
|
|
#define MSGLOGSIZE 32
|
|
|
|
|
|
/** MEMORY ***/
|
|
/* Dynamic memory allocation */
|
|
#define MEMALLOC malloc
|
|
#define MEMCOPY memcpy
|
|
#define MEMSET memset
|
|
/*
|
|
VM access to communication channels (including stdin,stdout)
|
|
Without or with net module (or only mini net w/o routing).
|
|
|
|
Entry points are the following operations that must be provided by the host application.
|
|
*/
|
|
/*
|
|
IO Multiplexer API: These funcions must be provided by host applcation.
|
|
fd >= 0: Real file or serial port IO from net module
|
|
fd <= 0: Virtual IO by VM, must be handled separately
|
|
*/
|
|
extern int availbyte(int fd);
|
|
extern char inbyte(int fd);
|
|
extern int outbyte(int fd,char x);
|
|
|
|
#define AVAILBYTE(fd) availbyte(-(fd+1))
|
|
#define INBYTE(fd) inbyte(-(fd+1))
|
|
#define OUTBYTE(fd,x) outbyte(-(fd+1),x)
|
|
|
|
/*
|
|
Wake up blocked Loop (if Loop is blocking)
|
|
Unix: self sending of signal
|
|
Actually not needed.
|
|
*/
|
|
extern void interrupt();
|
|
#define INTERRUPT() interrupt()
|
|
|
|
/*
|
|
Read/write-through versions w/o using the net module, can be used for single node systems
|
|
#define AVAILBYTE(fd) 1
|
|
#define INBYTE(fd) getchar()
|
|
#define OUTBYTE(fd,x) putchar(x)
|
|
*/
|
|
|
|
#ifndef MILLIS
|
|
// millis, relative to program start
|
|
/* return system clock in milliseconds */
|
|
#include <sys/time.h>
|
|
time_t __millis0;
|
|
suseconds_t __micros0;
|
|
#define MILLIS() ({ \
|
|
struct timeval t ; \
|
|
gettimeofday ( & t , NULL ) ; \
|
|
unsigned long retval = (int)((t.tv_sec * 1000 + ( t.tv_usec + 500 ) / 1000)-__millis0); \
|
|
retval;\
|
|
})
|
|
#endif
|
|
|
|
#ifndef MICROS
|
|
#define MICROS() ({ \
|
|
struct timeval t ; \
|
|
gettimeofday ( & t , NULL ) ; \
|
|
unsigned long retval = t.tv_usec - __micros0; \
|
|
retval;\
|
|
})
|
|
#endif
|
|
|
|
#ifndef TIMEINIT
|
|
// timeinit
|
|
#define TIMEINIT() {\
|
|
struct timeval t ; \
|
|
gettimeofday ( & t , NULL ) ; \
|
|
__millis0 = t.tv_sec * 1000 + ( t.tv_usec + 500 ) / 1000 ;\
|
|
__micros0 = t.tv_usec;\
|
|
}
|
|
#endif
|
|
|
|
extern int iowait();
|
|
#define IOINIT ioinit
|
|
#define IOAWAIT iowait
|
|
|
|
|
|
// Only for debugging/monitoring (print_format can be redirected to router/serial port)
|
|
// always redirected to stdout
|
|
#ifdef DEBUG
|
|
void vLog(const char* fmtStr, ...);
|
|
#else
|
|
#define vLog(...)
|
|
#endif
|
|
|
|
|
|
#endif
|