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

📄 main__.c

📁 avr Rtos 255 Task avr Rtos 255 Task
💻 C
📖 第 1 页 / 共 2 页
字号:
SetPortD_In(unsigned char BitMask )
{ 
        ClrBit( DDRD, BitMask );    
} 
WritePortD(unsigned char Value, unsigned char BitMask )
{
        PORTD &= Value | ~BitMask;
        PORTD |= Value & BitMask;
}
SetPortG_Out(unsigned char BitMask )
{ 
        SetBit( DDRG, BitMask );      
} 
SetPortG_In(unsigned char BitMask )
{ 
        ClrBit( DDRG, BitMask );    
} 
WritePortG(unsigned char Value, unsigned char BitMask )
{
        PORTG &= Value | ~BitMask;
        PORTG |= Value & BitMask;
}               
#include <mega128.h>
static char screenpos[4][20] = {
                                {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
                                 0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93},
                                {0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,
                                 0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3},
                                {0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,
                                 0x9E,0x9F,0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7},
                                {0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,
                                 0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7}
                               };  

void temp()
{ 
 int t;
   //dezactivare LCD
  WritePortD(0x00,0x10);//0xx
  //scriere 0 linii
  WritePortA(0x00,0xFF);//data=0
  SetPortA_In(0xFF);//setare port A intrare
  //configurare citire LCD comanda
  WritePortD(0x20,0x70);//010//configurare citire

 for(t=0;t<50;t++);//temporizare
  WritePortD(0x10,0x10);//1xx
  // //activare LCD
  //  MA_WritePort_IO(MA_PORTG,0x00,0x04);
  ///////////////////////////////////////////////////debugbuton

//do{
 //citire busy flag
 //t=PINA;
 //}while(t&0x80);
 //MA_WritePort_IO(MA_PORTE,0xFF,0xFF);//data
 WritePortD(0x00,0x10);//000
 for(t=0;t<50;t++);//temporizare
  WritePortD(0x00,0x70);//000
  SetPortD_In(0x70);//setare port intrare
}

void send_command (const char s)
{ int temp_g;

  
  PORTD=0x00;  //000
  DDRA=0xFF;//setare port A iesire
  DDRD=0xFF;//setare port G iesire

  PORTA=s;//comanda
  PORTD=0x10;  //100
  for(temp_g=0;temp_g<50;temp_g++);//temporizare
  //temp();
}

void send_char (const char s)
{   
  int t;
  //temp();
  WritePortD(0x00,0x70);  //000
  SetPortA_Out(0xFF);//setare port A iesire
  SetPortD_Out(0x70);//setare port G iesire  

  WritePortA(s,0xFF);//data
  WritePortD(0x50,0x70);  //101 scriere data   
  
  for(t=0;t<50;t++);//temporizare
  temp(); 
}

void init()
{
//init_LCD();
  int temp_g;
  int ig;
  //initializare lcd
  DDRA=0xFF;//setare port A iesire
  DDRD=0xFF;//setare port G iesire
  //MA_WritePort_IO(MA_PORTG,0x00,0x07);  //000

  PORTD=0x10; //E=1 enable
  for(temp_g=0;temp_g<200;temp_g++);//temporizare

  //temp();
  for(ig=0;ig<3;ig++)
  {
   send_command(0x3c);//function Set : 8bits 2line on
   for(temp_g=0;temp_g<200;temp_g++);//temporizare
  }
   send_command(0x0F);//Display on
   for(temp_g=0;temp_g<200;temp_g++);//temporizare

   send_command(0x01);//Display clear
   for(temp_g=0;temp_g<200;temp_g++);//temporizare

   send_command(0x06);//Entry mode select
   for(temp_g=0;temp_g<200;temp_g++);//temporizare

 //  MA_WritePort_IO(MA_PORTE,0xFF,0xFF);//data

  // send_command(0x0f);//Display on
   //for(temp_g=0;temp_g<200;temp_g++);//temporizare
//End initializare
}   

void send_string (char *str) {			// sends the whole string to LCD
 while ((*str != 0)&& (*str != 10))
   send_char (*str++);
}

void setpos (char x,char y) {
 send_command (screenpos[x-1][y-1]);
}  
#include "my_os.h"
//#include <mega128.h>
//#include "global.h"
#include <stdlib.h>
//#include <inavr.h>

//externe
extern unsigned char t_sph;
extern unsigned char t_spl;
extern unsigned char t_r29;
extern unsigned char t_r28;
extern unsigned char task_time;
extern unsigned char ig,jg,kg,lg,mg,ng;
extern unsigned int global_inc_g;
extern unsigned int global_inc;
extern unsigned int inc;
extern unsigned char temp_g;
extern unsigned char b_start_so;
//extern S8 lcd_sem;
extern unsigned char lcd_coada[NR_MAX_TASK];


//folosita pentru initializarea t_sp si t_r in rutina timer
void get_tsp(void)
{
//initializare stiva (unde se gaseste adresa stivei)
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize)>>8;
    t_sph=(unsigned char)(tem&0x00ff);
    t_spl=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize)&0xff;
//initializarea adresa pointer y
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize-2)>>8;
    t_r29=(unsigned char)(tem&0x00ff);
    t_r28=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize-2)&0xff;
}

