搜索
bottom↓
回复: 8

杨屹老师的UCOS-II MC51上的移植,在网上基本都是这版改的,为什么下板子里就不好用??求高

[复制链接]

出0入0汤圆

发表于 2011-4-29 07:31:02 | 显示全部楼层 |阅读模式
如题,基本上要改的已经很明确了,但是还是不行,点击此处下载 ourdev_635089QL6LGY.rar(文件大小:58K) (原文件名:移植到MCS51的uCOC_II.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-4-29 08:56:47 | 显示全部楼层
我这边有写好的架构代码经常用的你可以参考一下,基本上8bit的所有单片机都可以使用:


(原文件名:新建位图图像.jpg)





os.c:
----------
#include "all.h"

void main()
{

   __disable_interrupt();
   BOIS_Init();
   __enable_interrupt();

   while(1)
   {
     //Addr_Scan_Task();
    while( Task_Event == No_Event ){}
     
     // if( Key_Scan_Event == true )
     //   Key_Scan_Task();

     // if(LED_Scan_Event == true)
        //LED_Scan_Task();
       
     // if(ACK_SIMKey_Event)
        //  {
        ///      R_SIMKEY_DriverACKToHost_Code();
        //      ACK_SIMKey_Event = false;
         // }
     if(Send_SIMKey_Event&&PS2_Send_End)
         {
           W_SIMKEY_DriverSendToHost_Code();
            Send_SIMKey_Event = false;
         }  
          if(UART_Pakeg_Event)
            UART_DePakeg_Task();
          
          if(Time100ms_Event)
           {
                EvQuePut(Ev100ms_ID,NULL);//each 100ms put event id to queue
                Switch_Status_Scan_Task();
                Time100ms_Event = false;
           }

           if( I2C_Write_OK_FG)
           {
               EvQuePut(EvI2C_Write_OK_ID,NULL);
               I2C_Write_OK_FG =false;
           }
          
           if( I2C_Read_OK_FG)
           {
             EvQuePut(EvI2C_Read_OK_ID,EEPROM_buf);  
               I2C_Read_OK_FG =false;
           }
           if(Key_Scan_Event )
                   Key_Scan_Task();

          if( System_Delay_FG  &&  System_Delay==0)
                  {
                EvQuePut(EvDelay_Time_END_ID,NULL);
                System_Delay_FG = false;
                  }
          if(Dispatch_Event == true)
           Dispatch_Task();
   }       
}/**************************  OS ****************************************/
void Dispatch_Task()
{
      unsigned char Msg;
      pSYS_MS  Now_Que_Ms= GetEvQue();
          if(Now_Que_Ms==NULL)
           return;
          RunAnyTime_FG = true;
      Msg = (Mode_Tab[Now_Mode_ID].pFunc)(Now_Que_Ms->MS_ID,Now_Que_Ms->MS_Data); //run function
          if(RunAnyTime_FG)
       AnyTime_Task(Now_Que_Ms->MS_ID,Now_Que_Ms->MS_Data);

}

void EvQuePut(unsigned char Even_ID,void *MS)  //put event to queue
{
     Now_Que_Counter++;
     if(  Now_Que_Counter > Max_QueSize )
      {

        Task_Event = No_Event;
    //    Show_Error(MSErr_QueFull_ID);
        return;
      }
     else
      {
       Que_R = ((Que_R+1)%Max_QueSize);
       Que_MS[Que_R].MS_ID    = Even_ID;
       Que_MS[Que_R].MS_Data  = MS;
      }
     Dispatch_Event = true;
}

pSYS_MS GetEvQue()    //get event from queue
{

     pSYS_MS Temp=NULL;
     Now_Que_Counter--;
     if(  Now_Que_Counter < 0 )
      {
       Dispatch_Event = false;
       Now_Que_Counter = 0;
       Temp = NULL;
      }
     else
      {
       Que_F = ((Que_F+1)%Max_QueSize);
       Dispatch_Event = true;
       Temp = &Que_MS[Que_F];
      }
       return Temp;

}
/********** switch mode **************************************/
void Into_Mode(unsigned char Mode_ID)
{
   (Init_Mode_Tab[Mode_ID].pFunc_Init)(Mode_ID);  //change mode
   Now_Mode_ID = Mode_ID;
}
/********** Clear Buffer **************************************/
void Clear_Buffer(unsigned char *Buf,unsigned int Size)
{
    register unsigned int i;
     for(i=0;i< Size ; i++)
      Buf=0x00;
}



ISR.c
--------------
#include "all.h"
//----------------------------------------------------------
//********************************************************
//*********************ISR_Init***************************
void ISR_Init()
{
   //stop errant interrupts until set up
//    _CLI(); //disable all interrupts
   XDIV  = 0x00; //xtal divider
   XMCRA = 0x00; //external memory

   MCUCR = 0x00;
   EICRA = 0x00; //extended ext ints
   EICRB = 0x00; //extended ext ints
   EIMSK = 0x00;
   TIMSK = 0x00; //timer interrupt sources
   ETIMSK = 0x00; //extended timer interrupt sources

//all peripherals are now initialized
    // Time Connter
     timer1_init();
     timer2_init();
     TIMSK = 0x44; //timer interrupt sources
//   _SEI(); //re-enable interrupts   

}
//**********************************************************
//*************TIMER1 initialize - prescale:1***************
//**********************************************************
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
// CSn2   CSn1  CSn0             说明
//   0         0       0                 无时钟源 (T/C 停止)
//   0         0       1                 clkI/O/1 ( 无预分频)
//   0         1       0                 clkI/O/8 ( 来自预分频器)
//   0         1       1                  clkI/O/64 ( 来自预分频器)
//   1         0       0                  clkI/O/256 ( 来自预分频器)
//   1         0       1                  clkI/O/1024 ( 来自预分频器)
//   1         1       0                   外部Tn 引脚,下降沿驱动
//   1         1       1                  外部Tn 引脚,上升沿驱动
//**********************************************************
void timer1_init(void)
{
TCCR1B = 0x00; //stop

TCNT1H = 0xD1; //setup
TCNT1L = 0x20;

OCR1AH = 0x2E;
OCR1AL = 0xE0;

OCR1BH = 0x2E;
OCR1BL = 0xE0;

OCR1CH = 0x2E;
OCR1CL = 0xE0;

ICR1H  = 0x2E;
ICR1L  = 0xE0;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}

//**********************************************************
//*************TIMER0 initialize - prescale:64**************
//**********************************************************
// WGM: Normal
// desired value: 1mSec
// actual value:  0.997mSec (0.3%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT0 = 0x45; //set count
OCR0  = 0xBB;
TCCR0 = 0x04; //start timer
}
//**********************************************************
//*************TIMER2 initialize - prescale:64**************
//**********************************************************
//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 38uSec
// actual value: 38.000uSec (0.0%)
void timer2_init()
{
TCCR2 = 0x00; //stop
TCNT2 = 0xC7; //setup
OCR2  = 0x39;
TCCR2 = 0x02; //start

}

