📄 main.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 + -