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

📄 main.c

📁 Real Time Operating System for Hi-Tech C compiler.
💻 C
字号:
/************************************************************ 
Copyright (C) 1995-2002 Pumpkin, Inc. and its
Licensor(s). Freely distributable.

$Source: C:\\RCS\\d\\salvo\\ex\\ex1\\main.c,v $
$Author: aek $
$Revision: 3.21 $
$Date: 2003-10-20 18:05:18-07 $


Example program used in conjunction with AN-1, AN-12, etc.

************************************************************/
#include "main.h"
#include "salvo.h"


/* use #defines for legibility. 						*/
#define TASK1_P	  	OSTCBP(1)
#define TASK2_P	  	OSTCBP(2)
#define TASK3_P	 	OSTCBP(3)
#define BINSEM1_P	OSECBP(1)


/* use _OSLabel() to create context-switching labels.	*/
_OSLabel(Task1a)
_OSLabel(Task2a)
_OSLabel(Task3a)


/* Task1 toggles bit1 on PORT every 100ms (assumes  	*/
/*  clock).				 								*/
void Task1( void )
{
	
	for (;;) {
		PORT ^= 0x02;
		OS_Delay(10, Task1a);
	}
}


/* Task2 waits for binary semaphore #1 to be signaled,	*/
/*  then toggles bit2 on PORT.							*/ 
void Task2( void )
{
	for (;;) {
		OS_WaitBinSem(BINSEM1_P, OSNO_TIMEOUT, Task2a);
		PORT ^= 0x04;
	}
}


/* Task3 delays itself for 400ms, then signals binary	*/
/*  semaphore #1 and toggles bit3 on PORT.				*/ 
void Task3( void )
{
	for (;;) {
		OS_Delay(40, Task3a);
		PORT ^= 0x08;
		OSSignalBinSem(BINSEM1_P);
	}
}



void main( void )
{
	InitPORT();

	Init();
	
	/* initialize Salvo.								*/	
	OSInit();
	
	/* create the three tasks 							*/
	OSCreateTask(Task1, TASK1_P, 3);
	OSCreateTask(Task2, TASK2_P, 7);
	OSCreateTask(Task3, TASK3_P, 14);
		
	/* initialize binary semaphore to 0.	 			*/
	OSCreateBinSem(BINSEM1_P, 0);

	/* enable interrupts.                               */
	OSEi();
	
	/* start multitasking.								*/
	for (;;)
		OSSched();
}

/************************************************************
****                                                     ****
**                                                         **
intVector()

Periodic interrupt via Timer0 every 256 cycles. To call
OSTimer at 100Hz (every 10ms), a prescalar is used. 4MHz 
clock (1us instruction cycle) is assumed. 

Salvo's timer prescalar isn't used because it's not part of
the freeware libraries.

**                                                         **
****                                                     ****
************************************************************/
#if   defined(SYSA) || defined(SYSF) || defined(SYSH) \
 ||  defined(SYSP)
 
#if   defined(SYSA) || defined(SYSH) || defined(SYSF) 
void interrupt IntVector( void )
#elif defined(SYSP)
#pragma vector=0x08
__interrupt void IntVector( void )
#endif
{
	static char i = 39; /* prescalar, 39 x 256us = 10ms	*/
	
	
	if ( T0IE && T0IF ) {
		T0IF = 0;
					
		if ( !(--i) ) {
			/* re-load prescalar.						*/
			i = 39;
			
			/* toggle bit0 on PORT to show some life.	*/
			PORT ^= 0x01;
			
			/* call Salvo's timer in order to process 	*/
			/*  delayed tasks.							*/
			OSTimer();
		}
	}
}

#elif defined(SYSE)

#pragma interrupt IntVector save=PROD,section(".tmpdata")

void IntVector( void )
{
	static char i = 39; /* prescalar, 39 x 256us = 10ms	*/
	
	
	if ( INTCONbits.T0IE && INTCONbits.T0IF ) {
		INTCONbits.T0IF = 0;
					
		if ( !(--i) ) {
			/* re-load prescalar.						*/
			i = 39;
			
			/* toggle bit0 on PORT to show some life.	*/
			PORT ^= 0x01;
			
			/* call Salvo's timer in order to process 	*/
			/*  delayed tasks.							*/
			OSTimer();
		}
	}
}

