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

📄 serial.c

📁 os源代码 os源代码 os源代码 os源代码 os源代码 os源代码
💻 C
字号:
/**************************************************************************
 * file: Serial.c
 *
 * Sandia National Laboratories Test Code
 * This is demo code to exercise the UCOS-II PowerPC 555 port.
 * The task counters increment at different rates to show the 
 * OS is working.
 * Some non-essential code is MPC555 specific.
 * Remove for a different target.
 *
 * Functions:
 * int main (void)
 * void T_Letter_A(void *data); 
 * void T_Letter_B(void *data); 
 * void T_Letter_C(void *data); 
 * void T_Letter_D(void *data); 
 * void T_Number_5(void *data);
 * void T_Number_6(void *data);
 * void ticker_start (INT32S ticks_per_second);
 *
 * Author: R. A. Williams 01/19/2000
 * rawilli@sandia.gov
 *
 * Version V1.00
 *
/***************************************************************************/

#define GLOBAL_DEFINE		/* Define globals in this file */ 

#include "includes.h"

/* Defines */ 
/* Priorities */ 
enum t_prio { T_L_A_PRIO = 2, T_L_B_PRIO, T_L_C_PRIO, T_L_D_PRIO, T_N_5_PRIO, T_N_6_PRIO };

#define TASK_STK_SIZE     96 // RAW change from 2048
#define T_DELAY		1
/*
 * Note: IMMR_BASE is target specific. Change this value to match the base
 * of the memory-mapped registers on your target
 */ 
#define IMMR_BASE	0x00000000
#define TMBCLKS_PER_SEC 1000000

/*------------
I/O Registers
------------*/
short Com1Con0:0x305008;	/* SCI1 control register 0 */
short Com1Con1:0x30500A;	/* SCI1 control register 1 */
short Com1Status:0x30500C;	/* SCI1 status register */
short Com1Data:0x30500E;	/* SCI1 data register */

extern INT32U HoldMSR;	/*	For MSR */

/*--------------
Global Variables
--------------*/
INT32S ctrT_L_A;
INT32S ctrT_L_B;
INT32S ctrT_L_C;
INT32S Iterations;

OS_STK T_Letter_AStk[TASK_STK_SIZE];
OS_STK T_Letter_BStk[TASK_STK_SIZE];
OS_STK T_Letter_CStk[TASK_STK_SIZE];

INT8U T_Letter_AData;
INT8U T_Letter_BData;
INT8U T_Letter_CData;

INT8U SByte;	/* global byte, contained just received data byte */
/*------------------
Function Prototypes
------------------*/
INT8S putchar(INT8U sbyte);
INT8S ReadyToSend();
void puts(INT8S *sptr);
void putch(INT8S ch);
INT8S putchar(INT8U sbyte);
INT8S SerialReady();
INT8S GetSByte();
void InitCom1();
void inithw(void);
void IrqSvr (void);

/* OS and Test Function prototypes */ 
void T_Letter_A(void *data);
void T_Letter_B(void *data);
void T_Letter_C(void *data);
void ticker_start (INT32S ticks_per_sec);

/* INITIALIZE HARDWARE REGISTERS */
/* This routine is called once following RESET */
void inithw(){
	unsigned long *Rptr;
	unsigned short *sRptr;
/*
@ SPR638 = 0xFFF00800	<--- see __ppc_eabi_init.c
@ SPR560 = 0x00000000

*/
	Rptr = (INT32U *) 0x2fc300;	/* TBSCRK key */
	*Rptr = 0x55CCAA33;
	sRptr = (INT16U *) 0x2fc200;	/* TBSCR */
	*sRptr = 0x3CC1;					/*	Prio 7, Clr A/B, No A/B Int, TB On */
	Rptr = (INT32U *) 0x2fc384;	/* PLPRCRK key */
	*Rptr = 0x55CCAA33;
	Rptr = (INT32U *) 0x2fc30c;	/* TBK Time Base Key */
	*Rptr = 0x55CCAA33;


	Rptr = (INT32U *) 0x2fc000;	/* SIUMCR */
	*Rptr = 0x00;
	Rptr = (INT32U *) 0x2fc004;	/* SYPCR */
	*Rptr = 0xFF88;

	Rptr = (INT32U *) 0x2fc100;	/* BR0 */
	*Rptr = 0x400003;	// 32-bit set here for BDM or external flash
/*	*Rptr = 0x400803;	// 16-bit set here for EEPROM M-SEL position 1 (cs0) */
/*	*Rptr = 0x000003;	// 32-bit set here to use external booting with IMMR Flash disabled */
	Rptr = (INT32U *) 0x2fc104;	/* OR0 */
	*Rptr = 0xfff80012;

	Rptr = (INT32U *) 0x2fc108;	/* BR1 */
	*Rptr = 0x800003;
	Rptr = (INT32U *) 0x2fc10c;	/* OR1 */
	*Rptr = 0xfff80002;	         /* no wait state */

	Rptr = (INT32U *) 0x2fc110;	/* BR2 */
	*Rptr = 0xc00003;
	Rptr = (INT32U *) 0x2fc114;	/* OR2 */
	*Rptr = 0xfffe0022;

	Rptr = (INT32U *) 0x2fc118;	/* BR3 */
	*Rptr = 0x01000403;	         /* Originally for Keypad/LCD */
	Rptr = (INT32U *) 0x2fc11c;	/* OR3 */
	*Rptr = 0xfffe0FF1;	         /* maximum wait states */

	Rptr = (INT32U *) 0x2fc140;	/* DMBR */
	*Rptr = 0x00;
	Rptr = (INT32U *) 0x2fc144;	/* DMOR */
	*Rptr = 0x00;
	Rptr = (INT32U *) 0x2fc280;	/* SCCR */
	*Rptr = 0x10000;
	Rptr = (INT32U *) 0x2fc284;	/* PLPRCR */
	*Rptr = 0x400000;

	Rptr = (INT32U *) 0x2fc024;	/* SGPIODT1 */
	*Rptr = 0x0000;
	Rptr = (INT32U *) 0x2fc028;	/* SGPIODT2 */
	*Rptr = 0x0000;
	Rptr = (INT32U *) 0x2fc02c;	/* SGPIOCR */
	*Rptr = 0x0000;
	Rptr = (INT32U *) 0x2fc030;	/* EMCR */
	*Rptr = 0x0000;
	Rptr = (INT32U *) 0x307f80;	/* UMCR */
	*Rptr = 0x0000;
}

