打印

【基础却重要】请教关于中断服务程序调用带参数的函数。

[复制链接]
3197|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-1-10 09:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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仍可以大胆的在中断 服务程序调用带参数的函数”??

相关帖子

沙发
ayb_ice| | 2014-1-10 13:11 | 只看该作者
这个没有什么限制

关键是被调用的函数是否重入

使用特权

评论回复
板凳
dirtwillfly| | 2014-1-10 20:28 | 只看该作者
没用过CARM编译器,这个编译器真的有段历史了

使用特权

评论回复
地板
airwill| | 2014-1-11 12:40 | 只看该作者
不同编译器之间, 肯定是存在些差异的. 这纯粹看编译器厂家的安排. 特别是在单片机这样的领域.
所以, 更换编译器, 最好重新检查一下代码, 重新编译

是否“在KELC51和MDK仍可以大胆的在中断 服务程序调用带参数的函数”??
当然是可以的. 不过 KeilC51 当心重入问题, 老生常谈的话题了.

使用特权

评论回复
5
xlsbz|  楼主 | 2014-1-14 08:30 | 只看该作者
多谢各位!

使用特权

评论回复
6
xlsbz|  楼主 | 2014-9-26 08:58 | 只看该作者
airwill 发表于 2014-1-11 12:40
不同编译器之间, 肯定是存在些差异的. 这纯粹看编译器厂家的安排. 特别是在单片机这样的领域.
所以, 更换编 ...

再次感谢版主。那个CARM编译器我就特殊处理了。现在看来是稳定的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