本帖最后由 xlsbz 于 2014-1-10 09:18 编辑
我用keil51 C编译器C51.exe V8.02 和 V8.18
MDK用的是ARMCC.exe V5.03.0.24
一直都是在中断 服务程序调用带参数的函数。并且注意到了“ 中断中调用的函数最好不要被中断外的其它函数调用 ”,因为KEIL51对给出警告。我编程也有几年了,没出现什么问题。
但是昨天我用了原先kEIL公司的CARM编译器(这个编译器有点老) CA.EXE V2.53,结果发现参数传递出现了问题。搞了我一下午,最终发现,编译器优化级别在2级或2级以上就不会出问题。第2级是register varibales.
为什么相同的函数在C51和armcc编译器没问题,在CARM编译器却出现问题??
然后我上网招帖子,关于这方面资料不多,找到https://bbs.21ic.com/icview-320610-1-1.html,里面有讲到:
还有一个比较容易忽视的地方, 就是被调函数的参数不能太多
,参数太多的话 Rn中存放不完(当然,前提是你设置了在Rn中传递参数)
,参数会被存放到堆中
,而中断函数是不参与覆盖分析的
,那样有可能会导致被调函数的参数出错
**************************************************************
我觉得像这个原因。因为我眼睁睁的看着我的参数传递出现了错误,准确点说是偏移了。我总共用了三个参数,一个是个结构体,另两个是uint8.
现在我对这个的看法是,在KELC51和MDK仍可以大胆的在中断 服务程序调用带参数的函数。
我对这个中断里面的寄存器相关问题理解不深,请问大家觉得是否“在KELC51和MDK仍可以大胆的在中断 服务程序调用带参数的函数”??
|