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

📄 main.c.bak

📁 ucos简单示例
💻 BAK
字号:
#include "../SOURCE/includes.h"               // uC/OS interface
#include "../inc/44b.h"
#include "../inc/44blib.h"
#include "../inc/def.h"

/*
*********************************************************************************************************
*                                              CONSTANTS
*********************************************************************************************************
*/
// Stack size, in sizeof OS_STK, or int 32bit
#ifdef SEMIHOSTED
#define	TASK_STK_SIZE		(64+SEMIHOSTED_STACK_NEEDS)
#else
#define	TASK_STK_SIZE		256
#endif			

#define TASK_START_ID	0		/* Application tasks                             */
#define TASK1_ID	1
#define TASK2_ID	2
#define TASK3_ID	3
#define TASK4_ID	4
//#define TASK5_ID	5

#define TASK_START_PRIO	0		/* Application tasks priorities                  */
#define TASK1_PRIO	1
#define TASK2_PRIO	2
#define TASK3_PRIO	3
#define TASK4_PRIO	4
//#define TASK5_PRIO	5

#define printf Uart_Printf

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/
OS_STK	TaskStartStk[TASK_STK_SIZE];	/* Startup    task stack                         */
OS_STK	Task1Stk[TASK_STK_SIZE];	/* Task #1    task stack                         */
OS_STK	Task2Stk[TASK_STK_SIZE];	/* Task #2    task stack                         */
OS_STK	Task3Stk[TASK_STK_SIZE];	/* Task #3    task stack                         */
OS_STK	Task4Stk[TASK_STK_SIZE];	/* Task #4    task stack                         */
//OS_STK	Task5Stk[TASK_STK_SIZE];	/* Task #5    task stack                         */

OS_EVENT	*AckMbox;			/* Message mailboxes for Tasks #4 and #5         */
OS_EVENT	*TxMbox;

/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void	TaskStart (void *pdata);
void	Task1(void *pdata);
void	Task2(void *pdata);
void	Task3(void *pdata);
void	Task4(void *pdata);
void	Task5(void *pdata);
void	sys_init(void);
void	InitTick(INT16U tick);
INT8U	TestSRAM(void);
void	Beep(INT8U tick);

INT8U TestSRAM(void)
{
	INT8U status=0;
	INT16U *i;
	printf("Begin to write the SRAM.\n");
	for(i=(INT16U *)0x2000000; i<(INT16U *)0x4000000; i++)
	{
		printf("0X%x\r", i);
		*i = 0x0;
		*i = 0x55aa;
	}
	printf("\nBegin to test the SRAM.\n");
	for(i=(INT16U *)0x2000000; i<(INT16U *)0x4000000; i++)
	{
		printf("0X%x\r", i);
		if(*i != 0x55aa)
		{
			printf("ERROR address: %xd\n", i);
			status = 1;
			break;
		}
	}
	printf("End of testing SRAM.\n");
	return status;
}

/*
*********************************************************************************************************
*                                                  MAIN
*********************************************************************************************************
*/
int Main(void )
{

	sys_init();

	Beep(8);
//	TestSRAM();
	Delay(0);
//	Uart_Printf("\n Mettler Toledo S3C44B0 Main Starts !\n");

	if(rPDATG & 0x80)	// read the state of the metrological switch 
		printf("The metrological switch is off.\n");
	else
		printf("The metrological switch is on.\n");

	/* needed by uC/OS */
	OSInit();

	OSTimeSet(0L);

	/* create the start task */
	OSTaskCreateExt(TaskStart,
			(void *)0,
			&TaskStartStk[TASK_STK_SIZE - 1],
			TASK_START_PRIO,
			TASK_START_ID, 
			&TaskStartStk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);

	/* start the operating system */
	OSStart();

	return 0;
}                            

/*
*********************************************************************************************************
*                                               STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
	// enable Ticker, 64 ticks per second
	InitTick(OS_TICKS_PER_SEC);

	AckMbox = OSMboxCreate((void *)0);			/* Create 2 message mailboxes               */
	TxMbox  = OSMboxCreate((void *)0);

	/*
	* create the tasks in uC/OS and assign decreasing
	* priority to them
	*/

	OSTaskCreateExt(Task1,
			(void *)0,
			&Task1Stk[TASK_STK_SIZE - 1],
			TASK1_PRIO,
			TASK1_ID,
			&Task1Stk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);

	OSTaskCreateExt(Task2,
			(void *)0,
			&Task2Stk[TASK_STK_SIZE - 1],
			TASK2_PRIO,
			TASK2_ID,
			&Task2Stk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);

	OSTaskCreateExt(Task3,
			(void *)0,
			&Task3Stk[TASK_STK_SIZE - 1],
			TASK3_PRIO,
			TASK3_ID,
			&Task3Stk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);

	OSTaskCreateExt(Task4,
			(void *)0,
			&Task4Stk[TASK_STK_SIZE - 1],
			TASK4_PRIO,
			TASK4_ID,
			&Task4Stk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);

