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

📄 main_entry.c

📁 ucos在9200上的移植
💻 C
字号:
/***********************************************************************/
#include "ucos_ii.h"

#include "AT91RM9200.h"
#include "lcd.h"
/***********************************************************************/

#define	N_TASKS			3	        // Number of tasks
#define	TASK_STK_SIZE	1024		// Stack size, in sizeof OS_STK, or int 32bit
#define LCD_ACCESS_BASE (int *)0x40000000  //nGS3

OS_STK	TaskStk[N_TASKS][TASK_STK_SIZE];	// Tasks stacks

char key_matrix[4][5]=
					  {
						{'a','+','1','2','3'},
						{'b','-','4','5','6'},
						{'c','*','7','8','9'},
						{'=','/','(',')','0'}
					  };

OS_EVENT *mybox;
/***********************************************************************/
extern void 		Enable_CPU_Inter(void);
extern void 		OSTickISR(void);
extern void 		AT91F_DBGU_Printk(char *buffer);
extern unsigned int AT91F_AIC_ConfigureIt(AT91PS_AIC pAic,unsigned int irq_id,     
       										unsigned int priority,unsigned int src_type,void (*newHandler) (void) ); 
extern void 		AT91F_AIC_EnableIt(AT91PS_AIC pAic, unsigned int irq_id ); 
extern unsigned int AT91F_PIO_GetInput(AT91PS_PIO pPio);
extern void  		AT91F_PIO_CfgInput(AT91PS_PIO pPio,unsigned int inputEnable);
extern void 		AT91F_PIO_CfgInputFilter(AT91PS_PIO pPio,unsigned int inputFilter);
extern void			AT91F_PIO_InterruptDisable(AT91PS_PIO pPio,unsigned int flag);
extern void			AT91F_PIO_CfgPullup(AT91PS_PIO pPio,unsigned int pullupEnable);
extern void			AT91F_PIO_CfgOutput(AT91PS_PIO pPio,unsigned int pioEnable);
extern void			AT91F_PIO_SetOutput(AT91PS_PIO pPio,unsigned int flag);
extern void			AT91F_PIO_ClearOutput(AT91PS_PIO pPio,unsigned int flag);

/*
extern void 		Clear_Display(int* base_address);
extern void 		Set_Command_Mode(AT91PS_PIO pPio ,int position);
extern void 		Set_Write_Mode(AT91PS_PIO pPio, int position);
extern void 		Set_Display_Row(int* base_address, AT91PS_PIO pPio ,int position ,int row);
extern void 		Config_LCD(int* base_address, int set_entry_mode, int set_display, 
								int set_function, int position, AT91PS_PIO pPio, int row);
extern void 		Write_To_LCD(int* base_address, char written);
extern void 		Configure_LCD(AT91PS_PIO pPio ,int position);
*/
//extern int 			key_matrix_scan(int para);

void TC1_Enable(void);
void timer1_c_irq_handler(void);

/**************************************************************************/
void Task1(void * pParam)
{
	int i;
	unsigned char err;
	void *msg;
	
	TC1_Enable();
	for(i=0;i<500;i++);
	
	Config_LCD(LCD_ACCESS_BASE,0x06,0x0f,0x3c,14,AT91C_BASE_PIOC,0x80);
	
	AT91F_DBGU_Printk("   Task 1 running! configure and scan\n\r");

	i=0;
	
	while(1)	
	{
     if(i==16) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0xc0); 
     if(i==32) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0x90);
     if(i==48) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0xd0);

	 msg =OSMboxPend(mybox,0,&err);
     Write_To_LCD(LCD_ACCESS_BASE, *(char *)msg);
     
     i++;
     if(*(char *)msg == 'a') i=65;    
     
     if(i==65) 
     {
     i=0;
     Set_Command_Mode(AT91C_BASE_PIOC,14);
     Clear_Display(LCD_ACCESS_BASE);
	 Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0x80);
     }
     
     //OSTimeDly(1);
	}

}


/**************************************************************************/

