新闻  |   论坛  |   博客  |   在线研讨会
莫名其妙的中断和堆栈问题
esuperman | 2008-05-28 11:55:55    阅读:8079   发布文章

昨天没搞定的中断注册今天搞定了,但是碰到一个奇怪的问题,或者是HEW编译的问题。
系统自动生成了定时器A1的中断处理函数
// TIMER A1   (software int 22)
#pragma interrupt _timer_a1(vect=22)
void _timer_a1(void){
    timeA1();在这里调用中断处理函数,ok。
}
我想自己优化一下,不用函数调用,
写成
extern void timeA1(void);
#pragma interrupt timeA1(vect=22)
就是不行,提示的错误。

还有一个堆栈的问题,加入一个文件后编译,出现下面的错误
[Error(ccom)] Sorry stack frame memory exhaust, max 255 bytes(auto) but now 309 bytes.
根据这个错误查帮助,居然什么也没有查到。我的确在那个函数里面申请了一个200自己的数组,但是应该在堆里分配,不应该占有栈的空间吧。程序中用户栈和中断栈都是0x300字节,对于这个255,我怀疑是变成汇编时候某条汇编指令用8位偏移量,而程序超过了。
但是据说把数组声明称全局变量就可以搞定,这是明天的事了。
我找到解决这个问题的方法了:这个的确是因为汇编时候函数的变参采用FB寻址。解决方法是打开Build -> Renesas M16C Standard Toolchain 在Configuratio中选择错误的C文件,在右边的C选项卡Options C中添加-fAO2,然后编译就可以了。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
lingyun3429  2011-09-24 08:59:47 

你好,我也遇到同样的问题,但是还没搞清楚,你能帮我分析一下吗,谢谢。

8wy103405  2008-06-04 18:03:36 

问题解决了吗?

Jacky [ 匿名]  2008-05-29 19:29:16 

请问,什么叫“采用FB寻址”??

esuperman  2008-05-28 11:53:06 

第二个错误的确是因为汇编时候函数的变参采用FB寻址。解决方法是打开Build - Renesas M16C Standard Toolchain 在Configuratio中选择错误的C文件,在右边的C选项卡Options C中添加-fAO2,然后编译就可以了

鹿消沉  2008-05-13 09:51:34 

我也遇到过相同的问题

推荐文章
最近访客