/*	OSTaskCreateExt(Task5,
			(void *)0,
			&Task5Stk[TASK_STK_SIZE - 1],
			TASK5_PRIO,
			TASK5_ID,
			&Task5Stk[0],
			TASK_STK_SIZE,
			(void *)0,
			0);
*/
	OSTaskDel(OS_PRIO_SELF);			// Delete current task
}

/*
*********************************************************************************************************
*                                               TASK #1
*********************************************************************************************************
*/
void Task1(void *Id)
{
	while(1)
	{
		rPDATB=rPDATB&0x5ff;
		OSTimeDly(OS_TICKS_PER_SEC);
		Beep(2);
		rPDATB=rPDATB|0x200;
		OSTimeDly(OS_TICKS_PER_SEC);
	}
}

/*
*********************************************************************************************************
*                                               TASK #2
*********************************************************************************************************
*/
void Task2(void *Id)
{
	while(1)
	{
		rPDATB=rPDATB&0x3ff;
		OSTimeDly(OS_TICKS_PER_SEC/2);
		Beep(4);
		rPDATB=rPDATB|0x400;
		OSTimeDly(OS_TICKS_PER_SEC/2);
	}
}

/*
*********************************************************************************************************
*                                               TASK #3
*********************************************************************************************************
*/
void Task3(void *pdata)
{
	char	txmsg;
	char	*rxmsg;
	INT8U	err;

	txmsg	= '0';
	while(1)
	{
		OSMboxPost(TxMbox, (void *)&txmsg);
		rxmsg = (char *)OSMboxPend(AckMbox, 0, &err);
		if(err == OS_NO_ERR)
		{
			printf("%c", *rxmsg);
			if(*rxmsg == 'Z')
				printf("\n");
		}
		txmsg++;
		if(txmsg > '9')
			txmsg = '0';

		OSTimeDlyHMSM(0,0,1,0);
	}
}

/*
*********************************************************************************************************
*                                               TASK #4
*********************************************************************************************************
*/
void Task4(void *pdata)
{
	char	txmsg;
	char	*rxmsg;
	INT8U	err;

	txmsg	= 'A';
	while(1)
	{
		rxmsg = (char *)OSMboxPend(TxMbox, 0, &err);
		if(err == OS_NO_ERR)
			printf("%c", *rxmsg);
		OSMboxPost(AckMbox, (void *)&txmsg);
		txmsg++;
		if(txmsg > 'Z')
			txmsg = 'A';
	}
}

//--------------------------------------------------------
// interrupt controler initilization
//--------------------------------------------------------
void intcon_init(void)
{
	rINTMOD = 0;		// all interrupt sources configed as IRQ
	rI_ISPC = 0x7ffffff;	// clear all intrrupt request
//	rINTCON = 0x05;		// irq interrupt available
	rINTCON = 0x01;		// irq interrupt available, use vector interrupt mode
}

//--------------------------------------------------------
// globel interrupt enable
//--------------------------------------------------------
void globle_int_enable(unsigned char bEnabled)
{
	if(bEnabled)
		rINTMSK &= ~BIT_GLOBAL;
	else
		rINTMSK |= (BIT_GLOBAL|BIT_EINT3);
}


#define IRQ_VECTOR_OFFSET	(0x70)

//-------------------------------------------------------
// globle variables
//-------------------------------------------------------
volatile static int isrCount = 0;		// tick counter
//volatile static unsigned int Dump_Pool[16];

//-------------------------------------------------------
// OS_Tick Hook Fubction
//-------------------------------------------------------
void tick_hook(void)
{
//	Uart_Printf("tick_hook()\n");
//	isrCount++;
#ifdef OS_USE_RTC_TICK
	rI_ISPC = (unsigned int)BIT_TICK;
#else
	rI_ISPC = (unsigned int)BIT_TIMER5;
#endif	
}

//-------------------------------------------------------
// install a new ISR
// this function must be synchronized
//-------------------------------------------------------
unsigned int ISR_Install(unsigned int offset, void *pf_ISR)
{
	unsigned int pOldEntry;

	// get absolute address of IRQ vector
	// _ISR_STARTADDRESS : see Option.h
	offset += _ISR_STARTADDRESS;

	// get the Old ISR service routine entry point
	pOldEntry = *((unsigned int *)offset);
	
	// install new interrupt service routine
	*((unsigned int *)offset) = (unsigned int)pf_ISR;

	return pOldEntry;
}

//-------------------------------------------------------
// must be synchronized
//-------------------------------------------------------
void tick_off(void)
{
#ifdef OS_USE_RTC_TICK
	rRTCCON = (unsigned char)1;
	
	rTICNT = (unsigned char)0;
	
	rRTCCON = (unsigned char)0;
#endif
}

