6881|16

3471

帖子

13

TA的资源

五彩晶圆(高级)

楼主
 

这种警告不能忽略 [复制链接]

很多时候,编译程序,没有error,有warning,也能正常运行。 但有的时候,却出现问题。  
..\User\main.c(106): warning:  #223-D: function "delay_ms" declared implicitly
这虽然是个警告,但编译器没有找到delay_ms 这个函数 。  找不到竟然还能编译通过,不知它怎么想的。      运行的时候,就会出现复位之类的情况。         
此帖出自stm32/stm8论坛

最新回复

哦,是这样啊,那你是不是在调用这个函数的那个文件中没有用extern声明呢?如果不声明的话,有可能会出这个警告.至于这种延时的方法是不是很好,我就不知道了,反正见好多应用都是用这个玩意儿来定时的.   详情 回复 发表于 2015-1-12 15:11
点赞 关注
 

回复
举报

6040

帖子

202

TA的资源

版主

沙发
 
只是找不到声明而已,但函数是有定义的,否则连接的时候肯定不过。你再找找其他复位原因吧,肯定不是因为这个。
此帖出自stm32/stm8论坛

点评

不停复位的程序, 只需要 把delay_ms 注释掉,一下子就不复位了 。 delay_ms 之后,紧跟着printf 语句。 有delay_ms 时,不停复位, 没有看到printf语句打印的内容。 去掉delay_ms ,一下子就  详情 回复 发表于 2015-1-10 20:58
 
 

回复

6108

帖子

4

TA的资源

版主

板凳
 
把所有的警告都关心起来,是个好习惯。这样也利于养成编程好习惯。以后会方便很多。
此帖出自stm32/stm8论坛

点评

嗯,以后要多注意一下, 尽量消除警告 。至少也得看到每个警告是什么,确定没什么影响。  详情 回复 发表于 2015-1-10 21:11
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

4
 
你是不是用的430单片机?我当时用430的时候发现过类似的问题,原因是你得delay函数是用的for循环写的,ccs里面有一个低功耗模式的编译器会自动检测你得这个程序没有进行任何操作,于是他就自动把这个函数给你删除了.于是所有的延时效果都没有了...但是程序可以下载,也可以跑,就是时序要求严格的地方就不行了.
此帖出自stm32/stm8论坛

点评