void Task2(void * pParam)
{   
   unsigned int i,key_down=5,Input_Value,ispress=0,new_input_value;
	
	TC1_Enable();
	
	for(i=0;i<500;i++);
	
	AT91F_DBGU_Printk("   Task 1 running! configure and scan\n\r");
	
	while(1)	
	{   
        Input_Value =(AT91F_PIO_GetInput(AT91C_BASE_PIOB)>>3) & 0x0f;
        
        AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,0x1f<<7);
        
        if((Input_Value != 0x0f) && (ispress == 0))
        {
        ispress=1;
        
        new_input_value =(AT91F_PIO_GetInput(AT91C_BASE_PIOB)>>3) & 0x0f;
        switch(new_input_value)
        	{
       		 case 0x0e: AT91F_DBGU_Printk("a key down 3");
        	  		    key_down=key_matrix_scan(0x0e);
        	  		    new_input_value=3;
        		   		break;
        	 case 0x0d: AT91F_DBGU_Printk("a key down 2");
        		   		key_down=key_matrix_scan(0x0d);
        		   		new_input_value=2;
        		   		break;
        	 case 0x0b: AT91F_DBGU_Printk("a key down 1");
        		   		key_down=key_matrix_scan(0x0b);
        		   		new_input_value=1;
        		   		break;
        	 case 0x07: AT91F_DBGU_Printk("a key down 0");
        		   		key_down=key_matrix_scan(0x07);
        		   		new_input_value=0;
        		   		break;
        	 case 0x0f: key_down=5;
        		   		break;
        	 default  : break;
        	 }
        }
        
        if((ispress == 1) && (Input_Value == 0x0f))
        {
        ispress=0;
        
        //adding keys service routine, for example:
        if(key_down==0)  AT91F_DBGU_Printk("  0  =");
        if(key_down==1)  AT91F_DBGU_Printk("  1  =");
        if(key_down==2)  AT91F_DBGU_Printk("  2  =");
        if(key_down==3)  AT91F_DBGU_Printk("  3  =");
        if(key_down==4)  AT91F_DBGU_Printk("  4  =");
        if(key_matrix[new_input_value][key_down]=='a')
        AT91F_DBGU_Printk("a\n\r");
        if(key_matrix[new_input_value][key_down]=='b')
        AT91F_DBGU_Printk("b\n\r");
        if(key_matrix[new_input_value][key_down]=='c')
        AT91F_DBGU_Printk("c\n\r");
        if(key_matrix[new_input_value][key_down]=='=')
        AT91F_DBGU_Printk("=\n\r");
        if(key_matrix[new_input_value][key_down]=='1')
        AT91F_DBGU_Printk("1\n\r");
        if(key_matrix[new_input_value][key_down]=='2')
        AT91F_DBGU_Printk("2\n\r");
        if(key_matrix[new_input_value][key_down]=='3')
        AT91F_DBGU_Printk("3\n\r");
        if(key_matrix[new_input_value][key_down]=='4')
        AT91F_DBGU_Printk("4\n\r");
        if(key_matrix[new_input_value][key_down]=='5')
        AT91F_DBGU_Printk("5\n\r");
        if(key_matrix[new_input_value][key_down]=='6')
        AT91F_DBGU_Printk("6\n\r");
        if(key_matrix[new_input_value][key_down]=='7')
        AT91F_DBGU_Printk("7\n\r");
        if(key_matrix[new_input_value][key_down]=='8')
        AT91F_DBGU_Printk("8\n\r");
        if(key_matrix[new_input_value][key_down]=='9')
        AT91F_DBGU_Printk("9\n\r");
        if(key_matrix[new_input_value][key_down]=='0')
        AT91F_DBGU_Printk("0\n\r");
        if(key_matrix[new_input_value][key_down]=='+')
        AT91F_DBGU_Printk("+\n\r");
        if(key_matrix[new_input_value][key_down]=='-')
        AT91F_DBGU_Printk("-\n\r");
        if(key_matrix[new_input_value][key_down]=='*')
        AT91F_DBGU_Printk("*\n\r");
        if(key_matrix[new_input_value][key_down]=='/')
        AT91F_DBGU_Printk("/\n\r");
         if(key_matrix[new_input_value][key_down]=='(')
        AT91F_DBGU_Printk("(\n\r");
         if(key_matrix[new_input_value][key_down]==')')
        AT91F_DBGU_Printk(")\n\r");
        
        OSMboxPost(mybox,(void *)&key_matrix[new_input_value][key_down]);
        }
        
        OSTimeDly(1);
	}

}
/**************************************************************************/
void Task3(void * pParam)
{   
	AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ0);
    while(1)
    {   
       AT91F_DBGU_Printk("   Task 3 running!\n\r");
	   OSTimeDly(20);
	}
}
/**************************************************************************/

