原创 AVR C++中友元的使用及操作符重载

2007-9-18 23:15 3709 9 11 分类: MCU/ 嵌入式

AVR C++中友元的使用及操作符重载



作者: TestCode



. 友元的使用



C++中,不能直接调用中断函数,因此就不能将中断函数声明为类的成员函数。然而C++中,类的数据成员一般声明为private。中断函数对类的私有成员的访问可以通过友元机制来实现。



 



以下以Atmega32为例:



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



Name        
:  uart.h



Description 
:  Header file for Mega32 Uart
driver.



Author      
:  2007-09-17 - TestCode



Compiler    
:  WINAVR Version: 20070525



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



#ifndef _C_Com_H_



#define _C_Com_H_



 



#ifdef __cplusplus



extern "C"



{



#endif



 



#include



#include



#include



#include "buffer.h"



#include



#include "iodev.h"



 



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



*                                   Definitions



*/



#ifndef FALSE



#define FALSE                 (0)



#endif



#ifndef TRUE



#define TRUE                  (1)



#endif



//



#define BAUD_9600       (9600)



#define BAUD_115K       (115200)



#define BAUD_230K       (230400)



#define BAUD_460K       (460800)



#define BAUD_920K       (921600)



 



//



#define TAB                           (0x09)



#define BACKSPACE             (0x08)



#define SPACE                 (0x20)



#define PERIOD                (0x2E)



#define CR              (0x0D)



#define LF              (0x0A)



#define ESCAPE          (0x1B)



 



void USART_RXC_vect(void)
__attribute__ ((signal));



//void USART_TXC_vect(void)
__attribute__ ((signal));



 



class Buffer;



class IO;



 



class C_Com



{



private:



    Buffer
uartRxBuffer;



    static
C_Com* pUart;



    long
BAUDRATE;



   



public:



            C_Com(void);



    void
Init(long baud);



    void
put_c(unsigned char c);



    char
Send(unsigned char* pBuffer, unsigned int uiSize);



    char
Send(unsigned int uiSize);//Send UartBuffer String



    char
GetByte(void);



        friend void USART_RXC_vect(void);



        //friend void USART_TXC_vect(void);



        friend class IO;



        friend class IO_P;



};



 



#ifdef __cplusplus



}



#endif



 



#endif



 



通过把USART_RXC_vect中断函数定义为C_Com的友元,USART_RXC_vect可以对C_Com的私有成员进行操作。



 



. 操作符重载



提到重载,大家很自然想到成员函数重载,函数重载实现赋给同一个函数名多个含义。以下例子中,C++中通过重新定义运算符,不仅g++生成的代码也十分简洁高效,很直观地实现串口驱动的输入及输出。



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



Name         : 
iodev.h



Description  : 
Header file for io device.



Author       : 
2007-09-17 - TestCode



Compiler     : 
WINAVR Version: 20070525



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



#ifndef IO_H_



#define IO_H_



#include
"avr/io.h"



#include



#include
"uart.h"



#include



 



#ifdef __cplusplus



extern "C"



{



#endif



 



class C_Com;



class IO;



class IO_P;



 



extern IO cout, cin;



extern IO_P cout_P;



 



// Debug class.



class IO



{



public:



            /// Sending strings.



            IO& operator << (char const*);



            /// Sending unsigned integers.



            IO& operator << (unsigned int);



            IO& operator >> (char*);  // Read strings.



};



 



class IO_P



{



public:



            IO_P& operator << (PGM_P data);  // Read strings.



};



 



#ifdef __cplusplus



}



#endif



 



#endif /*_IO_H_*/



 



. 测试结果:



 



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



Name         : 
main.cpp



Description  : 
Mega32 Uart c++ sample.



Author       : 
2007-09-17 - TestCode



Compiler     : 
WINAVR Version: 20070525



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



#include



#include
"uart.h"



#include



#include
"iodev.h"



 



prog_char FlashString[]
PROGMEM ="Flash String";



 



int main()



{



            unsigned int Test = 123;



            char str[32];



           



            cout<<"HelloWorld\r\n"<<<"\r\n";



            cout_P<

("program>

            cout_P<

;>

            while(1)



            {



                        cin>>str;



                        cout<<"Your type in:
"<<<"\r\n";



            }



            return 0;



}



 



测试结果:



点击看大图

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1360014 2007-10-27 09:46

现在正在学习avr,以后多多指教啊

用户74185 2007-10-22 12:46

perfect

 

相关推荐阅读
用户91462 2010-02-19 02:36
转贴:ATxmega128A1 software CRC that matches hardware
/* 摘自avrfreaks * The Xmega manual Rev G lists the CRC Polynomial * as:  x^24 + 4x3 + 3x +1. * * Base...
用户91462 2009-12-05 04:17
ATxmega外部时钟设置以及USART串口使用范例
与ATmega相比,Atxmega系列的系统时钟最大的优点是安全,不会出现因为熔丝设置错误而无法正常工作的工作。另外一个特点是更加灵活,无需通过外部熔丝设置,可以在程序代码中设置系统的时钟。Atxme...
用户91462 2008-11-22 08:48
转帖:MLCC电容的应用
“Interference suppression using a balanced MLCC”...
用户91462 2008-08-28 01:23
使用命令行快速编译AVR
在批处理时,要给芯片烧写程序,设置熔丝位以及加锁。简单的方法是建立一个*.bat文件,添加例如:STK500.EXE -dATmega64 -lCC -ms -e -fD8FF -EFF -I9216...
用户91462 2008-06-13 04:38
AT91SAM7S64开发板电路图及调试
从OURAVR上购得一块AT91SAM7S64的开发板,添加如下At91sam7s64开发板原理图。原理图画得很倒塌,有好几处问题,初步调试:1. U5 RC-8025: Actually Part ...
用户91462 2008-06-07 06:06
使用SAM-BA调试的初始步骤
AT91SAM7S板可以使用SAM-BA?软件通过DBGU或者USB口编译。但是AT91SAM7S 系列芯片,出厂后并没有将SAM-BA Boot 固件复制到FLASH 存储器的头两个区,所以当第一次...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /3 下一条