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

📄 main_pre.c

📁 ucos II操作系统的源代码。程序完整
💻 C
字号:
/****************************************Copyright (c)**************************************************
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"

void  TaskStart(void *pdata);
//void  Task2(void *pdata);

#define TASK_STK_SIZE  128
#define total_bit      15
#define capture_info_len 3
#define capture_info_gene 3
OS_STK  TaskStartStk[TASK_STK_SIZE];

typedef struct {
	INT32U   irda_time[capture_info_gene];//每帧数据的间隔
	INT32U   irda_tc_time; //每位数据相对于TC的时间
	INT16U   irda_data[capture_info_gene];//一帧数据的数据码
	INT16U   bit_count;//每帧数据的位计数
	INT16U   total_frame;
	INT16U   frame_use;
	INT32U   irda_gene; 
	INT32U   irda_mark;
}irda_struct_t;
irda_struct_t  capture_info[capture_info_len];

INT16U cap;	
INT8U  tm[24],*tmp;
static OS_EVENT *IRDA_Mbox;

typedef struct sla {
	INT32U   *next;
	INT32U   *prev;
	INT32U   cnt;
}slab_t;

INT32U rece[2];

static void Timer1Exception(void);
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
********************************************************************************************************/
int main (void){
    OSInit();
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
    //OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 5);
    OSStart();
    return 0;
    
}	
/*********************************************************************************************************
** 函数名称: Task2
** 功能描述: μCOS-II的第2个任务。等待TaskUart0Revice接收一到帧数据,
**           然后将数据进行转换,再从UART0发出。
** 输 入: pdata        任务附加参数pdata = pdata; 
** 输 出: 无
********************************************************************************************************
void  Task2(void *pdata){
	INT8U *cpx;
	INT8U px;

    pdata = pdata;  
    
	while (1)    {                            
         do
    	{
    		px = 0;
    		cpx = &px;
    		UART_read(1, cpx, 1, 0);
    	} while (*cpx != 0xfa);
    	//UART_write(1, cpx, 1, 2);
    	cpx=(INT8U *)sectors[0].addr;			
        UART_write(1, cpx, iap_info.total_len, 0);
    }
}
		
/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务。等待TaskUart0Revice接收一到帧数据,
**           然后将数据进行转换,再从UART0发出。
** 输 入: pdata        任务附加参数pdata = pdata; 
** 输 出: 无
********************************************************************************************************/
void  TaskStart(void *pdata){
	INT8U err,i,*cpx;
	INT8U cmd_byte[4],*cmd;
	
	slab_t slab,*slabp;
	
	INT32U **slax,stemp;

    #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
	#endif
	   
    pdata = pdata;   
    TargetInit(); 
	
	UART_Init(0);
    UART_open(0, 19200, 8, 'n', 0); 
	UART_Init(1);
    UART_open(1, 19200, 8, 'n', 0); 
    
    slabp = &slab;
   stemp = 0xfe;
    
    slabp->next = &stemp;
    slabp->cnt = 0xff00ff00;
    slax = &slabp->next;
    *slax =rece;
    
    PINSEL1 |= 3<<10; //Pin0.21 used as cap1.3
    T1CCR   = 0X0C00;  //下降沿,中断
    T1PR    = 1459;
    T1TC    = 0;
    T1CTCR  = 0X0C;
    T1IR    = 0XFF;
    T1TCR   = 1;
    
    VICVectAddr1  = (uint32)Timer1Exception;
    VICVectCntl1  = (0x20 | 0x05);
    VICIntEnable  = 1<<5;
    
    cap = 0;
    memset(capture_info,0,sizeof(irda_struct_t)*4);
    IRDA_Mbox=OSMboxCreate(NULL);
    if (IRDA_Mbox == NULL) while(1);
    
    while (1) 
    {
    	cpx = OSMboxPend(IRDA_Mbox,0,&err);
    	//UART_write(0, cpx, 6, 3); 
    	if (cpx)
    	{  	
    		for (i=0;i<capture_info_len;i++)
    		{
    			switch(cpx[2*i+1])
    			{
    				case 0x40 : cmd_byte[i] = 0x0b; break;
    				case 0x80 : cmd_byte[i] = 0x0c; break;
    				case 0x08 : cmd_byte[i] = 0x01; break;
    				case 0x88 : cmd_byte[i] = 0x02; break;
    				case 0x48 : cmd_byte[i] = 0x03; break;
    				case 0xc8 : cmd_byte[i] = 0x04; break;
    				case 0x28 : cmd_byte[i] = 0x05; break;
    				case 0xa8 : cmd_byte[i] = 0x06; break;
    				case 0x68 : cmd_byte[i] = 0x07; break;
    				case 0xe8 : cmd_byte[i] = 0x08; break;
    				case 0x18 : cmd_byte[i] = 0x09; break;
    				case 0x98 : cmd_byte[i] = 0x00; break;
    				default   : break;
    			}
    		}
    		cmd = cmd_byte;
    		if ((*cmd == 0x0c) || (*cmd == 0x0b))
    		{
    			UART_write(0, cmd_byte, 3, 3);
    			cmd_byte[0] = 0xff;
    			cmd_byte[1] = 0xff;
    			cmd_byte[2] = 0xff;
    			cmd_byte[3] = 0xff;
    		}
    		cpx = NULL;
    	}  		
    }
} 
/*********************************************************************************************************
** 函数名称: Timer1Exception
** 功能描述: timer1中断处理程序
** 输 入: 无
** 输 出: 无
********************************************************************************************************/
static void Timer1Exception(void)
{
	irda_struct_t  *ptr;
	INT32U time1,time;
	INT8U  i;
	
	T1IR = 1<<7;
	ptr = &capture_info[cap];
	time1 = OSTimeGet();
	time = T1CR3;
	if (ptr->bit_count == 16)
	{			
		ptr->irda_mark = 0;
		ptr->bit_count = 0;
		//*tmp++ = 0xee;
		//UART_write(1, tm, 20, 13);
		if (ptr->total_frame == 2)    //3中取1
		{
			ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[1])? 1: (capture_info_len+5);
			ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[2])? 2: ptr->frame_use;
			ptr->frame_use=(ptr->irda_data[1]==ptr->irda_data[2])? 2: ptr->frame_use;
			if (ptr->frame_use > (capture_info_len-1))
			{ //误码
				ptr->total_frame = 0;
				goto err;
			}
			cap++;
		}
		else 
		{
			ptr->total_frame++; 
		}
							
		if ((cap > 0) &&((capture_info[cap].irda_time[capture_info[cap].frame_use] - \
			capture_info[cap-1].irda_time[capture_info[cap-1].total_frame - 1]) > 200*5))
		{	//判断连续2次按键时间是否超过5s,若是则忽略该组按键
			for (i=0; i<cap; i++)
			{
				capture_info[i].irda_mark = 0;
				capture_info[i].bit_count = 0;
				capture_info[i].total_frame = 0;
			}
			cap = 0;
		}			
		if (cap == capture_info_len)
		{  //按键完毕
			INT8U temp[8],*cp;
			INT16U tem;						
			capture_info[0].irda_gene = capture_info[capture_info_len-1].irda_gene;
			cp = (INT8U *)rece;
			for (i=0;i<capture_info_len;i++)
			{
				tem = capture_info[i].irda_data[ptr->frame_use];
				*cp++ = (tem & 0xff00) >> 8;
				*cp++ = tem & 0x00ff;
				capture_info[i].irda_mark = 0;
				capture_info[i].bit_count = 0;
				capture_info[i].total_frame = 0;
			}
			cap = 0;
			OSMboxPost(IRDA_Mbox,(void *)rece);	
			goto err;		
			}						
	}		
	if (!ptr->irda_mark)
	{
		if (ptr->total_frame == 0)
		{
			ptr->irda_data[0] = 0;
			ptr->irda_data[1] = 0;
			ptr->irda_data[2] = 0;
		}
		if ((cap==0) && (ptr->total_frame==0) && (time1-ptr->irda_gene < 600))
		{
			goto err;
		}
		ptr->irda_gene = time1;
		if ((ptr->total_frame>0) && (ptr->total_frame<capture_info_gene) \
			&&((ptr->irda_gene - ptr->irda_time[ptr->total_frame-1]) > 40))
		{	//误触发
			ptr->total_frame = 0;
			goto err;
		}
		if ((cap > 0)&&((ptr->irda_gene - capture_info[cap-1].irda_gene) < 80))   
		{	//判断按键间隔
			ptr->total_frame = 0;
			capture_info[cap-1].irda_gene = ptr->irda_gene;
			goto err; 
		}
		ptr->irda_tc_time = time;
		ptr->irda_mark = 1;
		ptr->irda_time[ptr->total_frame] = ptr->irda_gene;
		
		//tmp = tm;
		//*tmp++ = 0xff;		
	}
	else  
	{
		INT8U x;
		time1 = time;
		x = time - ptr->irda_tc_time;
		ptr->irda_tc_time = time1;
		if ((x < 100)&&(x > 85)) 
		{
			ptr->irda_mark |= 1<<1;
			//*tmp++ = x;
		}
		else if((x < 44)&&(x> 24))
		{
			ptr->irda_mark |= 1<<2;
			if (ptr->bit_count != 8)    ptr->bit_count=8;
			//*tmp++ = x;
		}
		else if((x < 20)&&(x > 14))
		{
			ptr->irda_data[ptr->total_frame] |= 1 << (total_bit-ptr->bit_count);
			ptr->bit_count++;
			//*tmp++ = x;
		}
		else if ((x < 11) && (x>4))
		{
			ptr->bit_count++;
			//*tmp++ = x;
		}
	}
	err :
		VICVectAddr=0x00;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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