//**********************************************************
//*******interrupt_handler timer0_ovf_isr:iv_TIM0_OVF*******
//**********************************************************
#pragma vector = TIMER0_OVF_vect     
__interrupt void timer0_ovf_isr(void)
{
TCNT0 = 0x45; //reload counter value
}



#pragma  vector = TIMER1_OVF_vect //interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
__interrupt void timer1_ovf_isr(void)
{
TCNT1H = 0xD1; //reload counter high value
TCNT1L = 0x20; //reload counter low value

TimeBase_1ms++;

      
     if(TimeBase_Key_Push>0)
         TimeBase_Key_Push--;

   if((TimeBase_1ms%5)==0)
      {  
        if(RST) _WDR();

        TimeBase_5ms++;
        TimeBase_for_Key_Scan_Time++;

        if(TimeBase_for_Key_Scan_Time>=5)
        {
            TimeBase_for_Key_Scan_Time =0 ;
            Key_Scan_Event  = true;
        }
        
        if(TimeBase_5ms >=20)
          {

            TimeBase_5ms = 0;
            Time100ms_Event = true;

         }
      }

   if(TimeBase_RxCharOverTime > 0 )
      TimeBase_RxCharOverTime --;   
   else   
   {      
             if( Rx_Point != -1 && UART_Pakeg_Event == false)      
             {   
               UART_Pakeg_Event = true;        
               RXMST = Rx_Waiting;      
          }   
   }
   
   if( Wait_TxWait > 0 )
    Wait_TxWait--;
   
   if(System_Delay>0)
     System_Delay --;
   
   }
//**********************************************************
//*******interrupt_handler timer2_ovf_isr:iv_TIM0_OVF*******
//**********************************************************

#pragma vector = TIMER2_OVF_vect     
__interrupt void timer2_ovf_isr(void)
{
    TCNT2 = 0xC7; //reload counter value
}



function.c
----------------------

#include  "All.h"
__flash INIT_MAPPER Init_Mode_Tab[]=
{
    Init_Start_Mode,
    Init_Study_Mode,
    Init_Setting_Mode,
    Init_Run_Mode,
    Init_Retention_Mode,
    Init_ExtKey_Play_Mode,
};


__flash MAPPER Mode_Tab[]=
{   
    Start_Mode,
    Study_Mode,
    Setting_Mode,
    Run_Mode,
    Retention_Mode,
    ExtKey_Play_Mode,
};

__flash UART_CMD_MAPPER UART_CMD_Tab[]=
{   
    UART_MB_CMD_Group,             // 小卡通用命令群
    UART_MBIO_CMD_Group,         // 小卡IO 控制群
    UART_MBINFO_CMD_Group,     // 小卡INFO 命令群
    UART_EEPROM_CMD_Group,    // EEPROM 操作命令群
    UART_SIMKEY_CMD_Group,    // 按鍵命令直接操做命令群
};



init_app.c
--------------------------------
#include "all.h"


void Init_Start_Mode(unsigned char NewMode_ID)
{
//  unsigned char cnt=0;
//  unsigned char Temp[4]={0};
/*
  unsigned char Buf[64]={0};
  Fill_Char_To_Buffer(Buf,0x00,64);
  UART_Reply_Buf(0x01,Buf,64,true);
*/

// unsigned char Buf[64]={0};
// Fill_Char_To_Buffer(Buf,0x00,64);
// eeprom_TWI_Master_RW(0x5A,0x01,Buf, 64 );


// eeprom_write(0x01,'J');
// eeprom_write(0x02,'K');
/* FIFO */
//SIMKey_FIFO_Put(eeprom_read(0x01)) ;
//SIMKey_FIFO_Put(eeprom_read(0x02)) ;

     
    //Temp[cnt++] =  (SIMKey_FIFO_Get())[0];
   // HW_UART_RX_BUF = (SIMKey_FIFO_Get())[0];
    //Temp[cnt++] =  (SIMKey_FIFO_Get())[0];
    //HW_UART_RX_BUF = Temp[(cnt-1)];  

    SystemDelay_ms(5);

}
void Init_Study_Mode(unsigned char NewMode_ID)
{

}
void Init_Setting_Mode(unsigned char NewMode_ID)
{
     APP_OP_Index=0;
     APP_OP_Size=0;
            
             LED_D5(true);
             LED_D6(true);
             LED_D7(true);
             LED_D8(true);

    PC_Command=PCCommand_IDEL;
}
void Init_Retention_Mode(unsigned char NewMode_ID)
{
}
void Init_Run_Mode(unsigned char NewMode_ID)
{
   //指令歸零
    Run_Commnd_Counter = 0;
   Total_Command=0;
   Commnd_Run_Index=0;
   // 讀出前面的2  BYTE
   // 兩BYTE 為指令全部數量
   
     COMMAND_Buf[0] = Cmd_Read_Total_instruction;
     COMMAND_Buf[1] = 0;
     COMMAND_Buf[2] = 0;
     //Read_Get_Total_COMD();
}
void Init_ExtKey_Play_Mode(unsigned char NewMode_ID)
{
    AutoRun_END = false;
     I2C_ReadNByte (0xA0, 2,0x0000, &KeyCode_buf[0], 32);
     KEY_AutoRun.KEY_RUN_Counter= KeyCode_buf[0];
     KEY_AutoRun.PowerOn_KEY1_TIME= KeyCode_buf[1];
     KEY_AutoRun.KEY1_KEY2_TIME= KeyCode_buf[2];
         


}
anytime.c
---------------------------
#include "All.h"
unsigned int AnyTime_Task(unsigned char MS_ID,void *MS)
{
   //unsigned char Temp,KeyTime,Key_Now_ST;
    switch(MS_ID)
    {
       case EvKey_ID:
            //Temp = ((pKEY_MESSAGE)MS)->KEY_CODE;
            //KeyTime = ((pKEY_MESSAGE)MS)->Push_Time;
            //Key_Now_ST  = ((pKEY_MESSAGE)MS)->Key_Now_ST;
            break;
       case Ev100ms_ID:
                break;
    }
    return true;
}


all.h
-------------------------------
//#define TEST
#define  FW_Version  0x00000026    // V0.26
// AVR_64 Base
//\inc
#include <iom64.h>
#include <avr_macros.h>
#include <intrinsics.h>
#include <stdbool.h>
#include <comp_a90.h>
#include <inavr.h>
//\inc\clib
#include <stdio.h>
#include <limits.h>
#include <iso646.h>

#include "Typedef.h"
#include "IOMap.h"
#include "Var.h"
#include "CommandRun.h"
#include "eeprom24CXX.h"
//Iint
#include "Init.h"
#include "OS.h"
#include "functab.h"
#include "ISR.h"
#include "UARTCmd.h"
// Apps
#include "App.h"
#include "Anytime.h"
#include "Init_App.h"
//Driver
#include "DV_Key.h"
//#include "DV_EEPROM.h"
#include "DV_comm.h"
#include "DV_input.h"
#include "DV_ps2.h"
#include "DV_I2C.h"
#include "DV_WatchDog.h"
#include "DV_KeyRun.h"

os.h
------------------
typedef struct {   
                   unsigned char Bit0:1;      
                   unsigned char Bit1:1;         
                   unsigned char Bit2:1;         
                   unsigned char Bit3:1;      
                   unsigned char Bit4:1;          
                   unsigned char Bit5:1;      
                   unsigned char Bit6:1;      
                   unsigned char Bit7:1;      
                   }Byte_Of_bit,*pByte_Of_bit;

typedef struct {                       /*  WORD  Access*/
                   unsigned int Bit0:1;      
                   unsigned int Bit1:1;        
                   unsigned int Bit2:1;             
                   unsigned int Bit3:1;        
                   unsigned int Bit4:1;          
                   unsigned int Bit5:1;      
                   unsigned int Bit6:1;         
                   unsigned int Bit7:1;        
                   unsigned int Bit8:1;                 
                   unsigned int Bit9:1;         
                   unsigned int Bit10:1;             
                   unsigned int Bit11:1;        
                   unsigned int Bit12:1;          
                   unsigned int Bit13:1;         
                   unsigned int Bit14:1;           
                   unsigned int Bit15:1;      
                   }Word_Of_bit,*pWord_Of_bit;

typedef struct SYS_MS
{
  unsigned int MS_ID;
  void *MS_Data;
}SYS_MS,*pSYS_MS;

/*  MyDefInit_AppFuncType */
typedef struct {
   void (*pFunc_Init)(unsigned char NewMode_ID);       /* Pointer to fnt which processes msg */
} INIT_MAPPER, *PINIT_MAPPER;


/*  MyDefFuncType */
typedef struct {
   unsigned int  (*pFunc)(unsigned char MS_ID,void *MS);       /* Pointer to fnt which processes msg */
} MAPPER, *PMAPPER;

/*  MyDefUARTCmd TYPE */
typedef struct {
   unsigned int  (*pUART_Cmd_Func)(unsigned char CmdSub_ID,void *MS);       /* Pointer to fnt which processes msg */
} UART_CMD_MAPPER, *PUART_CMD_MAPPER;

/***************************************************************************/
/* Runing App Mode                                                         */
/***************************************************************************/
extern unsigned char Now_Mode_ID;
/***************************************************************************/
/* Que Message                                                             */
/***************************************************************************/
#define Max_QueSize 15
extern char Que_R;
extern char Que_F;
extern unsigned char  Now_Que_Counter;    /*Que Message*/
extern SYS_MS  Que_MS[Max_QueSize];

extern unsigned char Err_Code_Umb;
/***************************************************************************/
/*      Event FG                                              */
/***************************************************************************/
extern volatile unsigned char Task_Event;
#define Key_Scan_Event               ((pByte_Of_bit)&Task_Event)->Bit0 /* Key Driver Task*/
#define Dispatch_Event               ((pByte_Of_bit)&Task_Event)->Bit1 /* Run App */
#define UART_Pakeg_Event             ((pByte_Of_bit)&Task_Event)->Bit2
#define Time100ms_Event              ((pByte_Of_bit)&Task_Event)->Bit3
#define Send_SIMKey_Event            ((pByte_Of_bit)&Task_Event)->Bit4
#define ACK_SIMKey_Event             ((pByte_Of_bit)&Task_Event)->Bit5
#define No_Event  0

/***************************************************************************/
/* System reg fg                                                           */
/***************************************************************************/
extern volatile unsigned int System_Fg;   
typedef struct System_FG_ST
{
unsigned int Key_ST_FG:2;         /*  Key ME ST*/
unsigned int RunAnyTimeTask_FG:1;
unsigned int LEDSpk_FG:1;

unsigned int I2C_Write_OK_FG:1;
unsigned int I2C_Read_OK_FG:1;
unsigned int I2C_WriteTimeOut_FG:1;
unsigned int I2C_ReadTimeOut_FG:1;

unsigned int System_Delay_FG:1;
unsigned int PC_SMIKey_Save_FG:1;
unsigned int PC_SMI_Play_FG:1;
unsigned int Ex_Key_Save_FG:1;
}System_FG_ST,*pSystem_FG_ST;

/* System */
#define KEY_SCREAN_KEY_ST         ((pSystem_FG_ST)&System_Fg)->Key_ST_FG      
#define RunAnyTime_FG                 ((pSystem_FG_ST)&System_Fg)->RunAnyTimeTask_FG
#define LEDSpk_FG_FG                   ((pSystem_FG_ST)&System_Fg)->LEDSpk_FG

#define I2C_Write_OK_FG               ((pSystem_FG_ST)&System_Fg)->I2C_Write_OK_FG      
#define I2C_Read_OK_FG               ((pSystem_FG_ST)&System_Fg)->I2C_Read_OK_FG      
#define I2C_WriteTimeOut_FG         ((pSystem_FG_ST)&System_Fg)->I2C_WriteTimeOut_FG      
#define I2C_ReadTimeOut_FG         ((pSystem_FG_ST)&System_Fg)->I2C_ReadTimeOut_FG  

#define System_Delay_FG               ((pSystem_FG_ST)&System_Fg)->System_Delay_FG

