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

📄 main.c

📁 μC/OS-II实验程序说明 软件版本:V1.0 日期:2005-05-25 多任务是指多个任务在操作系统的控制下同时运行
💻 C
字号:
/****************************************************************************
		Copyright (c) 深圳市民德电子科技有限公司  http://www.szminde.cn

  文件名称:MAIN.c
  版本号:	1.0
  日期:	2005-05-25
  说明:	此文件包含主函数和操作系统的任务处理。
  调用列表:Port_Init.c
			sys_UART.c
			sys_IO.c
			OS_CORE.c
			OS_CPU_A.s
			OS_TIME.c
  修改历史:--
****************************************************************************/

#include "def.h"
#include "44b.h"
#include "option.h"
#include "port_init.h"
#include "sys_io.h"
#include "sys_uart.h"
#include "includes.h"               // uC/OS接口

#define	STACKSIZE	256
OS_STK Stack1[STACKSIZE];
OS_STK Stack2[STACKSIZE];

extern void UCOS_IRQHandler(void);
U32	SERIAL_BAUD = 115200;
static int DelayLoopCount=0x190;

/****************************************************************************
  函数名称:Timer5Interrupt()
  说明:	Timer5的中断响应函数,在这里用作了OS的时钟服务
  调用函数:OSTimeTick()
  输入参数:无
  输出参数:无
****************************************************************************/
static void Timer5Interrupt()
{
    rI_ISPC=BIT_TIMER5;                  
    OSTimeTick();
}


/****************************************************************************
  函数名称:C_IRQHandler()
  说明:	中断处理函数,找出中断源,调用相应的服务函数
  调用函数:无
  输入参数:无
  输出参数:无
****************************************************************************/
void C_IRQHandler(void)
{
        U32 temp,i;
        temp=rI_ISPR;
        if(temp==0) return;
        for(i=0;i<26;i++){
        	if(temp&0x1==1){
        		break;
        	}
        	else{
        		temp=temp>>1;
        	}
        }
		if(i==26){
        	return;
        }
        temp=i<<2;
        ((void(*)(void))(*((U32 *)(_ISR_STARTADDRESS+0x20+temp))))();
}


/****************************************************************************
  函数名称:OSTimeInit()
  说明:	Timer的初始化,使用了Timer5
  调用函数:无
  输入参数:TicksPerSec OS每秒的计数值
  输出参数:无
****************************************************************************/
void OSTimeInit(U32 TicksPerSec)
{
	#if OS_CRITICAL_METHOD == 3
		OS_CPU_SR  cpu_sr;
	#endif

    OS_ENTER_CRITICAL();

	rTCFG0=0x00fa0000;	// prescaler2 = 250
	rTCFG1=0x00200000;	// 所有中断, mux5=1/8
	
	rTCNTB5=(U16)(MCLK/2000/TicksPerSec);

	rTCON=0x02000000;	// 更新T5
	rTCON=0x05000000;	// T5=自动载入,开始
	
	rINTMSK&=~(BIT_GLOBAL|BIT_TIMER5);	// 启动时钟中断
	pISR_TIMER5 = (U32)Timer5Interrupt;
	rI_ISPC=BIT_TIMER5;
    OS_EXIT_CRITICAL();
}


/****************************************************************************
  函数名称:Task1()
  说明:	任务1,使LED1和LED2循环交替亮灭
  调用函数:LED_Display()
  			OSTimeDly()
  输入参数:*Id 任务ID
  输出参数:无
****************************************************************************/
void Task1(void *Id)
{
    for (;;)
    {
        LED_Display(1);
        UART_Printf("\nLED 1 on ...\n");
		OSTimeDly(100);
		LED_Display(2);
        UART_Printf("\nLED 2 on ...\n");
		OSTimeDly(125);
        
    }
}


/****************************************************************************
  函数名称:Task2()
  说明:	任务2,使LED3和LED4循环交替亮灭
  调用函数:LED_Display()
  			OSTimeDly()
  			OSTimeInit()
  输入参数:*Id 任务ID
  输出参数:无
****************************************************************************/
void Task2(void *Id)
{
	OSTimeInit(OS_TICKS_PER_SEC);
	
    for (;;)
    {
		LED_Display(3);
        UART_Printf("\nLED 3 on ...\n");
		OSTimeDly(300);
		LED_Display(4);
        UART_Printf("\nLED 4 on ...\n");
		OSTimeDly(200);
    }
}


/****************************************************************************
  函数名称:IRQInit()
  说明:	中断的初始化,所有的中断都由OS处理
  调用函数:无
  输入参数:无
  输出参数:无
****************************************************************************/
void IRQInit(void)
{
	rINTCON = 0x5;		// 非向量模式,使能IRQ,禁止FIQ
	rINTMOD = 0x0;		// 所有中断为IRQ模式
	
	pISR_IRQ = (U32)UCOS_IRQHandler;
	
	rINTMSK  = 0x07ffffff;	
}

/****************************************************************************
  函数名称:Delay()
  说明:	延时函数。
  调用函数:无
  输入参数:time 要延时的时间,为1时约延时0.1ms,为0时为校正延时时间
  输出参数:无
****************************************************************************/
void Delay(int time)
{
    int i,adjust=0;

    if(time==0)
    {
		time=200;
		adjust=1;
		DelayLoopCount=400;
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);  
		rWTDAT=0xffff;
		rWTCNT=0xffff; 
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
    }

    for(;time>0;time--)

	for(i=0;i<DelayLoopCount;i++);

    if(adjust==1)
    {
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
		i=0xffff-rWTCNT;		
		DelayLoopCount=8000000/(i*64);   
    }
}

/****************************************************************************
  函数名称:Main()
  说明:	主函数,调用各初始化函数,然后开始OS的运行
  调用函数:Port_Init()
  			UART_Init()
  			UART_SendByte()
  			UART_SendString()
  			UART_Printf()
  			LED7A_Off()
  			LED7B_Off()
  			Delay()
  			IRQInit()
  			OSInit()
  			OSTaskCreate()
  			OSStart()
  输入参数:无
  输出参数:返回整型值,但一般运行不到返回值的地方
****************************************************************************/
int Main(void)
{
	char Id1 = '1';
    char Id2 = '2';
    
	Port_Init();
	UART_Init(0,SERIAL_BAUD);	
	IRQInit();		
	
	UART_SendByte('\n');
	UART_Printf("/************************************/\n");	
	UART_Printf("   uC/OS-II for S3C44B0X\n");	
	UART_Printf("   Serial Baud rate is %d\n", SERIAL_BAUD);
	UART_Printf("   System Initialization successful.\n");		
	UART_Printf("/************************************/\n");	
	
	LED7A_Off();
	LED7B_Off();
	Delay(2000);
	OSInit();
	
	OSTaskCreate(Task1, (void *)&Id2, Stack1+STACKSIZE, 9);
	OSTaskCreate(Task2, (void *)&Id1, Stack2+STACKSIZE, 8);
    OSStart();

    return 0;
}


⌨️ 快捷键说明

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