昨天没搞定的中断注册今天搞定了,但是碰到一个奇怪的问题,或者是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,然后编译就可以了。 *博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。