#define PC_SMIKey_Save_FG           ((pSystem_FG_ST)&System_Fg)->PC_SMIKey_Save_FG
// PC 模擬撥放模式
#define PC_SMI_Play_FG                 ((pSystem_FG_ST)&System_Fg)->PC_SMI_Play_FG
// 外接鍵盤儲存式
#define Ex_Key_Save_FG                ((pSystem_FG_ST)&System_Fg)->Ex_Key_Save_FG


/***************************************************************************/
/* Time Base ReLoad Counter                                                */
/***************************************************************************/
/* Time Base */
/*CPU_FZ*/
#define OSCSPEED        16000000                /* in Hz */
#define CPU_FZ          OSCSPEED



/***************************************************************************/
/*  Event ID                                                              */
/***************************************************************************/
#define EvCheckAppMode_ID                  0
#define EvKey_ID                                     1
#define EvSwitchCheng_ID                      2
#define Ev100ms_ID                                3  /* 0.1S */
#define EvI2C_Read_OK_ID                     4     //  ID , MS = Buf Addr
#define EvI2C_Read_TimeOut_ID            5     //
#define EvI2C_Write_OK_ID                     6     //  ID , MS = NULL
#define EvI2C_Write_TimeOut_ID            7     //  
#define EvRunCommand_ID                      8
#define EvRunCommand_END_ID              9
#define EvDelay_Time_END_ID               10    // 延池的時間到了
#define EvError_ID                                   0xFFFF     /*Clear */

// function def
void Dispatch_Task();
void EvQuePut(unsigned char Even_ID,void *MS);
pSYS_MS GetEvQue();
void Into_Mode( unsigned char Mode_ID);
void Clear_Buffer(unsigned char *Buf,unsigned int Size);
void Fill_Char_To_Buffer(unsigned char *Buf,unsigned char CHAR,unsigned int Size);
void SystemDelay_ms(unsigned long ms);
void Copy_Buf2ToBuf1(unsigned char *Buf1,unsigned char *Buf2, unsigned int Size);
//SIMKey_FIFO
/***************************************************************************/
/* Que Message                                                             */
/***************************************************************************/
#define W_Max_KEYFIFO_Size 15
extern char W_SIMKEY_FIFO_R;
extern char W_SIMKEY_FIFO_F;
extern unsigned char  W_Now_KEY_FIFO_Counter;    /*Que Message*/
extern unsigned char  W_SIMKEY_FIFO_BUF[W_Max_KEYFIFO_Size];

#define R_Max_KEYFIFO_Size 15
extern char R_SIMKEY_FIFO_F;
extern char R_SIMKEY_FIFO_R;                     /*Que Message*/
extern unsigned char R_Now_KEY_FIFO_Counter;
extern unsigned char R_SIMKEY_FIFO_BUF[R_Max_KEYFIFO_Size];



void W_SIMKey_FIFO_Put(unsigned char KEYCODE);  //put event to queue

unsigned char* W_SIMKey_FIFO_Get();    //put event to queue


void R_SIMKey_FIFO_Put(unsigned char KEYCODE);  //put event to queue
unsigned char* R_SIMKey_FIFO_Get();  //put event to queue

按照这种分层的写法,app和deriver层分开,同时整个程序不要用delay,最好都用状态机来实现;
修改原因:增加头文件

出0入8汤圆

发表于 2011-4-29 09:03:38 | 显示全部楼层
给你好的不用,非要用名家的

出0入0汤圆

 楼主| 发表于 2011-4-29 09:12:20 | 显示全部楼层
回复【1楼】KunShan_a_dai
-----------------------------------------------------------------------

谢KunShan_a_dai ,静下心消化消化先!!

出0入0汤圆

 楼主| 发表于 2011-4-29 13:43:59 | 显示全部楼层
回复【2楼】lindabell 欧海
-----------------------------------------------------------------------

名家正统,呵呵,迷信

出0入0汤圆

发表于 2011-4-29 14:41:30 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-26 15:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表