还未具体跑过,是否符合要求,只是代码通过... #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楼: 你们实际用过吗?!我觉得是不行的! |
|
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描述 |
|
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
不抛弃不放弃---类成员函数终成中断函数(发帖自贺)
|
|
|
文章评论(0条评论)
登录后参与讨论