INT16S main(void)
{
	INT32S	idx;
	
	EnterCritical();
	InitCom1();	            /* initialize SCI1 serial port */
	puts("\nWelcome to uC/OSII\n");

	T_Letter_AData = 'A';
	T_Letter_BData = 'B';
	T_Letter_CData = 'c';

	/* Initialize the stack */
	for (idx = 0; idx < TASK_STK_SIZE + 0x10; idx++)
	{
		T_Letter_AStk[idx] = 0xE0E1E2E3;
		T_Letter_BStk[idx] = 0xE0E1E2E3;
		T_Letter_CStk[idx] = 0xE0E1E2E3;
	}

	OSInit ();

	OSTaskCreate (	T_Letter_A,
					(void *)&T_Letter_AData,
					(void *)&T_Letter_AStk[TASK_STK_SIZE],
					T_L_A_PRIO);

	OSTaskCreate (	T_Letter_B,
					(void *)&T_Letter_BData,
					(void *)&T_Letter_BStk[TASK_STK_SIZE],
					T_L_B_PRIO);

	OSTaskCreate (	T_Letter_C,
					(void *)&T_Letter_CData,
					(void *)&T_Letter_CStk[TASK_STK_SIZE],
					T_L_C_PRIO);

	OSStart();
	/* No, it never returns... */ 
	return 0;
}


/***********************************************/
/* TASKS                                       */
/* Note: These are NOT normal function calls   */
/***********************************************/

void T_Letter_A (void * data)
{
	ctrT_L_A = 0;

	/* OSStatInit (); */
	SetDecrementer();
	ticker_start (OS_TICKS_PER_SEC);

	for(;;)
	{
		/*
		 * Output the data letter 'A' at serial port 1.
		 * MPC555 specific.
		 */
		puts("\nTask A\n");
		/* Increment a counter to show it is working */ 
		ctrT_L_A++;
		/* Wait */ 
		OSTimeDly (T_DELAY * OS_TICKS_PER_SEC);	/* Thread drops here. */
	}
}

void T_Letter_B (void * data)
{
	ctrT_L_B = 0;

	for(;;)
	{
		/*
		 * Output the data letter 'B' at serial port 1.
		 * MPC555 specific.
		 */
		puts("\nTask B\n");
		/* Increment a counter to show it is working */ 
		ctrT_L_B++;
		/* Wait */ 
		OSTimeDly (2 * T_DELAY * OS_TICKS_PER_SEC);

	}
}

void T_Letter_C (void * data)
{
	ctrT_L_C = 0;

	for(;;)
	{
		/*
		 * Output the data letter 'C' at serial port 1.
		 * MPC555 specific.
		 */
		puts("\nTask C\n");
		/* Increment a counter to show it is working */ 
		ctrT_L_C++;
		/* Wait */ 
		OSTimeDly (3 * T_DELAY * OS_TICKS_PER_SEC);
	}
}



/***********************************************/
/* Ticker Stuff                                */
/* Note: These are called from Main and Task A */
/***********************************************/

void ticker_start (INT32S ticks_per_second)
{
	INT32U * Rptr;
	
	SetDecrementer();
	HoldMSR = MSR_ALL_EN;				//	Turn interrupts on now.
	ExitCritical();
}

/***********************************************/
/* Utility Functions                           */
/* End of OS related stuff                     */
/***********************************************/

void InitCom1(){
	Com1Con0 = 65;		   /* 9600 Baud */
	Com1Con1 = 0x000C;	/* Transmit & Receive Enabled, no parity, no interrupts */
}

INT8S putchar(INT8U sbyte){
	if(ReadyToSend())	return 1;	/* wait for ready to send */
	Com1Data = (INT16S) sbyte;
	return 0;
}

void putch(INT8S ch){

	if (ch == '\n'){
		putchar(0x0d);
		putchar(0x0a);
	}
	else{
		putchar(ch);
	}
}

void puts(INT8S *sptr){
	while(*sptr){
		putch(*sptr);
		++sptr;
	}
}


/* returns 0 if transmit register ready for another byte */
INT8S ReadyToSend(){
	INT16S Status;
	do{	/* wait for transmit byte sent to the shift register, ready for another */
		Status = Com1Status;
	}while((Status & 0x0100) == 0);
	return 0;
}

/* returns 0 if no serial data is waiting to be received */
INT8S SerialReady(){
	INT16S Status;

	Status = Com1Status;
	if( (Status & 0x0040) == 0){
		return 0;
	}
	return 1;
}

/* wait for a byte to be received from the serial port. */
/* the byte will be stored in the global register:	SByte */
INT8S GetSByte(){
	INT16S Temp1;

	while(SerialReady() == 0) ;	/* wait for new incoming data */

	Temp1 = Com1Data; 	         /* read the port */
	SByte = (INT8U) (Temp1 & 0x00FF);
	return 0;
}

⌨️ 快捷键说明

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