//salvarea variabilelor globale
void push_var(void)
{
//unsigned char ig,jg,kg,lg,mg,ng;
  rtos[task_curent].adr_task[OSTaskStkSize-5]=ig;
  rtos[task_curent].adr_task[OSTaskStkSize-6]=jg;
  rtos[task_curent].adr_task[OSTaskStkSize-7]=kg;
  rtos[task_curent].adr_task[OSTaskStkSize-8]=lg;
  rtos[task_curent].adr_task[OSTaskStkSize-9]=mg;
  rtos[task_curent].adr_task[OSTaskStkSize-10]=ng;
//  rtos[task_curent].adr_task[OSTaskStkSize-11]=(unsigned char)(global_inc_g&0x0ff);
//  rtos[task_curent].adr_task[OSTaskStkSize-12]=(unsigned char)((global_inc_g>>8)&0x0ff);

  rtos[task_curent].adr_task[OSTaskStkSize-11]=temp_g;
 // rtos[task_curent].adr_task[OSTaskStkSize-12]=init_t;
}
unsigned char comuta_task(void)
{
    if(task_varf==-1)//test daca este goala lista
      return 0;
//nou: task-ul este comutat numai daca este activat!
    do
    {
     if(task_curent>=task_coada)
       task_curent=task_varf-1;
     task_curent++;
     tem++;
    }while(!(rtos[task_curent].activ));
    task_time=rtos[task_curent].nr_timpi;
//initializare stiva (unde se gaseste adresa stivei)
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize)>>8;
    t_sph=(unsigned char)(tem&0x00ff);
    t_spl=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize)&0xff;
//initializarea pointer y (unde se gaseste adresa registrilor r29 si r28)
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize-2)>>8;
    t_r29=(unsigned char)(tem&0x00ff);
    t_r28=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize-2)&0xff;

    return 1;
} 

 //restaurarea noilor variabile locale
void pop_var(void)
{
  ig=rtos[task_curent].adr_task[OSTaskStkSize-5];
  jg=rtos[task_curent].adr_task[OSTaskStkSize-6];
  kg=rtos[task_curent].adr_task[OSTaskStkSize-7];
  lg=rtos[task_curent].adr_task[OSTaskStkSize-8];
  mg=rtos[task_curent].adr_task[OSTaskStkSize-9];
  ng=rtos[task_curent].adr_task[OSTaskStkSize-10];
  temp_g=rtos[task_curent].adr_task[OSTaskStkSize-11];
}  
  
void start_so(void)
{
 //initializeaza vectorul de taskuri
  task_varf=task_coada=task_curent=-1;//initializeaza index vector taskuri
}     

//functia creaza un task
unsigned char creaza_task(void (*taskf)(void),unsigned char numar)
{
    unsigned int i;
//1.pozitionarea taskului in lista
    if(task_varf==-1)//daca lista este vida
    {
      if(task_coada>=NR_MAX_TASK-1)//daca indexul nu este mai mare decat numarul de task-uri
        return T_EROARE;
      task_coada++;//incrementeaza indexul coada
      task_curent=task_varf=task_coada;
//initializare
    }
    else//daca lista are cel putin un element
    {
      if(task_coada>=NR_MAX_TASK-1)
        return 0;
      task_coada++;
    }
    rtos[task_coada].nr_timpi=numar;//initializare timpi task
    rtos[task_coada].activ=1;//initializare task on/off
    for(i=0;i<OSTaskStkSize;i++)
      rtos[task_coada].adr_task[i]=(unsigned char)i;//initializare stiva in total
//salvarea pointer functie
    i = (unsigned int) taskf;
    rtos[task_coada].adr_task[OSTaskStkSizeHard-1]=(unsigned char)i&0x0ff;//ocmps functie
    rtos[task_coada].adr_task[OSTaskStkSizeHard-2]=(unsigned char)((i>>8)&0x0ff);//ocms functie
//initializarea stivei
    i = (unsigned int) rtos[task_coada].adr_task+OSTaskStkSizeHard-3;
    rtos[task_coada].adr_task[OSTaskStkSize-1]=(unsigned char)i&0xff;
    rtos[task_coada].adr_task[OSTaskStkSize-2]=(unsigned char)(i>>8)&0xff;
//initialiarea pointer y
    i = (unsigned int) rtos[task_coada].adr_task+62;
    rtos[task_coada].adr_task[OSTaskStkSize-3]=(unsigned char)i&0xff;
    rtos[task_coada].adr_task[OSTaskStkSize-4]=(unsigned char)(i>>8)&0xff;

    return 1;
} 
  

//folosita pentru initializarea t_sp si t_r pentru primul task care se va executa
void init_task(void)
{
 //initializare stiva (unde se gaseste adresa stivei)
    task_time=rtos[task_curent].nr_timpi;
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize)>>8;
    t_sph=(unsigned char)(tem&0x00ff);
    t_spl=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize)&0xff;
//initializarea pointer y
    tem = (unsigned int) ((rtos[task_curent].adr_task)+OSTaskStkSize-2)>>8;
    t_r29=(unsigned char)(tem&0x00ff);
    t_r28=(unsigned char)((rtos[task_curent].adr_task)+OSTaskStkSize-2)&0xff;
//initialiarea pointer y - la primul task stiva software este pregatita pentru incarcare valori registrii!
    tem = (unsigned int) rtos[task_curent].adr_task+80;
    rtos[task_curent].adr_task[OSTaskStkSize-3]=(unsigned char)tem&0xff;
    rtos[task_curent].adr_task[OSTaskStkSize-4]=(unsigned char)(tem>>8)&0xff;
}  

void PopSP(void)
{
  #asm("cli")
  #asm("  LDS R29,_t_sph");
  #asm("  LDS R28,_t_spl");
  #asm("  LD R16,-Y");
  #asm("  OUT 0x3d,R16");
  #asm("  LD R16,-Y");
  #asm("  OUT 0x3e,R16");

//in plus setare pointer y pentru stiva soft!
  #asm("  LDS R30,_t_r28");
  #asm("  LDS R31,_t_r29");
  #asm("  LD R28,-Z");
  #asm("  LD R29,-Z");

  b_start_so=1;
  #asm("sei")
}

⌨️ 快捷键说明

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