打印
[AVR单片机]

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

[复制链接]
1902|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
testcode|  楼主 | 2007-9-18 03:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AVR, C++, IO, ST, TE
作者: 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 <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "buffer.h"
#include <avr/pgmspace.h>
#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 <stdlib.h>
#include "uart.h"
#include <avr/pgmspace.h>

#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 <avr/io.h>
#include "uart.h"
#include <avr/pgmspace.h>
#include "iodev.h"

prog_char FlashString[] PROGMEM ="Flash String";

int main()
{
    unsigned int Test = 123;
    char str[32];
    
    cout<<"HelloWorld "<<Test<<" ";
    cout_P<<PSTR("Program Memory String");
    cout_P<<FlashString;
    while(1)
    {
        cin>>str;
        cout<<"Your type in: "<<str<<" ";
    }
    return 0;
}

测试结果:

相关帖子

沙发
wolver| | 2007-9-18 10:04 | 只看该作者

标记....

没用过C++,不过以后用的时候,可以参考你的思想。

使用特权

评论回复
板凳
HotPower| | 2007-9-21 16:26 | 只看该作者

友元还是不能解决一切~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

245

帖子

0

粉丝