📄 bsp.c
字号:
/***********************************************************************/
/* */
/* MODULE: bsp.c 1.23 */
/* DATE: 22:04:46 - 99/06/24 */
/* PURPOSE: This file contains the tick timer driver for the */
/* decrementer in the processor and timer chip Intel 82C54. */
/* Selection of one of the two is controlled by defining */
/* TICK_DEC. The use of the decrementer alleviates the need */
/* for the 8254 in the system. */
/* */
/*---------------------------------------------------------------------*/
/* */
/* Copyright 1991 - 1995, Integrated Systems, Inc. */
/* ALL RIGHTS RESERVED */
/* */
/* Permission is hereby granted to licensees of Integrated Systems, */
/* Inc. products to use or abstract this computer program for the */
/* sole purpose of implementing a product based on Integrated */
/* Systems, Inc. products. No other rights to reproduce, use, */
/* or disseminate this computer program, whether in part or in */
/* whole, are granted. */
/* */
/* Integrated Systems, Inc. makes no representation or warranties */
/* with respect to the performance of this computer program, and */
/* specifically disclaims any responsibility for any damages, */
/* special or consequential, connected with the use of this program. */
/* */
/*---------------------------------------------------------------------*/
/* */
/* */
/* */
/***********************************************************************/
#include "bsp.h"
#include <bspfuncs.h>
#include <psos.h>
#include <configs.h>
#include <drv_intf.h>
#ifdef __TCS__
#include <tm1/tmInterrupts.h>
#include <tm1/tmTimers.h>
#else
#include <tmInterrupts.h>
#include <tmTimers.h>
#endif
#include <stdarg.h>
/*---------------------------------------------------------------------*/
/* General Definitions */
/*---------------------------------------------------------------------*/
#define UCHAR unsigned char
#define USHORT unsigned short
#define ULONG unsigned long
/*---------------------------------------------------------------------*/
/* The node anchor address is a pointer to the node configuration */
/* table, which in turn points to the pSOS+ configuration table. This */
/* driver will look in the pSOS+ configuration table to see how many */
/* ticks per second are specified, and thus how many interrupts per */
/* second to generate. */
/*---------------------------------------------------------------------*/
extern NODE_CT *anchor;
/*---------------------------------------------------------------------*/
/* Define function prototypes */
/*---------------------------------------------------------------------*/
void RtcInit(struct ioparms *);
extern void TimerIntWrapper(void);
/*---------------------------------------------------------------------*/
/* Declarations of external functions & variables */
/*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*/
/* The decrementer driver should announce a tick to pSOS+ only after */
/* the tick timer has been initialized. */
/*---------------------------------------------------------------------*/
ULONG rtcDecInitDone;
/*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*/
/* Global Variable Declarations */
/*---------------------------------------------------------------------*/
ULONG cpuClkRate = 100; /* Assume CPU bus frequency = 1 MHz */
/***********************************************************************/
/* SysInitFail: Report a system initalization failure */
/* */
/* INPUTS: string = pointer to text of message */
/* OUTPUTS: None */
/* */
/* NOTE: Doesn't return. Just continually prints the error message on */
/* the serial channel once per second. */
/* */
/***********************************************************************/
void SysInitFail(const char *string)
{
write(1, string, strlen(string));
write(1, "\r\n", 2);
exit(-1);
}
/*---------------------------------------------------------------------*/
/* The node anchor address is a pointer to the node configuration */
/* table, which in turn points to the pSOS+ configuration table. This */
/* driver will look in the pSOS+ configuration table to see how many */
/* ticks per second are specified, and thus how many interrupts per */
/* second to generate. */
/*---------------------------------------------------------------------*/
extern NODE_CT *anchor;
void InitBoard(void)
{
}
/***********************************************************************/
/* RtcInit: Initialize gui time clock. */
/* INPUTS: None */
/* OUTPUTS: None */
/* NOTES: Installs the RTC Interrupt handler in Interrupt Table.*/
/***********************************************************************/
void RtcInit (struct ioparms *p)
{
Int timer;
timInstanceSetup_t setup;
/*---------------------------------------------------------------------*/
/* Check and set the init flag */
/*---------------------------------------------------------------------*/
if (rtcDecInitDone) { return; }
rtcDecInitDone = 1;
/*---------------------------------------------------------------------*/
/* Set the count from pSOS+ configuration table */
/*---------------------------------------------------------------------*/
if (anchor->psosct->kc_ticks2sec == 0) {
p->err = TIMR_TICKRATE;
return;
}
/*---------------------------------------------------------------------*/
/* Update the decrementer */
/*---------------------------------------------------------------------*/
setup.source = timCLOCK;
setup.prescale = 1;
setup.handler = TimerIntWrapper;
setup.priority = intPRIO_5;
setup.running = True;
timToCycles( 1000000000 / anchor->psosct->kc_ticks2sec, &setup.modulus );
if ( timOpen(&timer)
|| timInstanceSetup( timer, &setup )
) {
SysInitFail("Could not allocate psos tick timer");
}
/*---------------------------------------------------------------------*/
/* Finally, set return values in the I/O driver parameter structure. */
/*---------------------------------------------------------------------*/
p->used = 1;
p->err = 0;
p->out_retval = 0;
}
/***********************************************************************/
/* TimerIntWrapper */
/* */
/* Announce the interrupt to PSOS */
/* */
/***********************************************************************/
extern void IntUserTicks(void);
void
TimerIntWrapper(void)
{
# pragma TCS_interruptible_handler
#ifdef __TCS
/*
* work around the IPENDING bug in the TM1
* remove this code when the hardware clears
* correctly.
*/
MMIO(ICLEAR) = 1 << bsp_interrupt;
#endif
ienter();
AppModel_run_on_sstack((Pointer)tm_tick, Null );
IntUserTicks();
ireturn();
}
#ifdef KC_SYSSTK
int AppModel_system_stack_size= KC_SYSSTK;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -