打印
[STM8]

【经验分享】关于cosmic编译器的一个小错误,以及解决方法

[复制链接]
8169|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaolanghahaha|  楼主 | 2013-7-2 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaolanghahaha 于 2013-7-2 16:37 编辑

最近在用stm8s208做一个摩托车电控的项目,由于项目要求在线标定功能,而这款单片机含有can通讯,所以我就选择了它,经过几个月的艰苦奋斗,我终于完成了这一个浩大的工程,确切的说,是完成了这一浩大的工程的两部分——摩托车电控和can标定通讯,为什么这么说呢?
因为这两部分,分别测试,完美运行,控制程序甚至用在实体摩托车上运行没问题。。。。可是,当把这两个模块放在一起,就会出现can通讯过程中有可能发生指针跳飞~~~~~~~
就这一个问题,我找了4个月。。。。可能造成问题的原因一个一个排除,代码一行一行的进行测试,最终发现,出现这种问题的原因,竟然只是一句简单的强制转换语句。。。。。。
(具体表现,详见我的帖子https://bbs.21ic.com/icview-578068-1-1.html
为什么会发生这种错误呢,我在21ic论坛发帖子请教高人,因为本人不太懂汇编,只是稍微能理解,所以这里要特别感谢@sun1238898@IJK 两位同学,是他们的提示,让我有了思路。。




废话少说,说一说这个bug,具体说来,这个bug就是:在主函数和中断函数中都使用了(浮点型的乘除法)或者(浮点型数据强制转换)等操作。。。就会出现PC指针跳飞

为什么会这样呢,经过网络搜索和自己探究,终于找到了原因了:
编译器在处理long或浮点运算的时候,会调用c_lreg等库函数,而在产生中断的时候,并不会把c_lreg压入堆栈,而中断函数中如果也存在long或浮点运算,就会再次调用c_lreg,这样,中断返回后,就会出现pc指针不能正确返回了

具体的解决方法(搜索于网络):
在中断函数声明中使用@svlreg修饰符可强制保存c_lreg变量入堆栈。



就这样,困扰我4个月的bug终于解决了!经验分给大家!只希望大家不要走我的弯路
沙发
江枫渔火| | 2013-7-2 16:31 | 只看该作者
c_x,c_y,c_lreg是什么~请教一下,楼主的帖子,好~
除法是不是库函数来着?强制浮点转整型是不是也是库函数来着?没有深究,请指点迷津

使用特权

评论回复
板凳
xiaolanghahaha|  楼主 | 2013-7-2 16:37 | 只看该作者
江枫渔火 发表于 2013-7-2 16:31
c_x,c_y,c_lreg是什么~请教一下,楼主的帖子,好~
除法是不是库函数来着?强制浮点转整型是不是也是库函数 ...

是一些库函数,原来的帖子确实写的有点乱,现在改了,应该可以看得懂了吧。。。。。

使用特权

评论回复
地板
xiaolanghahaha|  楼主 | 2013-7-2 16:38 | 只看该作者
function.c:798                                temp =  (u8)(angle_abmt_ignit); 
0xa8a2 <.ParameterTrans+96> 0x96            LDW   X,SP                LDW   X,SP
0xa8a3 <.ParameterTrans+97> 0x1C000E        ADDW  X,#0x000e           ADDW  X,#0x000e
0xa8a6 <.arameterTrans+100> 0xCDDED4        CALL  0xded4              CALL  c_ltor
0xa8a9 <.arameterTrans+103> 0xCDDBD0        CALL  0xdbd0              CALL  c_ftol
0xa8ac <.arameterTrans+106> 0xB603          LD    A,0x03              LD    A,0x03
0xa8ae <.arameterTrans+108> 0x6B0D          LD    (0x0d,SP),A         LD    (0x0d,SP),A

使用特权

评论回复
5
xiaolanghahaha|  楼主 | 2013-7-2 16:39 | 只看该作者
上面的就是在执行 temp =  (u8)(angle_abmt_ignit); 这一句强制转换语句 的汇编语言,可以看出,CALL  c_ltor 这里调用了c_ltor 库函数。。。

使用特权

评论回复
6
IJK| | 2013-7-2 16:51 | 只看该作者
其实,这属于COSMIC C关于浮点运算的用法问题,这是容易出错的地方。用IAR EWSTM8估计不大会出现这种问题

使用特权

评论回复
7
xiaolanghahaha|  楼主 | 2013-7-2 17:03 | 只看该作者
IJK 发表于 2013-7-2 16:51
其实,这属于COSMIC C关于浮点运算的用法问题,这是容易出错的地方。用IAR EWSTM8估计不大会出现这种问题 ...

嗯,编译器的问题嘛,我以前一直以为是自己编写的程序的问题,唉,就一直卡在这儿找不到答案呀

使用特权

评论回复
8
江枫渔火| | 2013-7-2 17:12 | 只看该作者
我用的IAR环境,也有莫名其妙的问题,似乎也是除法,浮点这些东西惹得祸~

使用特权

评论回复
9
xiaolanghahaha|  楼主 | 2013-7-2 17:21 | 只看该作者
江枫渔火 发表于 2013-7-2 17:12
我用的IAR环境,也有莫名其妙的问题,似乎也是除法,浮点这些东西惹得祸~

对呀,这些东西真的很头痛~~要考虑好多东西

使用特权

评论回复
10
触觉的爱| | 2013-7-2 18:34 | 只看该作者

我用的IAR环境,除法暂时没碰到问题。浮点的试过几次不行,没研究什么原因导致。不过中断中并没用到运算

使用特权

评论回复
11
trumpxp| | 2013-7-2 19:37 | 只看该作者
问题解决了就好    楼主   很不错   帮你顶一个

使用特权

评论回复
12
trumpxp| | 2013-7-2 19:37 | 只看该作者
谢谢你的共享  这样以后别人遇到这个问题    就可以解决了

使用特权

评论回复
13
yklstudent| | 2013-7-2 20:56 | 只看该作者
comic这编译器好高级啊

使用特权

评论回复
14
原野之狼| | 2013-7-2 21:24 | 只看该作者
这不是什么bug 好好看看编译器手册 以及库手册 搜搜能不能找到“重入”“线程安全”之类的关键字

使用特权

评论回复
15
jekey| | 2013-7-2 21:59 | 只看该作者
本帖最后由 jekey 于 2013-7-2 22:00 编辑

这类错误确实比较隐蔽。

使用特权

评论回复
16
huangxz| | 2013-7-2 22:38 | 只看该作者
确实,不过没好好看人家的文档也是我们开发人员的一大问题,

使用特权

评论回复
17
xiaolanghahaha|  楼主 | 2013-7-3 09:35 | 只看该作者
原野之狼 发表于 2013-7-2 21:24
这不是什么bug 好好看看编译器手册 以及库手册 搜搜能不能找到“重入”“线程安全”之类的关键字 ...

手册有中文的么?????一直苦逼的看英文的呀,看不懂就没怎么看了。。。。

使用特权

评论回复
18
原野之狼| | 2013-7-3 10:13 | 只看该作者
xiaolanghahaha 发表于 2013-7-3 09:35
手册有中文的么?????一直苦逼的看英文的呀,看不懂就没怎么看了。。。。 ...

搞IT技术  英文是基本功啊

使用特权

评论回复
19
cool_coder| | 2013-7-3 10:16 | 只看该作者
在中断程序里必须使用浮点运算吗?让你自己写汇编的话,估计绝不会这么干。C语言虽然做数值运算比较方便,也不能想怎么用就怎么用,这样真让人有点担心啊~

使用特权

评论回复
20
jerry_wtl| | 2013-7-3 10:33 | 只看该作者
中断里面只缓冲数据和做标志,其他操作比如运算什么的都不该在里面做,没有这个习惯会遇到更多麻烦。即使只做标志还要考虑同步问题。

使用特权

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

本版积分规则

4

主题

44

帖子

1

粉丝