原创 关于gccavr中将C++的类成员函数做为中断函数的问题(TestCode实现)

2008-2-9 04:40 3897 6 6 分类: MCU/ 嵌入式
testcode 发表于 2005-7-15 00:53 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 是否要将中断程序加入C++类中?


用gcc-avr时,是否将中断程序加入C++类中?
这样做有什么问题吗?好像看到有的人建议不要这样做???


 


testcode 发表于 2005-7-15 01:35 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


3楼: 中断程序加入C++类中的方法


还未具体跑过,是否符合要求,只是代码通过...
#include
class Com_1
{
...
public:
...
   void SIG_USART1_RECV( void ) __attribute__ ( ( signal ) );
};

void Com_1::SIG_USART1_RECV( void )
{
    char InputCh,TempPntr;
    unsigned char status,resh;
    TempPntr = Com_1::RxInPntr;
    status = UCSR1A;
    resh = UCSR1B;
    InputCh = UDR1;    //Get character
}
生成的.lss文件如下:
void Com_1::SIG_USART1_RECV( void )
{
26e:    1f 92           push    r1
270:    0f 92           push    r0
272:    0f b6           in    r0, 0x3f    ; 63
274:    0f 92           push    r0
276:    11 24           eor    r1, r1
278:    8f 93           push    r24
    char InputCh,TempPntr;
    unsigned char status,resh;

    TempPntr = Com_1::RxInPntr;
27a:    80 91 19 01     lds    r24, 0x0119
    status = UCSR1A;
27e:    82 b1           in    r24, 0x02    ; 2
    resh = UCSR1B;
280:    81 b1           in    r24, 0x01    ; 1
    InputCh = UDR1;                                //Get character
282:    83 b1           in    r24, 0x03    ; 3
284:    8f 91           pop    r24
286:    0f 90           pop    r0
288:    0f be           out    0x3f, r0    ; 63
28a:    0f 90           pop    r0
28c:    1f 90           pop    r1
28e:    18 95           reti


testcode 发表于 2005-7-15 01:42 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: 中断放在类,感觉上会更完整一些


中断放在类,感觉上会更完整一些,但不知实用性如何。


hotpower 发表于 2005-7-15 01:47 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

5楼: 感觉您会用__attribute__ ( ( signal ) )


问题是给人的感觉是中断不突出,不过确实很完整!!!

不错!!!!!!!!!

等我在实战中用用如何???

hotpower 发表于 2005-7-15 02:43 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

6楼: 刚试用了一下感觉不错且简化了程序


class UsiObj {//封装Usi通用接口类的I2C部分
private:
  unsigned char Address;
  unsigned char Command;
  unsigned char Count, Status;
  unsigned char TxBuffer[4], RxBuffer[4];
public:
  UsiObj(void);
  unsigned char SlaveAddress;
  unsigned char WdtRstCount;
  void UsiInit(void);
  void SIG_USI_START(void)  __attribute__ ((signal));//改进后的
  void SIG_USI_OVERFLOW(void) __attribute__ ((signal));//改进后的
  void SendData(void);
  void SendAck(void);
  unsigned char GetBufferNum(unsigned char);
  void CommandExec(void);
};

原来整个程序代码长度为2048(T26L全满),现在为1988.节约了60个字节!!!

非常不错!!!

hotpower 发表于 2005-7-15 07:32 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

7楼: 再次感谢TestCode为我们开启了一扇C++之门


估计TestCode再折腾下去就没人在AVR中用C了...

John_Lee 发表于 2005-7-15 09:05 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

8楼: 你们实际用过吗?!我觉得是不行的!


注意C++的name mangling

hotpower 发表于 2005-7-15 12:11 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

10楼: 哈哈,玩过了头...


看来要研究成员(中断)函数如何重载中断函数的问题了...

昨晚感觉有点---"中断向量都是定死的,就是想也难..."

确实成员(中断)函数的指针(地址)没被链入到中断向量(rjmp)表中...

革命尚未成功,同志仍需努力...

我们是不会放弃的...


BitFu 发表于 2005-7-15 20:52 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

13楼: 我在avrfreaks上发过这样的帖子


他们认为,不行。


hotpower 发表于 2005-7-15 21:50 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

14楼: 确实不好搞...


每个中断函数都在中断向量表中占有一席之地,但成员函数虽然被强搞为"中断函数",只是该函数遵守了其他"中断规则"---披上了"中断"的外衣.

我用了一个下午都没成功(虽然我知道是一条死胡同),但对SIGNAL等宏有了更深的理解和认识...

不过可以把成员(中断)函数装在SIGNAL()函数(让其不保护现场且以ret返回)内.


powerok 发表于 2006-1-30 01:34 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

15楼: 中断函数需要加static描述


中断函数需要加static描述

xwj 发表于 2008-2-8 18:14 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

17楼: 晕,挖坟啊???

 



hotpower 发表于 2008-2-9 00:08 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

21楼: 哈哈~~~一直没敢实战觉得很对不住TestCode的~~~


刚在新版本中也编译通过了~~~过年后抽空实战一把~~~

hotpower 发表于 2008-2-9 00:41 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

22楼: 又编译了几个例子,代码有所减少~~~不过未经过实战~~~


原来:
Program:    1992 bytes (97.3% Full)
(.text + .data + .bootloader)

SIGNAL(SIG_ADC)
{
  Adc.Exec();//因为Exec为内联函数,所以空间减少
}
inline//不加inline将增大空间84个字节
extern "C" void AdcObj::SIG_ADC(void)
{
//....................
}

现在:
Program:    1972 bytes (96.3% Full)
(.text + .data + .bootloader)

class AdcObj {
public:
  void SIG_ADC(void)  __attribute__ ((signal));
};

//inline//不能内联!!!
extern "C" void AdcObj::SIG_ADC(void)
{
//........................
}


23楼: 哈哈~~~挖坟后的15楼唤起了菜农对以前的回忆,一举搞定Cortex M3


哈哈~~~XWJ:这个坟头没白挖~~~

哈哈~~~终于了却了在Cortex M3上的C++类成员函数做中断函数的心愿~~~

又是一个4点钟~~~菜农"跳出黄河"的时间此生几乎都在后半夜...

C++之路----全扫荡完了...发帖自贺

菜农HotPower@126.com  2008.2.9 4:08 于西安大雁塔菜地


* - 本贴最后修改时间:2008-2-9 4:34:25 修改者:hotpower

不抛弃不放弃---类成员函数终成中断函数(发帖自贺)
2008294111656.gif

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条