不是430,这个和stm32差不多 。 这个delay_ms 是自带的库函数里的。重新给SysTick 计数器赋值的方法实现的延时。 void delay_ms(uint16_t nms) { uint32_t temp = delay_fac_ms * nms; if (te  详情 回复 发表于 2015-1-10 21:04
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

5
 
lcofjp 发表于 2015-1-10 04:04
只是找不到声明而已,但函数是有定义的,否则连接的时候肯定不过。你再找找其他复位原因吧,肯定不是因为这个。



不停复位的程序, 只需要 把delay_ms  注释掉,一下子就不复位了  。  delay_ms    之后,紧跟着printf 语句。  有delay_ms    时,不停复位, 没有看到printf语句打印的内容。   去掉delay_ms    ,一下子就不复位, 而且printf打印也有了  ,别的什么都没动。     delay_ms     右键  go to definition ,根本找不到。  
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

6
 
无奇不有 发表于 2015-1-10 10:44
你是不是用的430单片机?我当时用430的时候发现过类似的问题,原因是你得delay函数是用的for循环写的,ccs里面有一个低功耗模式的编译器会自动检测你得这个程序没有进行任何操作,于是他就自动把这个函数给你删除了.于是所有的延时效果都没有了...但是程序可以下载,也可以跑,就是时序要求严格的地方就不行了.

不是430,这个和stm32差不多 。  这个delay_ms  是自带的库函数里的。重新给SysTick 计数器赋值的方法实现的延时。  void delay_ms(uint16_t nms)
{   
    uint32_t temp = delay_fac_ms * nms;

    if (temp > 0x00ffffff)
    {
        temp = 0x00ffffff;
    }
    SysTick_SetReload(temp);
    SysTick_CounterCmd(SysTick_Counter_Clear);
    SysTick_CounterCmd(SysTick_Counter_Enable);
    do
    {
        Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
    }while (Status != SET);
    SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CounterCmd(SysTick_Counter_Clear);
}

感觉这种延时方式, 操作过程比较复杂,不如简单的for 或者 while  语句。  SysTick是系统的核心中断 啊,总改寄存器的值恐怕对稳定性不好。   不看好这个demo。



此帖出自stm32/stm8论坛

点评

哦,是这样啊,那你是不是在调用这个函数的那个文件中没有用extern声明呢?如果不声明的话,有可能会出这个警告.至于这种延时的方法是不是很好,我就不知道了,反正见好多应用都是用这个玩意儿来定时的.  详情 回复 发表于 2015-1-12 15:11
不要把IDE的intellisense和编译器的处理过程搞混了。IDE找不到的符号不代表编译器找不到,反之亦然。警告只是说当前文件里找不到delay_ms的函数声明,不是说就没有这个函数的存在。复位肯定是delay_ms或者哪里的问  详情 回复 发表于 2015-1-10 23:05
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

7
 
damiaa 发表于 2015-1-10 10:40
把所有的警告都关心起来,是个好习惯。这样也利于养成编程好习惯。以后会方便很多。


嗯,以后要多注意一下, 尽量消除警告 。至少也得看到每个警告是什么,确定没什么影响。
此帖出自stm32/stm8论坛
 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

8
 
这个是你代码用的有问题,delay_ms你自己没有实现,链接器就用库函数实现来给你链,至于到底链成什么样了,你也不清楚,你也没去追究

declared implicitly意思应该明白吧?就是你在这个文件中调用那个函数,但是那个函数的定义不在该问题,而且在该文件中又没有显示声明
此帖出自stm32/stm8论坛

点评

那可能是这样的,编译器找不到函数定义,就在自己的库里,链接了一个函数。并不是这个工程里的delay_ms, 单片机运行这个keil自己搜索的函数时,发生了异常。[/backcolor]  详情 回复 发表于 2015-1-11 21:55
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

9
 
ienglgge 发表于 2015-1-10 21:04
不是430,这个和stm32差不多 。  这个delay_ms  是自带的库函数里的。重新给SysTick 计数器赋值的方法实现的延时。  void delay_ms(uint16_t nms)
{   
    uint32_t temp = delay_fac_ms * nms;

    if (temp > 0x00ffffff)
    {
        temp = 0x00ffffff;
    }
    SysTick_SetReload(temp);
    SysTick_CounterCmd(SysTick_Counter_Clear);
    SysTick_CounterCmd(SysTick_Counter_Enable);
    do
    {
        Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
    }while (Status != SET);
    SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CounterCmd(SysTick_Counter_Clear);
}

感觉这种延时方式, 操作过程比较复杂,不如简单的for 或者 while  语句。  SysTick是系统的核心中断 啊,总改寄存器的值恐怕对稳定性不好。   不看好这个demo。

不要把IDE的intellisense和编译器的处理过程搞混了。IDE找不到的符号不代表编译器找不到,反之亦然。警告只是说当前文件里找不到delay_ms的函数声明,不是说就没有这个函数的存在。复位肯定是delay_ms或者哪里的问题导致,很正常。
此帖出自stm32/stm8论坛

点评

不好意思,没太明白,我就是用的Keil,它不就是编译器吗,没有别的东西。这个和IDE没什么关系吧?[/backcolor]  详情 回复 发表于 2015-1-11 22:03
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

10
 
lelee007 发表于 2015-1-10 22:08
这个是你代码用的有问题,delay_ms你自己没有实现,链接器就用库函数实现来给你链,至于到底链成什么样了,你也不清楚,你也没去追究

declared implicitly意思应该明白吧?就是你在这个文件中调用那个函数,但是那个函数的定义不在该问题,而且在该文件中又没有显示声明



那可能是这样的,编译器找不到函数定义,就在自己的库里,链接了一个函数。并不是这个工程里的delay_ms,  单片机运行这个keil自己搜索的函数时,发生了异常。
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

11
 
freebsder 发表于 2015-1-10 23:05
不要把IDE的intellisense和编译器的处理过程搞混了。IDE找不到的符号不代表编译器找不到,反之亦然。警告只是说当前文件里找不到delay_ms的函数声明,不是说就没有这个函数的存在。复位肯定是delay_ms或者哪里的问题导致,很正常。


不好意思,没太明白,我就是用的Keil,它不就是编译器吗,没有别的东西。这个和IDE没什么关系吧?
此帖出自stm32/stm8论坛

点评

12楼正解 我们说的keil是IDE,IDE和编译器不是一回事,编译器是armcc、armas、armar、armld、fromelf一类的工具链 而IDE只是一个界面,这个界面提供一些功能,诸如文本编辑、调用编译器、调试等等 在安装ID  详情 回复 发表于 2015-1-12 14:21
keil是编译器和编译器的一个大包,也叫uvision的吧,keil里面的armcc才是编译器。你能够“右键 go to definition”的功能,不是IDE提供的intellisense是什么呢,你听过编译器提供“go to definition”功能吗?呵呵  详情 回复 发表于 2015-1-11 22:52
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

12
 
ienglgge 发表于 2015-1-11 22:03
不好意思,没太明白,我就是用的Keil,它不就是编译器吗,没有别的东西。这个和IDE没什么关系吧?
keil是编译器和编译器的一个大包,也叫uvision的吧,keil里面的armcc才是编译器。你能够“右键  go to definition”的功能,不是IDE提供的intellisense是什么呢,你听过编译器提供“go to definition”功能吗?呵呵
此帖出自stm32/stm8论坛

点评

嗯,有点明白了 , 没有明确区别编译器和[/backcolor]IDE,明确了一下编译器的概念。谢谢指点哈。。[/backcolor]  详情 回复 发表于 2015-1-12 20:28
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

13
 
ienglgge 发表于 2015-1-11 22:03
不好意思,没太明白,我就是用的Keil,它不就是编译器吗,没有别的东西。这个和IDE没什么关系吧?
12楼正解

我们说的keil是IDE,IDE和编译器不是一回事,编译器是armcc、armas、armar、armld、fromelf一类的工具链

而IDE只是一个界面,这个界面提供一些功能,诸如文本编辑、调用编译器、调试等等

在安装IDE的时候,会一起安装编译器,但是IDE并不等同编译器,比如我们用的keil、RVDS、DS-5==都是不同的IDE,但是他们使用的编译器都是同样的armcc,当然新版DS-5还可以使用gcc编译器,又是另外一种不同于armcc的编译器工具链
此帖出自stm32/stm8论坛

点评

嗯,知道有个GCC,但不知道,keil用的是armcc,谢谢指点啦~~~[/backcolor]  详情 回复 发表于 2015-1-12 20:34
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(中级)

14
 
ienglgge 发表于 2015-1-10 21:04
不是430,这个和stm32差不多 。  这个delay_ms  是自带的库函数里的。重新给SysTick 计数器赋值的方法实现的延时。  void delay_ms(uint16_t nms)
{   
    uint32_t temp = delay_fac_ms * nms;

    if (temp > 0x00ffffff)
    {
        temp = 0x00ffffff;
    }
    SysTick_SetReload(temp);
    SysTick_CounterCmd(SysTick_Counter_Clear);
    SysTick_CounterCmd(SysTick_Counter_Enable);
    do
    {
        Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
    }while (Status != SET);
    SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CounterCmd(SysTick_Counter_Clear);
}

感觉这种延时方式, 操作过程比较复杂,不如简单的for 或者 while  语句。  SysTick是系统的核心中断 啊,总改寄存器的值恐怕对稳定性不好。   不看好这个demo。


哦,是这样啊,那你是不是在调用这个函数的那个文件中没有用extern声明呢?如果不声明的话,有可能会出这个警告.至于这种延时的方法是不是很好,我就不知道了,反正见好多应用都是用这个玩意儿来定时的.

此帖出自stm32/stm8论坛

点评

对啊,就是没有外部声明,声明一下就好了。 只是它编译通过了,运行竟然会复位,觉得有些意外。  详情 回复 发表于 2015-1-12 20:16
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

15
 
无奇不有 发表于 2015-1-12 15:11
哦,是这样啊,那你是不是在调用这个函数的那个文件中没有用extern声明呢?如果不声明的话,有可能会出这个警告.至于这种延时的方法是不是很好,我就不知道了,反正见好多应用都是用这个玩意儿来定时的.


对啊,就是没有外部声明,声明一下就好了。  只是它编译通过了,运行竟然会复位,觉得有些意外。

此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

16
 
freebsder 发表于 2015-1-11 22:52
keil是编译器和编译器的一个大包,也叫uvision的吧,keil里面的armcc才是编译器。你能够“右键  go to definition”的功能,不是IDE提供的intellisense是什么呢,你听过编译器提供“go to definition”功能吗?呵呵


嗯,有点明白了 ,  没有明确区别编译器和IDE,明确了一下编译器的概念。谢谢指点哈。。

此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

17
 
lelee007 发表于 2015-1-12 14:21
12楼正解

我们说的keil是IDE,IDE和编译器不是一回事,编译器是armcc、armas、armar、armld、fromelf一类的工具链

而IDE只是一个界面,这个界面提供一些功能,诸如文本编辑、调用编译器、调试等等

在安装IDE的时候,会一起安装编译器,但是IDE并不等同编译器,比如我们用的keil、RVDS、DS-5==都是不同的IDE,但是他们使用的编译器都是同样的armcc,当然新版DS-5还可以使用gcc编译器,又是另外一种不同于armcc的编译器工具链



嗯,知道有个GCC,但不知道,keil用的是armcc,谢谢指点啦~~~
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表