#pragma code IntVectorHigh = 0x08
void IntVectorHigh( void )
{ 	
	_asm
	goto	IntVector
	_endasm
}


#elif defined(SYSI) /* 8051 */

void timer0 (void) interrupt 1 using 2
{
	/* stop, reload and start timer. */
	TR0 =       0;
	TH0 = TIMER_H;
	TL0 = TIMER_L;
	TR0 =       1;
	
	/* toggle bit0 on P1 to show some life.	*/
	PORT ^= 0x01;
	
	/* handle system ticks. */
	OSTimer();
}


/*															*/																
/* ====================== MSP430 ========================== */
/*															*/																
#elif defined(SYSQ) /* IAR MSP430 C              */ \
   || defined(SYSR) /* Archelon Quadravox AQ430  */ \
   || defined(SYSS) /* ImageCraft ICC430         */ \
   || defined(SYSX) /* Rowley CrossStudio MSP430 */

#if   defined(SYSQ)
#if (__VER__ < 200)
interrupt[TIMERA0_VECTOR] void Timer_A (void)
#else
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
#endif
#elif defined(SYSR)
interrupt[TIMERA0_VECTOR] void Timer_A (void)
#elif defined(SYSS)
#pragma interrupt_handler Timer_A:TIMERA0_VECTOR
void Timer_A (void)
#elif defined(SYSX)
void Timer_A (void) __interrupt[TIMERA0_VECTOR]
#endif
{
	CCR0 += 10000;
	
	/* toggle bit0 on P1OUT to show some life.	*/
	PORT ^= 0x01;
	
    OSTimer(); 
}                      


/*															*/																
/* ====================== M68HC11 ========================= */
/*															*/																
#elif defined(SYST) /* ImageCraft ICC11 */

#pragma interrupt_handler intVector

void intVector ( void )
{
	/* clear RTIF */
	TFLG2 |= 0b01000000;
	
	/* toggle bit0 on PORTB to show some life.	*/
	PORT ^= 0x01;
	
    OSTimer(); 
}                      


#pragma abs_address:0x00EB	   /* RTI BUFFALO 3.4 EVB11  */

	asm(" jmp _intVector");	   

#pragma end_abs_address



/*															*/																
/* ======================= AVR ============================ */
/*															*/																
#elif defined(SYSV) /* ImageCraft ICCAVR */ \
   || defined(SYSY) /* AVR-GCC           */ 
   
#if   defined(SYSV)
#pragma interrupt_handler IntVector:iv_TIMER1_CAPT IntVector:iv_TIMER1_COMPA

void IntVector(void) 
{	
    OSTimer(); 
}
#elif defined(SYSY)
SIGNAL(SIG_OUTPUT_COMPARE1A)
{	
    OSTimer(); 
}
#endif


/*                                                          */                                                                
/* ===================== TMS320C28x ======================= */
/*                                                          */                                                                
#elif defined(SYSW) /* TMS320C2000 */
/* vectors are defined in \salvo\tut\tu1\sysw\vectors.asm */

interrupt void ISR14(void) /* Timer 2 is in INTVECT #14 */
{	
    OSTimer(); 
}


/*                                                          */                                                                
/* ===================== TMS320C24x ======================= */
/*                                                          */                                                                
#elif defined(SYSAA) /* TMS320C240x */
/* vectors are defined in vectors.asm */

#define HEARTBEAT_LED_PRESCALAR 50 
unsigned char prescalar = HEARTBEAT_LED_PRESCALAR;

interrupt void ISR3(void) /* Timer 2 is in INT3 */
{	
	/* clear T2PINT flag -- required for this type of interrupt.*/
    *EVAIFRB = *EVAIFRB & 0x0001;      
	
	/* System tick period is 10ms @ 30MHz. Toggle the IOPC0 pin */
	/*  every 250ms via a divide-by-50 prescalar.               */
	if (--prescalar == 0)
	{
		prescalar = HEARTBEAT_LED_PRESCALAR;
		
		/* XOR the IOPC0 bit to toggle the pin */
	    *PCDATDIR = *PCDATDIR ^ 0x0001;    
	}

	/* a system tick occured, so call OSTimer(). */
    OSTimer(); 
    
}


#else /* SYS* not defined */                        
#error Undefined Salvo test system (SYS*). Definition required.


#endif

#if ( OSVERSION < 311 )
void OSIdlingHook( void )
{ 
	;
}
#endif

⌨️ 快捷键说明

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