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

📄 main.c

📁 UCOS操作系统在C8051F上移植程序代码
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: main.c
* 文件标识: none
* 适用器件: c8051f020
* 
* 摘 要: 本文件是ucos-ii test 程序;
* 
* 当前版本:1.0
* 作 者:李林利
* 完成日期:2004年12月12日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件
#include 	"..\config\common.h"
#include 	"..\driver\driver.h"
#include 	"os.h"
#include 	"..\ucos-ii\ucos_ii.h"
/************************************************************************************/
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
sbit  A_LED = P3^1;
sbit  B_LED = P3^2;
sbit  C_LED = P3^3;

unsigned char code  ASCII[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,\
								 0x41,0x42,0x43,0x44,0x45,0x46};
/************************************************************************************/
#define  A_TASK_PRIO		1
#define  B_TASK_PRIO		2
#define  C_TASK_PRIO		3
#define  START_TASK_PRIO	4


void Task_A(void *yydata); //reentrant;
void Task_B(void *yydata); //reentrant;
void Task_C(void *yydata); //reentrant;

void TaskStart (void *ddata);// reentrant;


void display_num(unsigned char type,unsigned char bits,unsigned long value);


OS_STK TaskStartStk_A[MaxStkSize];//注意:我在ASM文件中设置?STACK空间为40H即64。
OS_STK TaskStartStk_B[MaxStkSize];
OS_STK TaskStartStk_C[MaxStkSize];

OS_STK TaskStartStk[MaxStkSize];

signed long buf[256];
signed long bufb[256];
/************************************************************************************
//  系统初始化功能子程序
*************************************************************************************/

