首页 > 其他分享 >Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E

时间:2022-12-06 12:31:40浏览次数:58  
标签:.__ L6982E Keil section id 代码优化 motor 0x1100CE00 ARM


  1. 当使用O0优化时,可以正常进行编译

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_代码优化

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_#pragma_02

 

2、当选择O2优化时,编译会报错

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_Test_03

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_#pragma_04

 3、在motor_id.c文件中,使用arm section来将数据指定到特定位置

#pragma arm section rwdata = ".ARM.__at_0x1100CE00"

 

Parameter1             _Parameter1 =

{

  ……

};

 

Parameter2             _Parameter2=

{

  ……

};

Parameter3             _Parameter3 =

{

  ……

};

 

Parameter4            _Parameter4=

{

  ……

};

#pragma arm section

程序原意是将_Parameter1、_Parameter2、_Parameter3、_Parameter4四个结构体中的数据都指定到0x1100CE00起始的位置,在O0优化等级下程序这样写没有问题,但在O2优化等级下程序会报错。

错误详细信息如下:

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce04 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce13.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce04 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce0c.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce04 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce30.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce04 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce04 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce13 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce0c.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce13 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce30.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce13 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce13 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce0c overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce30.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce0c overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce0c overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce30 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce30 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

.\Objects\Test 9843_2QX.axf: Error: L6982E: AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28 overlaps address range with AT section motor_id.o(.ARM.__at_0x1100CE00) with base 0x1100ce00 limit 0x1100ce28.

 

分析编译时的输出log,可以大概看出是几个结构体的位置分配发生错乱,如果想在O0优化等级下使用arm section将几个结构体指定到特定存储地址,需要将程序进行修改。

4、修改步骤3中的程序

#pragma arm section rwdata = ".ARM.__at_0x1100CE00"

 

Parameter1             _Parameter1 =

{

  ……

};

 

#pragma arm section

 

#pragma arm section rwdata = ".ARM.__at_0x1100CE04"  //04是_Parameter1结构体的大小

 

 

Parameter2             _Parameter2=

{

  ……

};

 

 

#pragma arm section

 

#pragma arm section rwdata = ".ARM.__at_0x1100CE08"  //08是_Parameter1 + _Parameter2结构体的大小

 

 

Parameter3             _Parameter3 =

{

  ……

};

 

#pragma arm section

 

#pragma arm section rwdata = ".ARM.__at_0x1100CE0C"  //0C是_Parameter1 + _Parameter2+ _Parameter3结构体的大小

 

 

Parameter4            _Parameter4=

{

  ……

};

#pragma arm section

 

此时再进行编译就会正常,而且程序大小也会变小。

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_Test_05

 

5、Keil中几个代码优化等级的说明

Keil中使用arm section进行绝对地址定位并进行O2等级代码优化时报错: Error: L6982E_#pragma_06

Keil中代码优化等级主要有四个O0、O1、O2、O3,默认的优化等级为O2

O0:使用最低优化,多数优化都被关闭,生成的代码具有最多的调试信息。

O1:使用有限优化,未使用的内联函数、未使用的静态函数以及冗余代码

          都会被移除,指令会被重新排序以避免互锁的情况。生成的代码会被

          适度优化,并且比较适合调试。

O2:使用高度优化,根据处理器的特定行为优化程序代码,生成的代码为

         高度优化的,并且具有有限的调试信息。

O3:使用极端优化,根据时间/空间选项进行优化,默认为多文件编译,它

          可以提供最高等级的优化,但编译时间会稍微长些,软件调试信息也

          比较少。

一般情况下采用default即O2等级的代码优化即可,如果采用O1、O2,则代码空间会变大,但会多很多调试信息,而使用O3的话有时候会对代码业务逻辑产生影响,所以一般采用O2等级进行优化代码。

标签:.__,L6982E,Keil,section,id,代码优化,motor,0x1100CE00,ARM
From: https://blog.51cto.com/u_15903730/5915629

相关文章

  • KEIL软件使用方法,创建一个工程
    单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了......
  • RT-Thread的信号 在keil中使用程序框架
    按照如下方式,添加信号,使用信号信号量的原理:操作系统中的信号量在解决线程之间的同步中起着非常大的作用,那么什么是信号量呢?百度百科:信号量(Semaphore),有时被称为信号灯,......
  • vscode开发keil配置记录
    插件详细配置过程:C/C++(语言支持)、ChineseSimplified(编辑器汉化)、KeilAssistant(支持Keil工具)、TabnineAutocompleteAI(代码补齐)https://blog.csdn.net/xue_nuo......
  • 【转】嵌入式C语言代码优化方案
    来源:嵌入式C语言代码优化方案(深度好文,建议花时间研读并收藏)(qq.com)1、选择合适的算法和数据结构选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量......
  • 如何判断Keil MDK ARM中已经破解?如何判断Keil MDK ARM中已经安装了相应的器件库?如何判
    如何判断CubeMX的器件库已经安装成功?请对照下图如何判断Keil MDK ARM中已经安装了相应的器件库?请看下图如何判断CubeMX的器件库已经安装成功?请对照下图 ......
  • ARM-KEIL的堆栈模型
    《这么好用?!99%开发者从未听说过的堆栈模型(加量增强版)》一堆,栈,arm的堆和栈增长方向:堆是用于动态分配,栈是用于上下文切换(譬如函数调用,线程调用)参数,返回值,局部变量的包含。C......
  • 做前端,你一定会SEO网页代码优化,完全搞懂有意外收获
    你一定不知道,在前端代码规范上,还有SEO代码规范,作为学习前端的你稍后了解呢?SEO代码规范一方面是为了获取流量,如果你能运用的炉火纯青,在移动端和PC端网站应用上,那么你就可以......
  • 第十章代码优化
    一、基本块和流图基本块;  基本块的一些特点:①   流图: 二、常见代码优化方法(1)删除公共子表达式(2)删除无用代码三、基本块优化基本块的DAG表示 ......
  • spark代码优化
    Spark代码优化RDD、DataFrame、DataStream、DataSet四者的区别?1、RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。2、DataFrame除了提供了比RDD更......
  • Keil软件 fail to excute "C://C51//BIN//C51.exe"解决方案
    原因:编译器的路径因修改过而导致的错误解决方法:重新设置编译器的默认路径1、在Project->Components,Environment,Books...  2、Folders/Extensions 修改ToolB......