main.c

来自「freesacle的实时操作系统UCOS的开发程序」· C语言 代码 · 共 484 行

C
484
字号
/*---------------------------------------------------------------------------
*
* 文件名:
*
* *说明:
*       (1)在允许中断嵌套的情况下,把中断的分开上下两部分处理..下部分主要是
*       以任务的形式..但可能消耗RAM的资源.定义各对应的中断服务任务**ISRTask()..
*       (2)不允许中断嵌套的情况下,中断的ISR尽量少处理一些动作.同时系统的
*           的时钟频率要小一些较好...
*       
* 以下在允许中断嵌套的情况下的..
*
*
*------------------------------------------------------------------------------
*/

#include <mc9s12dg128.h>     
#include "Includes.h"
#include "ATD.h"
#include "PWM.h"
#include "Uart.h"
#include "Timers.h"
#include "display.h"
#include "main.h"
#include "ctrl.h"
#include "lcd.h"


#define BUSCLK     24000000      
#define PREDIV  	 8   
#define SYSCNTVAL	 BUSCLK/(OS_TICKS_PER_SEC*PREDIV) //系统时钟定时器的计数值


#define	 up_key 10
#define	 esc_key 11
#define	 left_key 12
#define	 right_key 13
#define	 down_key 14
#define	 yes_key 15
    ////time                  +

 unsigned char counter0,c_counter1,c_counter2;		// MCCNT
 unsigned  int c_time1,c_time2;
 unsigned		long tm;
 int counter_r;
 
    ////time                  -

    ////speed                  +

extern   unsigned char key;
 unsigned  int v1,v2;
 unsigned char sp_a; 
 extern unsigned  char spd_lock,open_lock;
 extern unsigned  int sp_d;
 extern unsigned char read_key(void);
 extern unsigned char key;
 int	 f_a;
 extern unsigned int speed_max,speed_min,speed_turn;
 extern unsigned char base_duty;
 extern unsigned int duty_test ;
 
 unsigned int mu[4];
 
    
 
 unsigned char menu_num,next;
 
    ////speed                 -

 extern  int ssrl,ssr,ssl;
 extern char js,zj;

//unsigned int time; 

unsigned char b_rgz;

float time_temp;

extern unsigned int duty_test ;
extern  float d_old,srl;
extern void kb_test(void) ;
extern void rgz(void);
extern unsigned  char gate_ch;
//extern unsigned  int data_p;
void main(void) {
unsigned char i;
        OSInit();
        OSTaskCreate(StartTask,(void *)0, &StartTask_StkSize[OS_TASK_SIZE*4-1],START_TASK_PRIO);

        b_rgz=0;
        speed=0;
        d_old=0;
        duty_test=0;
        led_re_test();
        gate_ch=1;
        srl=0;
        spd_lock=0;
        //data_p=0; 
        counter0=0;
        LCD_Init();
        for(i=0;i<64;i++)
           lcd_dsp_buff[i]=' ';
           
        update_lcd_display();   
        sp_a=1;
        ssr=0;
        ssl=0;
        ssrl=0;
        js=0;
        zj=0;
        speed_max=250;
        speed_min=150;
        speed_turn=170;
        base_duty=40;
        mu[0]=250;
        mu[1]=150;
        mu[2]=170;
        mu[3]=40;
        menu_num=0;
				key=0;
				next=0;
        open_lock=17;
        sp_d=0;
        PWM1outPut(300,50);
      	OSStart();
  
}
/*-----------------------------------------------------------------------
* 开始任务:
*	   建立其它任务和任务的通信方式;打开系统的时钟,以及所有的中断,,
*
*/
 void StartTask(void *Id )
{
        Id=Id;
        display(0);
        PORTB = 0xf0;  	
	      OSTaskCreate(OSTick,(void *)0,&OSTick_StkSize[OS_TASK_SIZE*5-1],OSTICK_PRIO);	
	      OSTaskCreate(Task1,(void *)0, &Task1_StkSize[OS_TASK_SIZE*6-1],TASK1_PRIO);
	      OSTaskCreate(Task2,(void *)0, &Task2_StkSize[OS_TASK_SIZE*5-1],TASK2_PRIO);
	      OSTaskCreate(Task3,(void *)0, &Task3_StkSize[OS_TASK_SIZE*5-1],TASK3_PRIO);
				OSTaskCreate(Task4,(void *)0, &Task4_StkSize[OS_TASK_SIZE*5-1],TASK4_PRIO);
				
        Mbox_tick=OSMboxCreate(0);
	      Sem1=OSSemCreate(0);
        SystemCLK();        //打开系统时钟及打开中断...
        asm{
                cli				  //注:之前中断的总是关闭的.. 
        }
	      OSTaskDel(OS_PRIO_SELF);	
}


