IAR STM32 调试错误笔记

1 篇文章 0 订阅

本人是初学者,其内容是作为我的一个学习笔记,有从网上查找到的,也有一些自己的理解;我也没有系统的学习过,只能是遇到了什么就记录什么。各位大佬发现内容写错了的,请指点我一下,万分感谢!

  1. Warning[25]: Label’Reset_Handler’ is defined pubweak in a section implicitly declared root
    将:SECTION.text:CODE:REORDER(1)
    改:SECTION .text:CODE:REORDER:NOROOT(1)或者ROOT(1)
    因:7.1版本之前,section默认是noroot,但现在是root。NOROOT表示如果符号没有被关联的时候是被优化掉的,如果想不被优化则使用ROOT

  2. Warning[Pe223]: function “assert_param” declared implicitly
    方法:在workspace中,对工程右键–>options–>C/C++ compiler -->preprocessor在Defined symbols处添加:USE_STDPERIPH_DRIVER,
    STM32F10X_HD(HD可以为MD和LD,参考产品的容量,对应文件startup_stm32f10x_xx.s,xx可以为hd,md和ld)
    因:在文件stm32f10x.h中看可以查找到这三句程序
    在这里插入图片描述
    这是一个条件编译语句,只有定义了USE_STDPERIPH_DRIVER,才能包含stm32f10x_conf.h文件。conf.h文件就像一个开关文件,当它被包含进主函数就相当于可以使用标准外设驱动了,这是因为其中含有对外设驱动头文件的编译预处理命令(如图)
    在这里插入图片描述
    这也就能解释,有时候我们没有将conf.h文件包含进main函数,但在编译之后还是可以调用它。我们也可以在conf.h文件中将不需要的头文件注释掉。
    如果main.c文件中包含了conf.h文件,但是没有定义,在编译之后还是会报错。
    然后我通过查找"STM32F10X_HD",也是在stmf10x.h文件中找到了类似的条件编译,也是只有在定义了"STM32F10X_HD",其相关代码段才能起作用。
    在这里插入图片描述
    当然"STM32F10X_MD"和"STM32F10X_LD"也是如此。

  3. Warning[Pe940]: missing return statement at end of non-void function
    改:提示没有返回值,一般是在函数末尾会添加一个return 0;语句。
    注:如果将return语句放在if条件语句或者for循环等语句中时,也会提示没有返回值。而且调用的子函数中执行到了return语句,这时将值返回到原来调用这个子函数的代码位置继续执行,也就是说被调用的子函数的return语句之后的语句将不会被执行(可以参考break跳出循环)。
    另:如果不想采用return语句进行值的传输,可以在定义指针参数,在函数执行的过程可以改变实参,以达到值的传输作用。

  4. 仿真在watch窗口查看变量值位not in scope
    原因:在函数内部定义的变量为局部变量,用watch窗口观察时,会出现not in scope
    解决:将变量定义在函数外部,成为全局变量,就能观察到变量的值;应该是因为全局变量是唯一的,而局部变量只作用于函数内部,在不同的函数内都能重复定义,观测时不清楚观测哪个函数内的变量的值

  5. asm(” RPT #N || NOP”)
    作用:用来延时几个时钟周期
    解释:执行N+1次NOP指令,占用N+1个指令周期。正常情况下占用N+1个时钟周期;NOP指令,第四条指令即“NOP”指令,这是一条空操作指令,有调机的作用;asm允许你在你的代码中直接插入汇编语言指令

  6. Keil写代码时出现warning:implicit declaration of function “XXXX“ is invalid in C99解决方法
    解决:①#ifndef -> #ifdef;②头文件未包含,比如说我用到了“adc.c”里面的函数但是主函数的头文件里面没有包含到“adc.h”(主要是头文件问题);③FWLIB里面没有包含到相关的库函数,添加了就可以。

  7. 调试程序,使用程序,不要使用优化编译!!!!
    调试程序,使用程序,不要使用优化编译!!!!
    调试程序,使用程序,不要使用优化编译!!!!

    在这里插入图片描述

  8. 一定需要包含头文件路径:
    点击魔法棒->C/C+±>Include Paths一栏右边添加工程中用到的.h文件的路径,不然在编译和仿真时都会提示找不到该.h文件;

  9. 地址分配
    点击魔法棒->Target->
    Read/Only Memory Areas(ROM存储地址):
    ROM指程序存储的地址,分为片内on-chip和片外off-chip。片内一般指片内flash;
    Read/Write Memory Areas(RAM存储地址):
    与ROM道理一样,
    根据芯片数据手册中存储空间地址映射进行配置。

  10. 生成Project.sct文件
    在地址分配好了之后需要生成一个Project.sct文件;
    点击魔法棒->Linker
    先取消勾选Use Memory Layout from Target Dialog,就可以看到在Scatter File 一栏从灰色不可修改点亮文可修改状态,且自动生成一个sct文件在obj文件的输出路径下;
    再重新勾选Usw Menory Layout from Target Dialog,编译工程
    编译成功后就生成了一个默认的sct文件,其配置与Target页面的内存布局含义一样,再回到Options->Linker就可以点击Edit打开该sct文件
    在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值