⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tvmemul.c

📁 专业汽车级嵌入式操作系统OSEK的源代码
💻 C
字号:
/** * tvmemul.c * Entry source file for TinyVM emulator. */#include <stdio.h>#include <stdlib.h>#include <sys/time.h>#include <signal.h>#include "types.h"#include "constants.h"#include "classes.h"#include "threads.h"#include "stack.h"#include "specialclasses.h"#include "specialsignatures.h"#include "language.h"#include "memory.h"#include "interpreter.h"#include "exceptions.h"#include "load.h"#include "trace.h"#include "poll.h"#include "sensors.h"#include "platform_hooks.h"#define MEMORY_SIZE 8192 /* 16 Kb */#define EXTRA_MEMORY_SIZE 1536 /* 3 Kb */#define DEBUG_RUNS  0byte *region;Thread   *bootThread;struct timeval gStart;struct itimerval itimer ={  {0, 1000},  {0, 1000}};int	verbose = 0;	/* If 1, print descriptive strings. */int last_sys_time;              /* to generate ticks */int last_ad_time;               /* to generate sensor reads */void handle_uncaught_exception (Object *exception,                                       const Thread *thread,				       const MethodRecord *methodRecord,				       const MethodRecord *rootMethod,				       byte *pc){    printf ("*** UNCAUGHT EXCEPTION/ERROR: \n");    printf ("--  Exception class   : %u\n", (unsigned) get_class_index (exception));    printf ("--  Thread            : %u\n", (unsigned) thread->threadId);    printf ("--  Method signature  : %u\n", (unsigned) methodRecord->signatureId);    printf ("--  Root method sig.  : %u\n", (unsigned) rootMethod->signatureId);    printf ("--  Bytecode offset   : %u\n", (unsigned) pc -             (int) get_code_ptr(methodRecord));  					       }void switch_thread_hook(){  // NOP}FOURBYTES sys_time = 0;struct timeval now;void timer_handler(int signo){  gettimeofday(&now, 0);  // 11/17/01: Jose commented out:  // 03/29/02: Paul put back in. Regression tests will fail otherwise.  timersub(&now, &gStart, &now);  sys_time = now.tv_sec*1000 + now.tv_usec/1000;  signal(SIGALRM, timer_handler);}FOURBYTES get_sys_time_impl(){  return sys_time;}void run(void){  #if DEBUG_RUNS  int count = 0;  #endif  init_poller();  // Initialize binary image state  initialize_binary();  // Initialize memory  {    TWOBYTES size;    memory_init ();#if SEGMENTED_HEAP    size = EXTRA_MEMORY_SIZE;    region = (byte *) malloc (size * sizeof (TWOBYTES));    memory_add_region (region, region + size * sizeof (TWOBYTES));#endif    size = MEMORY_SIZE;    region = (byte *) malloc (size * sizeof (TWOBYTES));    memory_add_region (region, region + size * sizeof (TWOBYTES));  }  // Initialize exceptions  init_exceptions();  // Create the boot thread (bootThread is a special global)  bootThread = (Thread *) new_object_for_class (JAVA_LANG_THREAD);    #if DEBUG_THREADS  printf ("Created bootThread: %d. Initializing...\n", (int) bootThread);  #endif    #if DEBUG_RUNS  for (count = 0; count < 100; count++)  {  #endif // DEBUG_RUNS  #if DEBUG_RCX_MEMORY  {    TWOBYTES numNodes, biggest, freeMem;	    scan_memory (&numNodes, &biggest, &freeMem);    printf ("nodes = %d\n", (int) numNodes);    printf ("biggest = %d\n", (int) biggest);    printf ("freeMem = %d\n", (int) freeMem);  }  #endif  init_threads();  if (!init_thread (bootThread))  {    printf ("Unable to initialize threading module.\n");    exit (1);	    }  // Execute the bytecode interpreter  set_program_number (0);  #if DEBUG_STARTUP  printf ("Engine starting.\n");  #endif  engine();  // Engine returns when all non-daemon threads are dead  #if DEBUG_STARTUP  printf ("Engine finished.\n");  #endif  #if DEBUG_RUNS  }  #endif // DEBUG_RUNS}/*************************************************************************** * int main * Parses command line. Format is: *	argv[0] [-v] bin_file * * options: *	-v	Verbose mode. Prints text output rather than raw output. * *-------------------------------------------------------------------------- * To go into man page: * Name:	emu-lejosrun - Emulate lejos RCX code in Unix * * Synosis:	emu-lejosrun [-v] bin_file * * Description:	Executes a binary file created by the lejos compiler within *		Unix rather than in the RCX environment. The Java byte-codes *		are executed here, and their actions are listed rather than *		executed as they would be on the real RCX device. * * Options:	-v	Verbose mode. Normally the output is printed in raw *			mode. The actual hex values are printed. Using this *			option displays more user-friendly output. *-------------------------------------------------------------------------- ***************************************************************************/int main (int argc, char *argv[]){	int	c;	char	*file = argv[argc - 1];	/* Process any options. */	while(--argc > 0 && (*++argv)[0] == '-')		while((c = *++argv[0]) != 0)			switch (c) {			case 'v':				verbose = 1;				break;			default:				printf("%s: unknown option %c\n",					argv[0], c);				exit(1);			}	if (argc != 1)	{		printf ("%s runs a binary dumped by the linker.\n", argv[0]);		printf ("Use: %s [-v] binary_file\n", argv[0]);		exit (1);	}#if DEBUG_STARTUP	printf ("Reading binary %s\n", file);#endif	readBinary (file);	if (gettimeofday(&gStart, NULL)) 		perror("main: gettimeofday");	timer_handler (SIGALRM);	if (setitimer(ITIMER_REAL, &itimer, null) < 0)	{	  printf ("Failed to set interval timer\n");	  exit(1);	}        init_sensors ();        last_ad_time = get_sys_time();	run();	itimer.it_value.tv_usec = 0;	setitimer(ITIMER_REAL, &itimer, null);	signal(SIGALRM, SIG_DFL);	exit(0);} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -