搜索
bottom↓
回复: 43

大家有没有这种感觉:虽然AVR支持许多编译器,但支持得越多,导致标准越乱,越难交流?

[复制链接]
头像被屏蔽

出0入0汤圆

发表于 2007-8-12 05:18:28 | 显示全部楼层 |阅读模式
ICC,GCC,IAR,CVAVR,BASCOM .....



每个人都能从中选出自己喜欢的,表面感觉很好。



但我们的整理资料时,一直很头疼:由于基于的编译器不同,代码需要经过修改才能移植使用,导致了有时难于交流。



大家有没有这种感觉?



(听完马老师介绍CVAVR后,有点心动,于是发了点感慨)。

出0入296汤圆

发表于 2007-8-12 05:32:51 | 显示全部楼层
我提供一个解决方案:

1、使用最基本的ANSI-C语法,实例中避免使用某一个版本编译器的特有语法

2、在所有实例中,将代码分成至少两层:硬件抽象层和应用层。在硬件抽象层中,针对各个编译器的特性编写硬件初始化函数和中断处理程序。在中断处理程序中提供外部接口。这样,对于应用层来说,我们就有了一个公共的标准接口。跨编译器甚至是跨单片机平台都成为可能。

3、编写一定的库函数和项目管理工具辅助维护这样的结构。大家编写头文件的时候,尽量将硬件相关的特异部分隔离开来。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-8-12 05:37:44 | 显示全部楼层
晕,原来不是我一个人这么早起。



刚才东莞又是大暴雨,我所在的小区又淹水了 (一年总要淹几次)。半夜3点被保安打电话叫醒将车开到地势高的地方,否则明天就要修车了。

出0入296汤圆

发表于 2007-8-12 05:39:07 | 显示全部楼层
压根就没有睡哈……

明天,我把上述结构的工程模板发上来,大家都讨论下?
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-8-12 05:43:40 | 显示全部楼层
好! 单独发一个帖子吧。这样方便讨论。谢谢。

出0入296汤圆

发表于 2007-8-12 05:46:26 | 显示全部楼层
现在在寝室,笔记本里面只有一些用这个模板建立的项目。模板在实验室,白天去拿。

先发一个例子好了:



硬件抽象层的第一个文件:硬件初始化函数





HD_Support.c

-----------------------------------------------------------------------



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

*   函数库说明:底层硬件初始化函数库                       *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [硬件说明]                                              *

*   处理器:                                               *

*   系统时钟:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:HD_Support.h                               *

*   需要版本:  -----                                      *

*   声明库说明:底层硬件初始化声明库                       *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include "PF_Config.h"

# include "HD_Support.h"



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

*   系 统 宏 定 义  *

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

# pragma interrupt_handler Timer0_OVF_ISR:iv_TIMER0_OVF

# pragma interrupt_handler SPI_STC_ISR:iv_SPI_STC

# pragma interrupt_handler PCINT0_ISR:iv_PCINT0

# pragma interrupt_handler USART0_RX_ISR:iv_USART0_RX

# pragma interrupt_handler USART0_TX_ISR:iv_USART0_TX

# pragma interrupt_handler INT0_ISR:iv_INT0

/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/

#ifndef INSERT_TIMER0_OVF_ISR_CODE

    # define INSERT_TIMER0_OVF_ISR_CODE

#endif

#ifndef INSERT_SPI_STC_ISR_CODE

    # define INSERT_SPI_STC_ISR_CODE

#endif

#ifndef INSERT_PCINT0_ISR_CODE

    # define INSERT_PCINT0_ISR_CODE

#endif

#ifndef INSERT_USART0_TX_ISR_CODE

    # define INSERT_USART0_TX_ISR_CODE

#endif

#ifndef INSERT_USART0_RX_ISR_CODE

    #ifndef USE_9BIT

        # define INSERT_USART0_RX_ISR_CODE  

    #else

        # define INSERT_USART0_RX_ISR_CODE  uint8 cTempUDR = UDR0;

    #endif

#endif



#ifndef INSERT_INT0_ISR_CODE

    # define INSERT_INT0_ISR_CODE   

#endif



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

*  模块结构体定义区 *

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



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

*   函 数 声 明 区  *

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

void Device_INIT(void);



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

*   模块函数声明区  *

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

static void Port_INIT(void);

static void Timer0_INIT(void);

static void SPI_INIT(void);

static void PCINT_INIT(void);

static void USART0_INIT(void);

static void Timer1_INIT(void);

static void Timer2_INIT(void);

static void INT0_INIT(void);



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

*   模块变量声明区  *

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



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

*   全局变量声明区  *

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

extern uint Counter;

extern uint8 Steps;



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

*   函数说明:SPI初始化函数                                *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void SPI_INIT(void)

{

    SPCR = 0xCC;

    SPSR = 0x00;

}





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

*   函数声明:SPI通讯完成中断处理程序                      *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_SPI_STC_ISR_CODE                      *

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

void SPI_STC_ISR (void)

{

    INSERT_SPI_STC_ISR_CODE

}



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

*   函数说明:系统硬件初始化函数                           *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:Port_INIT()   Timer0_INIT()                  *

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

void Device_INIT(void)

{

    Port_INIT();

    Timer0_INIT();

    //SPI_INIT();

    //PCINT_INIT();

    USART0_INIT();

    Timer1_INIT();

    Timer2_INIT();

    INT0_INIT();

   

   

    TIMSK0 = BIT(TOIE0);                                    //启动定时期0溢出中断资源



}



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

*   函数说明:系统端口初始化函数                           *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void Port_INIT(void)

{

    //SPI总线端口初始化

    DDR_PB4 = PDIR_OUT;_PB4 = HIGH;

    DDR_PB0 = PDIR_IN ;_PB0 = LOW;

        

    //系统指示灯

    DDR_PC0 = PDIR_OUT;_PC0 = LOW;

    DDR_PC1 = PDIR_OUT;_PC1 = LOW;

   

    //SP027

    DDR_PC4 = PDIR_OUT;_PC4 = HIGH;

    DDR_PC5 = PDIR_OUT;_PC5 = HIGH;

   

    //同步串口

    DDR_PD4 = PDIR_IN;  _PD4 = HIGH;

    DDR_PD0 = PDIR_IN;  _PD0 = HIGH;

    DDR_PD1 = PDIR_IN;

   

    //电机控制

    DDR_PC3 = PDIR_OUT;_PC3 = HIGH;

    DDR_PC2 = PDIR_OUT;_PC2 = HIGH;

    DDR_PD6 = PDIR_OUT;_PD6 = LOW;

    DDR_PD7 = PDIR_OUT;_PD7 = LOW;



    DDR_PB1 = PDIR_OUT;_PB1 = LOW;

   

    //编码盘

    DDR_PD2 = PDIR_IN; _PD2 = HIGH;

    DDR_PD5 = PDIR_IN; _PD5 = HIGH;

   

    DDR_PD3 = PDIR_OUT;_PD3 = HIGH;

   

}



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

*   函数说明:硬件PWM初始化函数                            *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void Timer1_INIT(void)

{

    TCCR1B = 0x00;

    OCR1A = 0x00;

    ICR1  = TIMER1_TOP_VALUE;                               //0x04E2;

    TCCR1A = 0x80;

    TCCR1B = 0x11;

}



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

*   函数说明:4K频率50%PWM硬件输出初始化函数               *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void Timer2_INIT(void)

{

    TCCR2B = 0x00;   

    ASSR  = 0x00;  

    TCNT2 = 0x64;   

    OCR2A = 0x4c;

    OCR2B = 0x05;

    TCCR2A = 0x12;

    TCCR2B = 0x03;  

}



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

*   函数说明:同步串口初始化函数                           *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void USART0_INIT(void)

{

    UCSR0B = 0x00;

    UCSR0A = 0x00;

    UCSR0C = 0x46;

    UCSR0B = 0xDC;

}



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

*   函数说明:USART0串口接收完成中断处理函数               *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_USART0_RX_ISR_CODE                    *

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

void USART0_RX_ISR(void)

{

#ifndef USE_9BIT

    uint8 cTempUDR = UDR0;

#endif

    INSERT_USART0_RX_ISR_CODE

}



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

*   函数说明:USART0串口发送完成中断处理函数               *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_USART0_TX_ISR_CODE                    *

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

void USART0_TX_ISR(void)

{

    INSERT_USART0_TX_ISR_CODE

}





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

*   函数声明:定时器0初始化函数                            *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void Timer0_INIT(void)

{

    TCCR0B = 0x00;

    TCNT0 = 0xB2;

    TCCR0A = 0x00;

    TCCR0B = 0x04;

}



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

*   函数声明:定时器0溢出中断处理程序                      *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_TIMER0_OVF_ISR_CODE                   *

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

void Timer0_OVF_ISR(void)

{

    TCNT0 = 0xB2;

   

    INSERT_TIMER0_OVF_ISR_CODE

}



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

*   函数说明:端口电平变化中断初始化函数                   *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void PCINT_INIT(void)

{

    PCICR = BIT(PCIE0);

    PCMSK0 = BIT(PCINT0);

}



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

*   函数说明:PCINT0端口电平变化中断处理程序               *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_PCINT0_ISR_CODE                       *

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

void PCINT0_ISR(void)

{

    INSERT_PCINT0_ISR_CODE

}



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

*   函数说明:外中断0初始化函数                            *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void INT0_INIT(void)

{

    EICRA = 0x02;

    EIMSK = 0x01;

}



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

*   函数说明:外中断0中断处理程序                          *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_INT0_ISR_CODE                         *

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

void INT0_ISR(void)

{

    INSERT_INT0_ISR_CODE

}

出0入296汤圆

发表于 2007-8-12 05:47:14 | 显示全部楼层
对应的.h文件



HD_Support.h







#ifndef _USE_HD_SUPPORT_H_

#define _USE_HD_SUPPORT_H_

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

*   声明库说明:底层硬件初始化声明库                       *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [硬件说明]                                              *

*   处理器:                                               *

*   系统时钟:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:RD_UseAVRPortBit.h                         *

*   需要版本:  v1.01                                      *

*   声明库说明:AVR位操作通用支持库                        *

*                                                          *

*   支持库名称:PF_Config.h                                *

*   需要版本:  -----                                      *

*   声明库说明:硬件平台配置声明库                         *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include <iom88v.h>   

# include "RD_UseAVRPortBit.h"





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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/

# define DISABLE_PCINT          PCICR = 0;PCMSK0 = 0;

# define ENABLE_PCINT           PCICR = BIT(PCIE0);PCMSK0 = BIT(PCINT0);



# define ENTER_MULTI_CPU_MODEL  UCSR0A |= BIT(MPCM0);

# define EXIT_MULTI_CPU_MODEL   UCSR0A &= ~BIT(MPCM0);

# define ENABLE_TX              UCSR0B |= BIT(TXEN0);            

# define DISABLE_TX             UCSR0B &= ~BIT(TXEN0);



# define MOTOR_DIRECTION        READ_PD5



# define SET_MOTOR_PWM(Var)     OCR1A = MIN((Var),TIMER1_TOP_VALUE);



# define MOTOR_ENABLE           _PC3 = HIGH;_PC4 = HIGH;

# define MOTOR_DISABLE          _PC3 = LOW;_PC4 = LOW;

# define MOTOR_STOP_PWM         TCCR1B = 0x00;TCCR1A = 0x00;OCR1A = 0x00;

# define MOTOR_START_PWM        TCCR1A = 0x80;TCCR1B = 0x11;

# define MOTOR_SET_SPEED(Var)   MOTOR_START_PWM;SET_MOTOR_PWM(Var);

# define MOTOR_GO_FRONT         _PD6 = LOW;_PD7 = HIGH;MOTOR_START_PWM;MOTOR_ENABLE

# define MOTOR_GO_BACK          _PD6 = HIGH;_PD7 = LOW;MOTOR_START_PWM;MOTOR_ENABLE

# define MOTOR_STOP_FREE        PORTD &= 0x3f;MOTOR_STOP_PWM;_PB1 = HIGH;MOTOR_DISABLE

# define MOTOR_STOP_BRAKE       PORTD &= 0x3f;MOTOR_STOP_PWM;_PB1 = LOW;MOTOR_ENABLE





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

*    结构体定义区   *

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



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

*   函 数 引 用 区  *

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

extern void Device_INIT(void);



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

*   全局变量引用区  *

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



#endif
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-8-12 05:47:38 | 显示全部楼层
非常好啊!



条理化清楚,看着都舒服!

出0入296汤圆

发表于 2007-8-12 05:49:31 | 显示全部楼层
这个文件是硬件抽象层的驱动部分,用于将硬件相关的接口完全封装成API函数。所有中断处理程序的原代码也在这里。



Ex_Support.c

---------------------------------------------------------------------



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

*   函数库说明:底层硬件初始化驱动函数库                   *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [硬件说明]                                              *

*   处理器:                                               *

*   系统时钟:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:PF_Config.h                                *

*   需要版本:  -----                                      *

*   声明库说明:硬件平台配置声明库                         *

*                                                          *

*   支持库名称:HD_Support.h                               *

*   需要版本:  -----                                      *

*   声明库说明:底层硬件初始化声明库                       *

*                                                          *

*   支持库名称:EX_Support.h                               *

*   需要版本:  -----                                      *

*   声明库说明:底层硬件初始化驱动声明库                   *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include "PF_Config.h"

# include "EX_Support.h"

# include "PROC_Communication.h"

# include "PROC_MotorAction_SCTR.h"



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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/



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

*  模块结构体定义区 *

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



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

*   函 数 声 明 区  *

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

void System_INIT(void);

void Delay_MS(uint16 wTime);

void Insert_Timer0_OVF_ISR_Code(void);



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

*   模块函数声明区  *

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

static void Driver_INIT(void);



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

*   模块变量声明区  *

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

static uint16 s_wSystemDelayTimerCounter = 0;



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

*   全局变量声明区  *

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

uint16 g_wSystemTimer = 0;

uint32 g_dDCounter = 0x7fffffff;



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

*   函数说明:软件驱动初始化函数                           *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

static void Driver_INIT(void)

{

    LED_Flash_Control_INIT();

    CMOS_INIT();

    Communication_INIT();

}



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

*   函数说明:系统初始化函数                               *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:Device_INIT() Driver_INIT()                  *

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

void System_INIT(void)

{

    CLI();

   

    Device_INIT();

    Driver_INIT();

   

    //*在这里插入你的系统环境变量初始化代码*//

   

    SEI();

}



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

*   函数说明:系统毫秒延时函数                             *

*   输入:    需要延时的时间长度                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

void Delay_MS(uint16 wTime)

{

    s_wSystemDelayTimerCounter = wTime;

   

    while(s_wSystemDelayTimerCounter);

}



extern uint8 Steps;

extern uint16 Delta;



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

*   函数说明:定时器0中断处理程序代码插入函数              *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:无                                           *

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

void Insert_Timer0_OVF_ISR_Code(void)

{

    uint16 *p = (uint16 *)g_cDataBuffer;

    static uint8 n = 0;

    static int8  NowSpeed = 0;

    static BOOL s_bIfCleared = FALSE;

    static uint16 s_wClearCounter = 0;

    extern uint8 Test;

   

    g_wSystemTimer++;



    if (s_wSystemDelayTimerCounter)

    {

        s_wSystemDelayTimerCounter--;

    }

   

    if (!(g_wSystemTimer & 0x03))

    {

        //Set_DISP_BUFF(Steps>>4,Steps<<4>>4,g_cDataBuffer[0]<<4>>4,g_cDataBuffer[1]>>4,g_cDataBuffer[1]<<4>>4);

        //Set_DISP_BUFF(g_dDCounter<<12>>28,g_dDCounter<<16>>28,g_dDCounter<<20>>28,g_dDCounter<<24>>28,g_dDCounter<<28>>28);

        Set_DISP_BUFF(0x0f,Delta>>12,Delta<<4>>12,Delta<<8>>12,Delta<<12>>12);

        //Set_DISP_BUFF(Test<<4>>4,g_cAcceleration>>4,g_cAcceleration<<4>>4,g_cSpeed>>4,g_cSpeed<<4>>4);

    }

   

    PROC_LED_FLASH.IfProcAlive = TRUE;

   

    //g_cAcceleration = 10;

    //g_cSpeed = 110;

   

    if ((g_cAcceleration == 0) && (g_cSpeed == 0))

    {

        if (!s_bIfCleared)

        {

            s_wClearCounter = 1000;

            s_bIfCleared = TRUE;

        }

    }

    else

    {

        s_bIfCleared = FALSE;

    }

   

    if (s_wClearCounter)

    {

        s_wClearCounter--;

        NowSpeed = 0;

        SAFE_CODE_PERFORMANCE

        (

            g_dAimCounter = g_dDCounter;

        )

    }



   

    if (!(g_wSystemTimer & 0x0F))

    {

    if (g_cAcceleration == 0)

    {

    #ifdef _LEFT_MOTOR

        NowSpeed = (-g_cSpeed);

    #else

        NowSpeed = g_cSpeed;

    #endif

   

    }

    else

    {

        n++;

        if (n == (g_cAcceleration ))

        {

            n = 0;

            #ifdef _LEFT_MOTOR

            if (NowSpeed < (-g_cSpeed))

            {

                NowSpeed = NowSpeed+1;

            }

            else if (NowSpeed > (-g_cSpeed))

            {

                NowSpeed = NowSpeed-1;

            }

            #else

            if (NowSpeed < g_cSpeed)

            {

                NowSpeed = NowSpeed+1;

            }

            else if (NowSpeed > g_cSpeed)

            {

                NowSpeed = NowSpeed-1;

            }

            #endif

        }

    }

   

    if (NowSpeed > 0)

    {

        g_dAimCounter+=NowSpeed;

    }

    else

    {

        g_dAimCounter-=(-NowSpeed);

    }

    }

   

}

出0入0汤圆

发表于 2007-8-12 05:49:46 | 显示全部楼层
有模板感觉比较清晰啊



比较适合初学者的说啊



支持,学习



补充:



汗啊



北京前几天大暴雨,好猛的雨



在明光桥那个地方的路段,路上的水淹到了膝盖以上了,哈哈,过瘾啊



我就那站着看笑话,汽车在这里走如果遇到红灯必挂啊,车一踩刹车,水就马上从排气管进去了,然后车就趴着不动了,我足足站了半个小时,看到好多车挂了,哈哈

出0入296汤圆

发表于 2007-8-12 05:50:14 | 显示全部楼层
对应的.h文件



#ifndef _USE_EX_SUPPORT_H_

#define _USE_EX_SUPPORT_H_

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

*   声明库说明:底层硬件初始化驱动声明库                   *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:                                           *

*   需要版本:                                             *

*   声明库说明:                                           *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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



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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/



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

*    结构体定义区   *

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



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

*   函 数 引 用 区  *

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

extern void System_INIT(void);

extern void Delay_MS(uint16 wTime);

extern void Insert_Timer0_OVF_ISR_Code(void);



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

*   全局变量引用区  *

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

extern uint16 g_wSystemTimer;

extern uint32 g_dDCounter;

#endif
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-8-12 05:50:52 | 显示全部楼层
这样一挂,一修车至少几百,有可能几千了。



我的车已经购买了水淹保险,哈哈,不怕!  我们邮购部的另外一部车,昨天不小心撞坏尾部了,下周一达到汽车服务公司维修,也是保险公司付帐。



现在的汽车保险真方便啊,出了问题根本不需要找保险公司,找回汽车服务公司,签个名就行了。二天后就会交给你一部新车,出问题的原因你也不用担心,汽车服务公司会帮你安排好的。

出0入296汤圆

发表于 2007-8-12 05:51:41 | 显示全部楼层
PF_Config.h

这个文件是配置 整个硬件抽象层的核心文件,也是其他.c文件在牵涉到硬件特性,或者想使用底层API时需要包含的文件。



#ifndef _USE_PF_CONFIG_H_

#define _USE_PF_CONFIG_H_

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

*   声明库说明:硬件平台配置声明库                         *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [硬件说明]                                              *

*   处理器:                                               *

*   系统时钟:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   库名称:    RD_MacroAndConst.h                         *

*   需要版本:  v0.01 &abv                                 *

*   支持库说明:系统常用宏定义库                           *

*                                                          *

*   支持库名称:LIB_Config.h                               *

*   需要版本:  -----                                      *

*   声明库说明:库函数配置声明库                           *

*                                                          *

*   支持库名称:EX_Support.h                               *

*   需要版本:  -----                                      *

*   声明库说明:底层硬件初始化驱动声明库                   *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include "RD_MacroAndConst.h"

# include "LIB_Config.h"

# include "PROC_Config.h"

# include "HD_Support.h"

# include "EX_Support.h"

# include "PROC_Communication.h"



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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/

# define ADDRESS            0x85

# define MOTOR_P            20



//# define _LEFT_MOTOR



# define TIMER1_TOP_VALUE   0x04E2



/*------------------*

*   动 作 宏 定 义  *

*------------------*/

# define INSERT_TIMER0_OVF_ISR_CODE SEI();Insert_Timer0_OVF_ISR_Code();

# define INSERT_USART0_RX_ISR_CODE  COMM_INSERT_USART0_RX_ISR_CODE



# define INSERT_USART0_TX_ISR_CODE  COMM_INSERT_USART0_TX_ISR_CODE

# define INSERT_INT0_ISR_CODE   {\

                                    if (MOTOR_DIRECTION)\

                                    {\

                                        g_dDCounter++;\

                                    }\

                                    else\

                                    {\

                                        g_dDCounter--;\

                                    }\

                                }

                                    



# define USE_9BIT



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

*    结构体定义区   *

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



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

*   函 数 引 用 区  *

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



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

*   全局变量引用区  *

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



#endif

出0入296汤圆

发表于 2007-8-12 05:53:32 | 显示全部楼层
这是主程序,大家注意到没有



主程序中为了使用底层硬件,直接包含了PF_Config.h。因为我提供的只是一个例子。这个例子中,还有一个部分就是小型时间调度器。他直接建立在应用层上,我就不粘贴代码了。它也有一个唯一的配置文件PROC_Config.h



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

*   源程序说明:                                           *

*   版本:                                                 *

*   作者:                                                 *

*   创建日期:                                             *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:EX_Support.h                               *

*   需要版本:  -----                                      *

*   声明库说明:底层硬件初始化驱动声明库                   *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:                                                 *

*   修改日期:                                             *

*   版本:                                                 *

* -------------------------------------------------------- *

*  [版本历史]                                              *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include "PF_Config.h"

# include "PROC_Config.h"



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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/



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

*  模块结构体定义区 *

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



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

*   模块函数声明区  *

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



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

*   模块变量声明区  *

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

uint8 Steps = 0;







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

*   函数说明:主函数                                       *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:System_INIT()                                *

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

void main(void)

{

    System_INIT();                                          //代码初始化

   

    LED_WORK = LED_FLASH_VERY_FAST;



    while(TRUE)                                             //超级循环

    {

        COS_INSERT_SUPER_LOOP_CODE

        //PROC_Motor_Postion_Control();

    }                                            

}

出0入296汤圆

发表于 2007-8-12 05:54:22 | 显示全部楼层
这样一个程序,如果需要移植,修改得最多只有HD_Config.c和Ex_Config.c。

别说跨编译器了,跨平台问题都不打哈。HOHO~~~~~~~~~

出0入296汤圆

发表于 2007-8-12 05:57:07 | 显示全部楼层
上传上面例子的完整工程构架



出0入0汤圆

发表于 2007-8-12 06:03:28 | 显示全部楼层
不错,不错啊,确实清晰啊,值得借鉴啊



有时候看到优秀的代码风格觉得赏心悦目啊

出0入0汤圆

发表于 2007-8-12 08:06:35 | 显示全部楼层
看成功者的花环和看失败者的眼泪,感觉是很不一样的

出0入0汤圆

发表于 2007-8-12 09:05:35 | 显示全部楼层
不会开车的人不管开什么车都会掉沟里去,爬出来嘴里还嘟囔:"这是啥破车"......

好多人都在问:

用啥编译器,用啥布线软件,用啥芯片......

不如先把基本功打牢了.

另外,Gcc有n多的源码,代码风格也很好,即使看看也受益不浅.

出0入0汤圆

发表于 2007-8-12 09:14:28 | 显示全部楼层
只要代码功能划分得好,不同编译器间移植难度并不高。

出0入137汤圆

发表于 2007-8-12 09:47:51 | 显示全部楼层
还是选择通用的。iar或gcc,其他就算了。不通用只是针对avr

出0入0汤圆

发表于 2007-8-12 23:21:37 | 显示全部楼层
帮人家改过一个工程。从ICC转GCC,1天不到的时间就搞完了,编译一次通过,其实只要是C语言,转换问题都不大,碰到某编译器专用的函数,直接在另一个里写同样功能同样名称的函数就立即可以编译通过了。不过跨语言的编译器~~~~~还是重写比较好,呵呵。



PC软件的编译器更加多如牛毛,也不见难交流,各有各的讨论圈子,如果阿莫觉得难整理,就按照语言分类来分论坛,好东西转公共论坛大家共享就得了。

出0入0汤圆

发表于 2007-8-12 23:43:21 | 显示全部楼层
支持 Gorgon Meducer 傻孩子,



虽然近期很麻烦,



从长远看维护修改方便,



值得的学习的软件思想。。。

出0入0汤圆

发表于 2007-8-13 00:58:34 | 显示全部楼层
漂亮~~

出0入0汤圆

发表于 2007-8-13 09:43:35 | 显示全部楼层
菜鸟是会有这样的感觉,熟手就融汇贯通了

出0入42汤圆

发表于 2007-8-13 16:49:21 | 显示全部楼层
好啊,学习了~~~~~~

出0入42汤圆

发表于 2007-8-13 18:05:37 | 显示全部楼层
请问Gorgon Meducer 傻孩子,在T0中断程序中,INSERT_TIMER0_OVF_ISR_CODE代码是怎么插进去的?还是中断之后直接调用INSERT_TIMER0_OVF_ISR_CODE函数呢?谢谢





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

*   函数声明:定时器0溢出中断处理程序                      *

*   输入:    无                                           *

*   输出:    无                                           *

*   调用函数:INSERT_TIMER0_OVF_ISR_CODE                   *

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

void Timer0_OVF_ISR(void)

{

    TCNT0 = 0xB2;

     

    INSERT_TIMER0_OVF_ISR_CODE

}

出0入0汤圆

发表于 2007-8-13 19:43:45 | 显示全部楼层

出0入0汤圆

发表于 2007-8-13 20:11:33 | 显示全部楼层
IAR和GCC,其他杂牌一概不用.

出0入42汤圆

发表于 2007-8-13 21:53:56 | 显示全部楼层
【27楼】 linhaimi



我觉得左边那本书更有吸引力,呵呵

出0入0汤圆

发表于 2007-8-14 00:02:06 | 显示全部楼层
在一份Atmel的官方例子中给出了不同编译器之间转换的一个头文件,可以参考:



compiler.h:



/*H**************************************************************************

* NAME:         compiler.h

*----------------------------------------------------------------------------

* Copyright (c) 2004 Atmel.

*----------------------------------------------------------------------------

* RELEASE:      at90usb128-stk525-demo-dms-host-ms-1_0_0

* FILE_REV:     1.13.2.27

*----------------------------------------------------------------------------

* PURPOSE:

* This file redefines dedicated IAR AVR

* keywords in order to ensure that any source file can be processed by

* these compilers.

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



#ifndef _COMPILER_H_

#define _COMPILER_H_



/*_____ I N C L U D E S ____________________________________________________*/





/*_____ D E C L A R A T I O N S ____________________________________________*/

#define LITTLE_ENDIAN



#ifndef ASM_INCLUDE // define ASM_INCLUDE in your a51 source code before include of .h file

typedef float               Float16;



typedef unsigned char       U8 ;

typedef unsigned short      U16;

typedef unsigned long       U32;

typedef signed char         S8 ;

typedef signed short        S16;

typedef long                S32;

#if (defined __C51__)

typedef bit                 Bool;    // Shall be used with _MEM_TYPE_BIT_ to optimize the memory.

#else

typedef unsigned char       Bool;

#endif



typedef U8                  Status;

typedef Bool                Status_bool;

#define PASS 0

#define FAIL 1







#if (defined __C51__)

#  define _MEM_TYPE_BIT_              bdata  // Used for bit accesses

#  define _MEM_TYPE_FAST_              data

#  define _MEM_TYPE_MEDFAST_          idata

#  define _MEM_TYPE_MEDSLOW_          pdata

#  define _MEM_TYPE_SLOW_             xdata

#else

#  define _MEM_TYPE_BIT_

#  define _MEM_TYPE_FAST_

#  define _MEM_TYPE_MEDFAST_

#  define _MEM_TYPE_MEDSLOW_

#  define _MEM_TYPE_SLOW_

#endif



typedef unsigned char       Uchar;





typedef unsigned char       Uint8;

typedef unsigned int        Uint16;

typedef unsigned long int   Uint32;



typedef char                Int8;

typedef int                 Int16;

typedef long int            Int32;



typedef unsigned char       Byte;

typedef unsigned int        Word;

typedef unsigned long int   DWord;



typedef union

{

  Uint32 dw; // l changed in dw (double word) because l is used for signed long...

  Uint16 w[2];

  Uint8  b[4];

} Union32;



typedef union

{

  Uint16 w;

  Uint8  b[2];

} Union16;



#ifdef __IAR_SYSTEMS_ICC__

typedef char     bit;

typedef int      p_uart_ptchar;

typedef int      r_uart_ptchar;

#endif

#ifdef __CODEVISIONAVR__

typedef char     bit;

typedef int      p_uart_ptchar;

typedef char     r_uart_ptchar;

#endif

#if !defined(__IAR_SYSTEMS_ICC__) && !defined(___ICC__)

typedef char      p_uart_ptchar;

typedef char      r_uart_ptchar;

#endif



#endif



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

/* codevision COMPILER (__CODEVISIONAVR__)                                                 */

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

#ifdef __ICC__

#define _ConstType_        lit

#define _MemType_

#define _GenericType_ __generic

#define code lit

#define xdata

#define idata

#define data

#endif

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

/* IAR COMPILER (__IAR_SYSTEMS_ICC__)                                             */

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

#ifdef __IAR_SYSTEMS_ICC__

#include "inavr.h"

#define _ConstType_        __flash

#define _MemType_

#define _GenericType_ __generic

#define code __flash

#define farcode __farflash

#define xdata

#define idata

#define data

#define At(x) @ x

#define pdata

#define bdata

// Memory Type Location

#ifndef _CONST_TYPE_

#  define _CONST_TYPE_ code

#endif



#define Enable_interrupt() __enable_interrupt()

#define Disable_interrupt() __disable_interrupt()

#endif





/* General purpose defines */

/*#define _ConstType_        __farflash

#define _MemType_

#define _GenericType_ __generic

#define code __farflash

#define xdata

#define idata

#define data*/









/*_____ M A C R O S ________________________________________________________*/

/* little-big endian management */

#define INTEL_ALIGNMENT     LITTLE_ENDIAN

#define MOTOROLA_ALIGNMENT  BIG_ENDIAN



// U16/U32 endian handlers

#ifdef LITTLE_ENDIAN     // => 16bit: (LSB,MSB), 32bit: (LSW,MSW) or (LSB0,LSB1,LSB2,LSB3) or (MSB3,MSB2,MSB1,MSB0)

#  define MSB(u16)        (((U8* )&u16)[1])

#  define LSB(u16)        (((U8* )&u16)[0])

#  define MSW(u32)        (((U16*)&u32)[1])

#  define LSW(u32)        (((U16*)&u32)[0])

#  define MSB0(u32)       (((U8* )&u32)[3])

#  define MSB1(u32)       (((U8* )&u32)[2])

#  define MSB2(u32)       (((U8* )&u32)[1])

#  define MSB3(u32)       (((U8* )&u32)[0])

#  define LSB0(u32)       MSB3(u32)

#  define LSB1(u32)       MSB2(u32)

#  define LSB2(u32)       MSB1(u32)

#  define LSB3(u32)       MSB0(u32)

#else // BIG_ENDIAN         => 16bit: (MSB,LSB), 32bit: (MSW,LSW) or (LSB3,LSB2,LSB1,LSB0) or (MSB0,MSB1,MSB2,MSB3)

#  define MSB(u16)        (((U8* )&u16)[0])

#  define LSB(u16)        (((U8* )&u16)[1])

#  define MSW(u32)        (((U16*)&u32)[0])

#  define LSW(u32)        (((U16*)&u32)[1])

#  define MSB0(u32)       (((U8* )&u32)[0])

#  define MSB1(u32)       (((U8* )&u32)[1])

#  define MSB2(u32)       (((U8* )&u32)[2])

#  define MSB3(u32)       (((U8* )&u32)[3])

#  define LSB0(u32)       MSB3(u32)

#  define LSB1(u32)       MSB2(u32)

#  define LSB2(u32)       MSB1(u32)

#  define LSB3(u32)       MSB0(u32)

#endif



// Endian converters

#define Le16(b)                        \

   (  ((U16)(     (b) &   0xFF) << 8)  \

   |  (     ((U16)(b) & 0xFF00) >> 8)  \

   )

#define Le32(b)                             \

   (  ((U32)(     (b) &       0xFF) << 24)  \

   |  ((U32)((U16)(b) &     0xFF00) <<  8)  \

   |  (     ((U32)(b) &   0xFF0000) >>  8)  \

   |  (     ((U32)(b) & 0xFF000000) >> 24)  \

   )



// host to network conversion: used for Intel HEX format, TCP/IP, ...

// Convert a 16-bit value from host-byte order to network-byte order

// Standard Unix, POSIX 1003.1g (draft)



#ifdef LITTLE_ENDIAN

#  define htons(a)    Le16(a)

#define ntohs(a)    htons(a)

#  define htonl(a)    Le32(a)

#define ntohl(a)    htonl(a)

#else

#define htons(a)    (a)

#define ntohs(a)    (a)

#define htonl(a)    (a)

#define ntohl(a)    (a)

#endif





// Constants

#define ENABLE   1

#define ENABLED  1

#define DISABLED 0

#define DISABLE  0

#define FALSE   (0==1)

#define TRUE    (1==1)



#define KO      0

#define OK      1

#define OFF     0

#define ON      1

#define NULL    0

#ifndef ASM_INCLUDE // define ASM_INCLUDE in your a51 source code before include of .h file

#define CLR     0

#define SET     1

#endif



/* Bit and bytes manipulations */

#define LOW(U16)                ((Uchar)U16)

#define HIGH(U16)               ((Uchar)(U16>>8))

#define TST_BIT_X(addrx,mask)   (*addrx & mask)

#define SET_BIT_X(addrx,mask)   (*addrx = (*addrx | mask))

#define CLR_BIT_X(addrx,mask)   (*addrx = (*addrx & ~mask))

#define OUT_X(addrx,value)      (*addrx = value)

#define IN_X(addrx)             (*addrx)



#  define Max(a, b)            ( (a)>(b) ? (a) : (b) )       // Take the max between a and b

#  define Min(a, b)            ( (a)<(b) ? (a) : (b) )       // Take the min between a and b



// Align on the upper value <val> on a <n> boundary

// i.e. Upper(0, 4)= 4

//      Upper(1, 4)= 4

//      Upper(2, 4)= 4

//      Upper(3, 4)= 4

//      Upper(4, 4)= 8

//      ../..

#  define Upper(val, n)        ( ((val)+(n)) & ~((n)-1) )



// Align up <val> on a <n> boundary

// i.e. Align_up(0, 4)= 0

//      Align_up(1, 4)= 4

//      Align_up(2, 4)= 4

//      Align_up(3, 4)= 4

//      Align_up(4, 4)= 4

//      ../..

#  define Align_up(val, n)     ( ((val)+(n)-1) & ~((n)-1) )



// Align down <val> on a <n> boundary

// i.e. Align_down(0, 4)= 0

//      Align_down(1, 4)= 0

//      Align_down(2, 4)= 0

//      Align_down(3, 4)= 0

//      Align_down(4, 4)= 4

//      ../..

#  define Align_down(val, n)   (  (val)        & ~((n)-1) )



/*M**************************************************************************

* NAME: Long_call

*----------------------------------------------------------------------------

* PARAMS:

* addr: address of the routine to call

*----------------------------------------------------------------------------

* PURPOSE:

* Call the routine at address addr: generate an Assembly LCALL addr opcode.

*----------------------------------------------------------------------------

* EXAMPLE:

* Long_call(0); // Software reset (if no IT used before)

*----------------------------------------------------------------------------

* NOTE:

* May be used as a long jump opcode in some special cases

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

#define Long_call(addr)         ((*(void (_ConstType_*)(void))(addr))())



/* {For Langdoc} */



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