void  BSP_InitIntCtrl (void)
{
    *AT91C_AIC_IDCR = 0xFFFFFFFF;                                 /* Disable ALL interrupts                              */

                                                             /* 0xE51FFF20L is opcode of (ldr pc,[pc,#-0xf20])      */
    *(volatile unsigned int *)0x00000018 = 0xE51FFF20;       /* IRQ exception vector - install redirection to AIC   */
}

/**************************************************************************/
void extern C_Entry(void)
{
	
	int	task_1 = 0;
	int	task_2 = 1;
	int task_3 = 2;

	
	AT91F_DBGU_Printk("start kernel ok!\n\r" );
	
	/* enable peripheral clock */
    *AT91C_PMC_PCER  |= 1 << AT91C_ID_TC1;  
    *AT91C_AIC_IDCR = 0xffffffff;
    
    /* 若需编译成二进制文件,请注释掉下面两行 */
    //*AT91C_MC_RCR = 1;                               
    //BSP_InitIntCtrl();
    
    OSInit();
    
    /* install TC1 interrupt handler */
    AT91F_AIC_ConfigureIt (
							AT91C_BASE_AIC,                        // AIC base address
							AT91C_ID_TC1,                          // System peripheral ID
							0x6,                                   // Priority
							AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,   // Level sensitive
							OSTickISR);	
	
	//configure PIO for keyboard
	Configure_Key();				
	
	//configure PIO for LCD
    Configure_LCD(AT91C_BASE_PIOC, 14);
    
    mybox =OSMboxCreate((void *)0);
    
	OSTaskCreate(Task1, &task_1, &TaskStk[0][TASK_STK_SIZE-1], 0);
	OSTaskCreate(Task2, &task_2, &TaskStk[1][TASK_STK_SIZE-1], 1);
	OSTaskCreate(Task3, &task_3, &TaskStk[2][TASK_STK_SIZE-1], 2);

	
	OSStart();
}
	



void TC1_Enable (void)
{
    unsigned int dummy;
    
    *AT91C_TC1_CCR=AT91C_TC_CLKDIS;                                 /*Disable the Clock Counter*/ 
    *AT91C_TC1_IDR=0xFFFFFFFF;
    dummy=*AT91C_TC1_SR;
    *AT91C_TC1_CMR=AT91C_TC_TIMER_DIV4_CLOCK|AT91C_TC_CPCTRG;       /*SLOW CLOCK*/
    *AT91C_TC1_CCR=AT91C_TC_CLKEN;                                  /*Enable the Clock Counter*/
    *AT91C_TC1_IER=AT91C_TC_CPCS;                                   /*Validate the RC compare interrupt*/
    *AT91C_TC1_RC=0xb71a;                                           /*Timer tick=10Hz*/
    *AT91C_TC1_CCR=AT91C_TC_SWTRG;
	
	/* Enable TC1 interrupt  */   
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC1);
   
}

void timer1_c_irq_handler(void)

{
     unsigned int dummy;
       
     *AT91C_AIC_ICCR=(1<<AT91C_ID_TC1);                      /*Clear the TC1 interrupt*/
     Enable_CPU_Inter();
     //AT91F_DBGU_Printk("This is the  time interrupt\n\r");
     dummy=*AT91C_TC1_SR;                                    /*Read TC1 Status Register to clear it */
     
     OSTimeTick();  
     
 }
    



⌨️ 快捷键说明

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