/*-----------------------------------------------------------------------
* 任务1
*
*
*
*/
 void Task1(void *pdata)
{
        INT8U *err;
        long int temp;
        
        OS_CPU_SR  cpu_sr;
        pdata = pdata;
        
        for(;;){  
   
               sp_d++;
               if(sp_d>300)
                  sp_d=300;  
               
               speed=Speed();
               	   rgz();
               if(next==3)
                {
                  speed_ctrl();
                  //uart_putchar('3');  
                }
               else	 
               {
                speed_ctrl_next_1();
                //uart_putchar('0');
               }
               
               
               
              OSSemPend(Sem1,0,err); 
        }
}

/*-----------------------------------------------------------------------
*任务 2
*
*
*
*/
 void Task2(void *pdata)
{
        //INT8U *err;
        OS_CPU_SR  cpu_sr;
        //pdata = pdata;
        unsigned char key_buff;
       
        pdata = pdata;
        for(;;)
          {
            key_buff=read_key();
            OSTimeDly(1);
            if(key_buff==read_key())
              {
                 if(key_buff!=0xff)
                  { ////////////////////////////////////////////
                  //key=key_buff;
                  key=2;
                   switch(key_buff)
                    {
                      case up_key:
                           menu_num--;
                           if(menu_num>3)
                              menu_num=3;
                            break;
                            
                      case down_key:
                           menu_num++;
                           if(menu_num>3)
                              menu_num=0;
                            break;
                                  
                      case right_key:
                      			 if(next!=0)
                      			  {
                        			  next=0;
                        			  speed_max=250;
                                speed_min=150;
                                speed_turn=170;
                                base_duty=40;
                                mu[0]=250;
                                mu[1]=150;
                                mu[2]=170;
                                mu[3]=40; 
                      			  }
                    
                            
                            break;      
                            
                      case left_key:
                      
                      			if(next!=1)
                      			  {
                        			  next=1;
                        			  speed_max=250;
                                speed_min=150;
                                speed_turn=150;
                                base_duty=40;
                                mu[0]=250;
                                mu[1]=150;
                                mu[2]=150;
                                mu[3]=40; 
                      			  }
                      		
                            break;
                      case esc_key:
                            if(next!=3)
                            	 {
                        			  next=3;
                        			  speed_max=230;
                                speed_min=160;
                                speed_turn=170;
                                base_duty=45;
                                mu[0]=230;
                                mu[1]=160;
                                mu[2]=170;
                                mu[3]=45; 
                      			  }
                            break;
                      
                      case yes_key:
                      			if(next!=4)
                            	 {
                        			  next=4;
                        			  speed_max=260;
                                speed_min=160;
                                speed_turn=170;
                                base_duty=40;
                                mu[0]=260;
                                mu[1]=160;
                                mu[2]=170;
                                mu[3]=40; 
                      			  }
                            speed_max=mu[0];
                            speed_min=mu[1];
                            speed_turn=mu[2];
                            base_duty=(unsigned char)mu[3];
                            break;
                      default :
                            key_buff++;
                            if(key_buff==10)
                               key_buff=0;
                            
                           // uart_putchar(key_buff+0x30);
                            mu[menu_num]=mu[menu_num]*10+key_buff;
                            if(mu[menu_num]>500)
                                 mu[menu_num]=key_buff;
                            speed_max=mu[0];
                            speed_min=mu[1];
                            speed_turn=mu[2];
                            base_duty=(unsigned char)mu[3];
                            key_buff--;
                            if(key_buff>10)
                               key_buff=9;
                            break;
                      
                      
                    }
                  
                  ////////////////////////////////////////////////
                   while(key_buff==read_key()) 
                    {
                        OSTimeDly(5);
                    }
                  }
              }
          } //for   -
}