//--------------------------------------------------------
// set or clear TICK interrupt mask
// this function must be synchronized
//--------------------------------------------------------
void tick_int_enable(unsigned char bEnabled)
{
#ifdef OS_USE_RTC_TICK
	if(bEnabled) {
		// clear interrupt pending first	
		rI_ISPC = (unsigned int)BIT_TICK;
		rINTMSK &= (unsigned int)~BIT_TICK;
	}
	else 
		rINTMSK |= (unsigned int)BIT_TICK;
#else
	if(bEnabled) {
		// clear interrupt pending first	
		rI_ISPC = (unsigned int)BIT_TIMER5;
		rINTMSK &= (unsigned int)~BIT_TIMER5;
	}
	else 
		rINTMSK |= (unsigned int)BIT_TIMER5;
#endif
}

void InitTick(INT16U tick)
{
#ifdef OS_USE_RTC_TICK
//Initalize RTC tick that is used by OS.
//If OS used RTC tick, tick is always set to 64
	rRTCCON = (unsigned char)1;

	rTICNT = (unsigned char)(0x01 | 0x80);

	rRTCCON = (unsigned char)0;

#else
//Initialize timer5 that is used OS.
	//dead zone=0, pre2= 100
	rTCFG0 |= 0x00640000;
	//all interrupt, mux5= 1/4, mux0~mux4=1/2
	rTCFG1 |= 0x00100000;

	//set T5 count, 64000000/100/4 = 1600000
	rTCNTB5 = 160*(1000/tick);

	//update T5
	rTCON &= 0xF0FFFFFF;
	rTCON |= 0x02000000;

	//T5,auto reload and start
	rTCON &= 0xF0FFFFFF;
	rTCON |= 0x05000000;

#endif

	tick_int_enable(1);	
}

void InitTimer0(INT16U	freq)
{
	INT16U	counter;

	//Set Timer0&1's prescaler to 100
//	rTCFG0 &= 0xFFFFFF00;
	rTCFG0 |= 0x64;

	//Set MUX0 = 1/4
//	rTCFG1 &= 0xFFFFFF0;
	rTCFG1 |= 0x1;

	//set T5 count, 64000000/100/4 = 160000
	counter = 40*(4000/freq);
	rTCNTB0 = counter;
	rTCMPB0 = counter/2;

	//update T5
	rTCON &= 0xFFFFFFF0;
	rTCON |= 0x2;

	//T0,auto reload, inverter on for TOUT0 and start
//	rTCON &= 0xFFFFFFF0;
//	rTCON |= 0xD;
}

void Beep(INT8U tick)
{
	if(tick > 16)
		tick = 16;

	// start timer0
	rTCON &= 0xFFFFFFF0;
	rTCON |= 0xD;			//T0,auto reload, inverter on for TOUT0 and start

	rRTCCON = (unsigned char)1;
	rTICNT = (unsigned char)((8*tick-1) | 0x80);	// 128/16 = 8
	rRTCCON = (unsigned char)0;

	rINTMSK &= (unsigned int)~BIT_TICK;
}

void __irq RTCTick(void)
{
	rTCON &= 0xFFFFFFFE;			// stop the timer0

	rI_ISPC = (unsigned int)BIT_TICK;	// clear interrupt pending	
	rRTCCON = (unsigned char)1;
	rTICNT = (unsigned char)0;		// Tick time interrupt disable
	rRTCCON = (unsigned char)0;
	rINTMSK |= (unsigned int)BIT_TICK;	// mask the RTC tick interrupt
}
	
__inline void Sleep(INT16U mSec)
{
	OSTimeDlyHMSM(0,0,0,(INT16U)(mSec));
}

void Isr_Init(void)
{
    U32 i;

     for(i=_RAM_STARTADDRESS;i<(_RAM_STARTADDRESS+0x20);i+=4)
    {
	*((volatile unsigned *)i)=0xEA000000+0x1FFE;
    }
}
	
void sys_init(void)
{
	rSYSCFG=CACHECFG;		// Using 8KB Cache
	ChangePllValue(PLL_M,PLL_P,PLL_S);
	globle_int_enable(0);
//       Isr_Init();      
	tick_off();
	tick_int_enable(0);	
	intcon_init();
	isrCount = 0;	
	
	// Set the function of the pins
	Port_Init();
	Uart_Init(0, 115200);
	Uart_Select(0);

	InitTimer0(1000);
	/* ---- Tell the world who we are ---------------------------------- */
	// print To UART0
	printf("\n\r            uCOS-II %d Running\n", OS_VERSION) ;
	printf("*===========================================*\n"); 
	printf("*=  梅特勒-托利多常州称重设备系统有限公司  =*\n"); 
	printf("*===========================================*\n"); 
	printf("*============== 商用衡器事业部 =============*\n"); 
 	printf("*=============  86-519-6642040  ============*\n"); 
	printf("*===           Version 2.0 2004          ===*\n"); 
	printf("*===========================================*\n"); 

	// hook the tick ISR
#ifdef  OS_USE_RTC_TICK
	pISR_TICK=(unsigned)OSTickISR;
#else
	pISR_TIMER5 = (unsigned)OSTickISR;
//	ISR_Install(IRQ_VECTOR_OFFSET, (void *)OSTickISR);
#endif
	pISR_TICK=(unsigned)RTCTick;

	globle_int_enable(1);
}

⌨️ 快捷键说明

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