/***********************************************************************************
* 函数名称:SYSCLK_Init;
*
* 函数功能描述:系统时钟初始化,使用外部22.1184MHz晶振作为时钟源;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void SYSCLK_Init (void)
{
   int i;                              // 延时计数器

   OSCXCN = 0x67;                      // 使用外部22.1184MHz晶振

   for(i=0; i<256; i++);               // 等待1ms

   while(!(OSCXCN & 0x80));            // 等待外部振荡器稳定

   OSCICN = 0x88;                      // 切换到外部晶振
}

/***********************************************************************************
* 函数名称:PORT_Init;
*
* 函数功能描述:配置端口初始化,配置交叉开关和端口;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void PORT_Init (void)
{
	XBR0 	= 0x1F;         //设置XBR0
	XBR1 	= 0x1E;         //设置XBR1
	XBR2 	= 0x44;         //打开交叉开关和弱上拉   
	P0MDOUT = 0x15;			//设置P0口输出
	P0	   |= 0xEA;			//P0口的输入脚高阻态
	P1MDIN  = 0x00;			//设置P1口输入信号类型
	P1MDOUT = 0x00;			//设置P1口输出
	P1		= 0xFF;			//P1口高阻态
	P2MDOUT = 0x01;			//设置P2口输出
    P2 	   |= 0xFE;			//设置P2口输出
	P3MDOUT = 0xFE;			//设置P3口输出
	P3	   |= 0x01;			//设置P3口输出
	P3 	   &= 0xEF;			//P3.4口置0,禁铃

    P74OUT  = 0xF7;			//设置P4-P7口输出
    P5	   |= 0xF0;			//键盘输入P5口高4位高阻态
    //EMI0CF	= 0x2D;			//外部存储器接口配置
    //EMI0TC	= 0x9E;			//外部存储器时序控制
}

void display_num(unsigned char type,unsigned char bits,unsigned long value)
{
	unsigned char i;
	unsigned short k;

	if (type==0)
	{
		Uart0_SendByte('0');
		Uart0_SendByte('x');

		if (bits==8)
		{
			i = value&0x000000ff;

			Uart0_SendByte(ASCII[i>>4]);
			Uart0_SendByte(ASCII[i&0x0f]);
		}
		else if (bits==16)
		{
			k = value&0x0000ffff;

			Uart0_SendByte(ASCII[k>>12]);
			Uart0_SendByte(ASCII[(k>>8)&0x0f]);
			Uart0_SendByte(ASCII[(k>>4)&0x0f]);
			Uart0_SendByte(ASCII[k&0x0f]);
		}

		else if (bits==32)
		{
			k = (value>>16)&0x0000ffff;

			Uart0_SendByte(ASCII[k>>12]);
			Uart0_SendByte(ASCII[(k>>8)&0x0f]);
			Uart0_SendByte(ASCII[(k>>4)&0x0f]);
			Uart0_SendByte(ASCII[k&0x0f]);

			k = value&0x0000ffff;
			Uart0_SendByte(ASCII[k>>12]);
			Uart0_SendByte(ASCII[(k>>8)&0x0f]);
			Uart0_SendByte(ASCII[(k>>4)&0x0f]);
			Uart0_SendByte(ASCII[k&0x0f]);

		}

	}
	if (type==1)
	{
		if (bits==8)
		{
			i = value&0x000000ff;

			Uart0_SendByte(ASCII[i/100]);
			Uart0_SendByte(ASCII[(i%100)/10]);
			Uart0_SendByte(ASCII[i%10]);
		}
		else if (bits==16)
		{
			k = value&0x000000ff;

			Uart0_SendByte(ASCII[k/10000]);
			Uart0_SendByte(ASCII[(k%10000)/1000]);
			Uart0_SendByte(ASCII[(k%1000)/100]);
			Uart0_SendByte(ASCII[(k%100)/10]);
			Uart0_SendByte(ASCII[i%10]);


		}

	
	}


}

void main(void)
{
    
	 WDTCN = 0xde;                       // disable watchdog timer
     WDTCN = 0xad;

     SYSCLK_Init();                     // initialize oscillator
     PORT_Init();                       // initialize crossbar and GPIO
	 
	//LCDC_Init();
	//LCDC_DisFull(Clr);
	//dis_start0();
	
	Uart0_Init(115200);
	Uart0_SendString("*******************************************************************************\n");
	Uart0_SendString("* 	Copyright (c) 2004,西安铭朗电子科技有限责任公司\n");
	Uart0_SendString("*		All rights reserved.   \n");
	Uart0_SendString("*		   \n");
	Uart0_SendString("*		web:www,mlarm.com\n");
	Uart0_SendString("*		UCOS-II Test program.\n");
	Uart0_SendString("*		Write By: Gavin Li\n");
	Uart0_SendString("********************************************************************************\n");
	

	OSInit();    
    InitTimer0(SYSCLK);      
	OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[0], START_TASK_PRIO);
    
    OSStart();
}


void TaskStart (void *ddata) //reentrant
{
    ddata = ddata;                                        /* Prevent compiler warning                 */

    OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

    OSTaskCreate(Task_A, (void *)0, &TaskStartStk_A[0],A_TASK_PRIO);
    OSTaskCreate(Task_B, (void *)0, &TaskStartStk_B[0],B_TASK_PRIO);
    OSTaskCreate(Task_C, (void *)0, &TaskStartStk_C[0],C_TASK_PRIO);

    for (;;) 
	{
        Uart0_SendString("Tasks  =");		
		display_num(1,8,OSTaskCtr);
		Uart0_SendString("\r\n");

		Uart0_SendString("CPU Usage =");		
		display_num(1,8,OSCPUUsage);
		Uart0_SendString("%\r\n");

		Uart0_SendString("Task switch/sec =");		
		display_num(1,8,OSCtxSwCtr);
		Uart0_SendString("\r\n");

		OSCtxSwCtr = 0;
        OSTimeDly(OS_TICKS_PER_SEC);                         /* Wait one second                          */
    }
}







void Task_A(void *yydata) //reentrant
{
    unsigned char i;


	for (i=0;i<255;i++)
			buf[i] = i*1000;

	yydata=yydata;
     
    for(;;){
        Uart0_SendString("Task_A is active.\n");
		A_LED = ~A_LED;
		for (i=0;i<255;i++)
			buf[i] = buf[i]*buf[i];

	    OSTimeDly(OS_TICKS_PER_SEC/2);    
    }    
}

void Task_B(void *yydata) //reentrant
{
    
	unsigned char i;
	for (i=0;i<255;i++)
			bufb[i] = i*1000;

	yydata=yydata; 
    
    for(;;){
        Uart0_SendString("Task_B is active.\n");
		B_LED = ~B_LED;
		for (i=0;i<255;i++)
			bufb[i] = bufb[i]*bufb[i];
        OSTimeDly(OS_TICKS_PER_SEC);    
    }    
}

void Task_C(void *yydata) //reentrant
{
    signed long bufc[150];
	unsigned char i;
	for (i=0;i<150;i++)
			bufc[i] = i*1000;

	yydata=yydata; 
    
    for(;;){
        Uart0_SendString("Task_C is active.\n");
		C_LED = ~C_LED;
		for (i=0;i<150;i++)
			bufc[i] = bufc[i]*bufc[i];
        OSTimeDly(2*OS_TICKS_PER_SEC);    
    }    
}

⌨️ 快捷键说明

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