/*-----------------------------------------------------------------------
*任务3
*
*
*
*/
 void Task3(void *pdata)
{
       //INT8U *err;
        pdata = pdata;
        for(;;){
                open_lock++;
                if(open_lock>110)
                   open_lock=110;
                
                spd_lock++;
                if(spd_lock>110)
                   spd_lock=110;
                OSTimeDly(40);
        }       
}
/*-----------------------------------------------------------------------
*任务4
*
*
*
*/
 void Task4(void *pdata)
{
       //INT8U *err;
       unsigned int i;
        pdata = pdata;
        for(;;){
                if(key==2)
                  {
                    
                lcd_dsp_buff[0]='s';
                lcd_dsp_buff[1]='p';
                lcd_dsp_buff[2]='e';
                lcd_dsp_buff[3]='e';
                lcd_dsp_buff[4]='d';
                lcd_dsp_buff[5]='_';
                lcd_dsp_buff[6]='m';
                lcd_dsp_buff[7]='a';
                lcd_dsp_buff[8]='x';
                lcd_dsp_buff[9]=' ';
                lcd_dsp_buff[10]='=';
                lcd_dsp_buff[11]=' ';


                speed_show(12,speed_max);
                
                lcd_dsp_buff[16]='s';
                lcd_dsp_buff[17]='p';
                lcd_dsp_buff[18]='e';
                lcd_dsp_buff[19]='e';
                lcd_dsp_buff[20]='d';
                lcd_dsp_buff[21]='_';
                lcd_dsp_buff[22]='m';
                lcd_dsp_buff[23]='i';
                lcd_dsp_buff[24]='n';
                lcd_dsp_buff[25]=' ';
                lcd_dsp_buff[26]='=';
                lcd_dsp_buff[27]=' ';


                speed_show(28,speed_min);
                
                lcd_dsp_buff[32]='s';
                lcd_dsp_buff[33]='p';
                lcd_dsp_buff[34]='e';
                lcd_dsp_buff[35]='e';
                lcd_dsp_buff[36]='d';
                lcd_dsp_buff[37]='_';
                lcd_dsp_buff[38]='t';
                lcd_dsp_buff[39]='u';
                lcd_dsp_buff[40]='r';
                lcd_dsp_buff[41]='n';
                lcd_dsp_buff[42]='=';
                lcd_dsp_buff[43]=' ';


                speed_show(44,speed_turn);
                
                
                lcd_dsp_buff[48]='b';
                lcd_dsp_buff[49]='a';
                lcd_dsp_buff[50]='s';
                lcd_dsp_buff[51]='e';
                lcd_dsp_buff[52]='_';
                lcd_dsp_buff[53]='d';
                lcd_dsp_buff[54]='u';
                lcd_dsp_buff[55]='t';
                lcd_dsp_buff[56]='y';
                lcd_dsp_buff[57]=' ';
                lcd_dsp_buff[58]='=';
                lcd_dsp_buff[59]=' ';


                speed_show(60,base_duty);
                
                
                  }
 
                update_lcd_display();
                OSTimeDly(15);

        }       
}
/*
****************************************************************************************************
*以下的为各中断的服务的任务..
*每一个中断的ISR对应着一个中断服务任务...目的是为更好的支持中断的嵌套..
 */
/*---------------------------------------------------------------------------------------
* 函数: void OSTick(void *pdata).
* 描述: 时钟中断服务任务0  为了实现中断嵌套........
*/
void OSTick(void *pdata)
{
    INT8U *err;
    pdata = pdata;
    for(;;){
    	OSTimeTick();	  
    	OSMboxPend(Mbox_tick,0,err);
    }
}
void SysCLK_ISR(void) {
   
    counter0++;
   	OSMboxPost(Mbox_tick,(void *)0); //唤醒中断服务任务...  
    MCFLG|=0x80;	                  //清除系统的时钟的中断标志位
    
    
}


/*----------------------------------------------------------------------------
*
*
*/
void IOC_ISR(void){  
					OSSemPost(Sem1);
}
/*---------------------------------------------------------------------------------
*中断服务 ISR任务1/或是简短的中断服务程序...
*
*
*/
void intTask1(void ) {
         
         TFLG2|=0x80;     // 清除中断标志位........
         
 }
 

⌨️ 快捷键说明

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