SET_SFR_BIT macro

  parameters

    sfr_reg : defined value in include file for sfr register

    bit_pos : defined value B_XX in include file for particular

              bit of sfr register

    bit_val : CLR / SET

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

#define SET_SFR_BIT(sfr_reg, bit_pos, bit_val) { sfr_reg &= ~(1<<(bit_pos)); sfr_reg |= ((bit_val)<<(bit_pos));}



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

bit_is_clear macro

  parameters

    PORT     : defined value in include file for sfr register

    POSITION : defined value in include file for particular

              bit of sfr register

  example : if (bit_is_clear(PORTB,PORTB3)) ...

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

#define bit_is_clear(PORT,POSITION) ((PORT & (1<<POSITION)) == 0 )



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

bit_is_set macro

  parameters

    PORT     : defined value in include file for sfr register

    POSITION : defined value in include file for particular

              bit of sfr register

  example : if (bit_is_set(PORTB,PORTB3)) ...

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

#define bit_is_set(PORT,POSITION) ((PORT & (1<<POSITION)) != 0 )







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

/* IAR COMPILER                                                               */

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



#define __IOMACRO_H



#define TID_GUARD(proc) ((__TID__ & 0x7FF0) != ((90 << 8) | ((proc) << 4)))





/*----------------------------------------------------------------------------*/

#ifdef __IAR_SYSTEMS_ASM__

/*----------------------------------------------------------------------------*/



/* Byte sized SFRs */

#define SFR_B_BITS(_NAME,_ADDR,_A,_B,_C,_D,_E,_F,_G,_H)\

        sfrb        _NAME = _ADDR

#define SFR_B_BITS_EXT(_NAME,_ADDR,_A,_B,_C,_D,_E,_F,_G,_H)\

        sfrb        _NAME = _ADDR

#define SFR_B2_BITS(_NAME1,_NAME2,_ADDR,_A,_B,_C,_D,_E,_F,_G,_H)\

        ASMSFRB2 _NAME1, _NAME2, _ADDR



ASMSFRB2 MACRO

        sfrb        \1 = \3

        sfrb        \2 = \3

        ENDM





/* Word sized SFRs, needs to be expanded into an assembler macro first. */

#define SFR_W_BITS(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, _I,_J,_K,_L,_M,_N,_O,_P)\

        ASMSFRW        _NAME, _ADDR



#define SFR_W_BITS_EXT(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, _I,_J,_K,_L,_M,_N,_O,_P)\

        ASMSFRW        _NAME, _ADDR



ASMSFRW        MACRO

        sfrw        \1  = \2

        sfrb        \1L = (\2+0)

        sfrb        \1H = (\2+1)

        ENDM



#endif /* __IAR_SYSTEMS_ASM__ */



/*----------------------------------------------------------------------------*/

#ifdef __ICCAVR__

/*----------------------------------------------------------------------------*/

#define __BYTEBITS(_NAME,_A,_B,_C,_D,_E,_F,_G,_H) \

unsigned char _NAME ## _ ## _A:1, \

              _NAME ## _ ## _B:1, \

              _NAME ## _ ## _C:1, \

              _NAME ## _ ## _D:1, \

              _NAME ## _ ## _E:1, \

              _NAME ## _ ## _F:1, \

              _NAME ## _ ## _G:1, \

              _NAME ## _ ## _H:1;



#define SFR_B_BITS(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H) \

    __io union { \

      unsigned char   _NAME;           /* The sfrb as 1 byte */ \

      struct {                        /* The sfrb as 8 bits */ \

        __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \

      };  \

    } @ _ADDR;

#define SFR_B2_BITS(_NAME1, _NAME2, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H) \

    __io union { \

      unsigned char   _NAME1;           /* The sfrb as 1 byte */ \

      unsigned char   _NAME2;           /* The sfrb as 1 byte */ \

      struct {                        /* The sfrb as 8 bits */ \

        __BYTEBITS(_NAME1, _A,_B,_C,_D,_E,_F,_G,_H) \

      };  \

      struct {                        /* The sfrb as 8 bits */ \

        __BYTEBITS(_NAME2, _A,_B,_C,_D,_E,_F,_G,_H) \

      };  \

    } @ _ADDR;

#define SFR_B_BITS_EXT(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H) \

    __tiny __no_init volatile union { \

      unsigned char   _NAME;           /* The sfrb as 1 byte */ \

      struct {                        /* The sfrb as 8 bits */ \

        __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H) \

      };  \

    } @ _ADDR;



#define SFR_W_BITS(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, _I,_J,_K,_L,_M,_N,_O,_P) \

    __io union { \

      unsigned short  _NAME;  /* The sfrw as 1 short */ \

      struct {                /* The sfrw as 16 bits */ \

        __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H)   /* Bit names defined by user */  \

        __BYTEBITS(_NAME, _I,_J,_K,_L,_M,_N,_O,_P)   /* Bit names defined by user */  \

      };  \

      struct { /* The sfrw as 2 bytes */ \

        unsigned char _NAME ## L; \

        unsigned char _NAME ## H; \

      };  \

      struct {                          /* The sfrw as 2 x 8 bits */ \

        __BYTEBITS(_NAME ## L, Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)  /* Bit names hard coded to 0-7 */ \

        __BYTEBITS(_NAME ## H, Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)  /* Bit names hard coded to 0-7 */ \

      };  \

    } @ _ADDR;



#define SFR_W_BITS_EXT(_NAME, _ADDR, _A,_B,_C,_D,_E,_F,_G,_H, _I,_J,_K,_L,_M,_N,_O,_P) \

   __io union { \

    unsigned short  _NAME;   \

     struct {                /* The sfrw_ext as 16 bits */ \

        __BYTEBITS(_NAME, _A,_B,_C,_D,_E,_F,_G,_H)   /* Bit names defined by user */  \

        __BYTEBITS(_NAME, _I,_J,_K,_L,_M,_N,_O,_P)   /* Bit names defined by user */  \

      };  \

      struct { /* The sfrw _ext as 2 bytes */ \

        unsigned char _NAME ## L; \

        unsigned char _NAME ## H; \

      };  \

      struct {                          /* The sfrw_ext as 2 x 8 bits */ \

        __BYTEBITS(_NAME ## L, Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)  /* Bit names hard coded to 0-7 */ \

        __BYTEBITS(_NAME ## H, Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)  /* Bit names hard coded to 0-7 */ \

      };  \

    } @ _ADDR;



#endif



#define SFR_B(_NAME, _ADDR) SFR_B_BITS(_NAME, _ADDR, \

                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)

#define SFR_B2(_NAME1, _NAME2, _ADDR) SFR_B2_BITS(_NAME1, _NAME2, _ADDR, \

                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)

#define SFR_B_EXT(_NAME, _ADDR) SFR_B_BITS_EXT(_NAME, _ADDR, \

                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)



#define SFR_W(_NAME, _ADDR)  SFR_W_BITS(_NAME, _ADDR, \

                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7, \

                                    Bit8,Bit9,Bit10,Bit11,Bit12,Bit13,Bit14,Bit15)



#define SFR_W_EXT(_NAME, _ADDR)  SFR_W_BITS_EXT(_NAME, _ADDR, \

                                    Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7, \

                                    Bit8,Bit9,Bit10,Bit11,Bit12,Bit13,Bit14,Bit15)



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

/* GCC COMPILER                                                               */

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

   #ifdef AVRGCC

#define _CONST_TYPE_

#define _ConstType_        __flash

#define _MemType_

#define _GenericType_ __generic

#define code PROGMEM

#define xdata

#define idata

#define data

#define At(x) @ x

#define pdata

#define bdata

#define bit        U8

#define bool U8

   //#include <avr/sfr_defs.h>

   #include <avr/interrupt.h>

   #include <avr/pgmspace.h>

   #define Enable_interrupt() sei()

   #define Disable_interrupt() cli()



   #endif

#endif /* _COMPILER_H_ */

点击此处下载armok01166301.txt

出0入296汤圆

发表于 2007-8-14 02:16:05 | 显示全部楼层
to【26楼】 my_avr :

你注意到在HD_Support.c中引用了一个配置头文件PF_Config.h

而在这个头文件中,我们定义了插入中断的宏:





# define INSERT_TIMER0_OVF_ISR_CODE SEI();Insert_Timer0_OVF_ISR_Code();

# define INSERT_USART0_RX_ISR_CODE  COMM_INSERT_USART0_RX_ISR_CODE



# define INSERT_USART0_TX_ISR_CODE  COMM_INSERT_USART0_TX_ISR_CODE

# define INSERT_INT0_ISR_CODE   {\

                                    if (MOTOR_DIRECTION)\

                                    {\

                                        g_dDCounter++;\

                                    }\

                                    else\

                                    {\

                                        g_dDCounter--;\

                                    }\

                                }

                                    



# define USE_9BIT





这才是问题的关键哈。





------------------------------------------------------

依靠头文件实现 跨编译器 是一个不错的解决方法,不过我觉得,如果一开始就从构架上作跨平台的考虑,可能更充分些。

出0入0汤圆

发表于 2007-8-14 08:18:59 | 显示全部楼层
不错,一些底层驱动函数要分开,重新选择cpu时,只要修改甚至改变头文件的配置就可以重新使用。个人觉得avr的gcc源码太丰富了,从操作系统的支持到总线接口和常用器件的支持,应有尽有。第一次使用时要注意些外,其后只要注意程序的框架,大部分程序就像搭积木一样,很快就能完成。

出0入0汤圆

发表于 2007-8-14 09:36:40 | 显示全部楼层
有点楼主说的感觉

出0入42汤圆

发表于 2007-8-14 11:08:07 | 显示全部楼层
谢谢 Gorgon Meducer 傻孩子  



还是拿T0溢出中断来说吧,按照您的宏定义的话,T0溢出中断程序:



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

*   函数声明:定时器0溢出中断处理程序                      *  

*   输入:    无                                           *  

*   输出:    无                                           *  

*   调用函数:INSERT_TIMER0_OVF_ISR_CODE                   *  

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

void Timer0_OVF_ISR(void)  

{  

    TCNT0 = 0xB2;  

      

    INSERT_TIMER0_OVF_ISR_CODE  

}  



经过编译之后,就相当于是:

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

*   函数声明:定时器0溢出中断处理程序                      *  

*   输入:    无                                           *  

*   输出:    无                                           *  

*   调用函数:INSERT_TIMER0_OVF_ISR_CODE                   *  

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

void Timer0_OVF_ISR(void)  

{  

    TCNT0 = 0xB2;  

      

    SEI();

    Insert_Timer0_OVF_ISR_Code();

}



不知道我分析的对不对?请指点,谢谢!

出0入296汤圆

发表于 2007-8-15 04:26:19 | 显示全部楼层
恩,就是这个道理。

这种方法能够将硬件初始化的部分完全独立出来。AVR单片机不同型号之间的移植就依靠更改这个文件来实现。另外,把中断处理程序部分独立出来,就方便了我们编写一定的辅助软件来自动生成HD_Support.c

出0入296汤圆

发表于 2007-8-15 23:37:06 | 显示全部楼层
如约,上传基本工程模板。使用ICC。该模板对任意型号AVR都支持类似51式的位操作。

例如_PB5 = 0;DDR_PB1 = 1;之类。

提供一些长用的宏。提供基本的数据类型 uint8 uint16 uint32 BOOL 。

提供对BYTE、WORD、DWORD的位、半字节、字节、字的划分宏。

支持任意类型自由转换的宏TYPE_CONVERSTION()。

支持基本的绝对值宏ABS()

支持原子操作 SAFE_CODE_PERFORMANCE();

……

相关内容,请仔细阅读模板中,各个文件的使用说明。点击此处下载armok01166598.rar

出0入0汤圆

发表于 2007-8-16 01:10:40 | 显示全部楼层
谢谢 Gorgon Meducer 傻孩子

下载学习

出0入0汤圆

发表于 2007-8-16 20:38:59 | 显示全部楼层
Gorgon Meducer 傻孩子



能不能据个例子,



怎样操作?

出0入0汤圆

发表于 2011-12-26 14:56:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-26 18:58:23 | 显示全部楼层
思想 很棒!

出0入0汤圆

发表于 2011-12-26 19:44:47 | 显示全部楼层
我的妈呀,这工程结构大得,让我开始害怕工程结构了

出0入8汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 01:06

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

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