用上了IAREWSTM81.2,很好用,但是暴露出STM8的库有问题

笑哈哈   2010-11-13 20:04 楼主


刚去ST的新网站看了下,STM8的库还是1.1.1的
在用1.1编译器的时候,虽然在C/C++ Compiler里勾选上了Require prototype,但是发现没有函数原型的话编译器是不会报错的,也就是说IAR EWSTM8 1.1并没有严格检查函数原型是否声明了,但是在1.2下发现这一项的检查非常严格了,加上函数原型声明后,剩下几十个错误信息都是因为库函数没有原型声明造成的,观察下发现,在STM8库的头文件里,只声明了COSMIC编译器下的函数原型,并没有IAR下的头文件声明,我把Require prototype前面的勾选去掉后,编译通过了,但是原先在1.1下产生的警告信息还存在,比如在void UART2_DeInit(void)函数中,有这样的语句
{
    u8 dummy = 0;
    dummy = UART2->SR;
    dummy = UART2->DR;
}
读SR DR寄存器是为了清除某些标志位,用来DeInit UART2,但是编译器给出的警告信息是Warning[Pe550]: variable "dummy" was set but never used
意思是说该变量从来没用过,那么在定义的前面加上volatile后,编译就通过了,这么简单的问题还没处理掉说明IAR的STM8库还是有些粗糙哇,另外IAR EWSTM8都到1.2版本了,ST早应该更新下STM8的库了,并且好好提高下对IAR编译器的支持,希望香水版主重视下呀

回复评论 (15)

                                 的确是个问题,STM8的库是该更新了
点赞  2010-11-13 20:27


{
    u8 dummy = 0;
    dummy = UART2->SR;
    dummy = UART2->DR;
}
读SR DR寄存器是为了清除某些标志位,用来DeInit UART2,但是编译器给出的警告信息是Warning[Pe550]: variable "dummy" was set but never used
意思是说该变量从来没用过,那么在定义的前面加上volatile后,编译就通过了,这么简单的问题还没处理掉说明IAR的STM8库还是有些粗糙哇
----------------------------------------------------------

加volatile 会影响优化。
更好的方法是加一个空语句:
(void)dummy;


void UART2_DeInit(void)
{
    u8 dummy = 0;
    dummy = UART2->SR;
    dummy = UART2->DR;

    (void)dummy;
}
点赞  2010-11-14 11:34
                                 问题是ST应该升级下STM8的库了,好好支持下EWSTM8
点赞  2010-11-14 12:04
                                 我手动把常用的库够更新了,没有那些烦人的警告了
点赞  2010-11-22 09:59
                                 应该说是编译器本身没做好,太笨! 通过这句话"在定义的前面加上volatile后,编译就通过了"更说明了是编译器的问题!
点赞  2010-11-22 18:06
                                 有些库的确是不太还用
点赞  2010-11-22 21:54
                                 同意“4楼: 问题是ST应该升级下STM8的库了,好好支持下EWSTM8 ”
点赞  2010-11-23 09:39
                                 6楼,这个跟编译器没关系
点赞  2010-11-23 12:04
                                 问下5楼的朋友,如何手动更新
点赞  2010-11-23 16:18


想问一下楼主,V1.2怎么破解啊。能不能教教我们怎么破解呢?或是发个破解文件,注册机之类的出来大家共享一下吧。
大力支持楼主
点赞  2010-12-8 19:35
有需要的给我发邮件
winloop@163.com
点赞  2010-12-8 20:23
typedef enum
{
  GPIO_MODE_IN_FL_NO_IT      = (u8)0b00000000,  /*!< Input floating, no external interrupt */
  GPIO_MODE_IN_PU_NO_IT      = (u8)0b01000000,  /*!< Input pull-up, no external interrupt */
  GPIO_MODE_IN_FL_IT         = (u8)0b00100000,  /*!< Input floating, external interrupt */
  GPIO_MODE_IN_PU_IT         = (u8)0b01100000,  /*!< Input pull-up, external interrupt */
  GPIO_MODE_OUT_OD_LOW_FAST  = (u8)0b10100000,  /*!< Output open-drain, low level, 10MHz */
  GPIO_MODE_OUT_PP_LOW_FAST  = (u8)0b11100000,  /*!< Output push-pull, low level, 10MHz */
  GPIO_MODE_OUT_OD_LOW_SLOW  = (u8)0b10000000,  /*!< Output open-drain, low level, 2MHz */
  GPIO_MODE_OUT_PP_LOW_SLOW  = (u8)0b11000000,  /*!< Output push-pull, low level, 2MHz */
  GPIO_MODE_OUT_OD_HIZ_FAST  = (u8)0b10110000,  /*!< Output open-drain, high-impedance level,10MHz */
  GPIO_MODE_OUT_PP_HIGH_FAST = (u8)0b11110000,  /*!< Output push-pull, high level, 10MHz */
  GPIO_MODE_OUT_OD_HIZ_SLOW  = (u8)0b10010000,  /*!< Output open-drain, high-impedance level, 2MHz */
  GPIO_MODE_OUT_PP_HIGH_SLOW = (u8)0b11010000   /*!< Output push-pull, high level, 2MHz */
}GPIO_Mode_TypeDef;

改为#define GPIO_MODE_IN_FL_NO_IT       (u8)0b00000000
等等就行了
#define GPIO_Mode_TypeDef u8
然后库的警告就少很多了,
某些读-清除的 加上 3楼说的方法就行了,没一点警告了
点赞  2010-12-9 08:56
                                 STM8
点赞  2010-12-9 09:12
                                 STM8还是自己写吧,不是很难的
点赞  2010-12-9 09:13
记号,我回头我要看
生活在激情中 ... 希望 哈哈 https://home.eeworld.com.cn/?80086
点赞  2012-10-19 16:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复