嵌入式开发里的project文件,豹哥分别给我们介绍了嵌入式开发中的二种典型input文件

2.3 编译选项

  编译选项包蕴了编译器所须要的有所信息,代码需经过编译器编译才能生成二进制机器码,不相同的编译器选项配置会生成差别的机器码,那么要求指定哪些选项呢?打开project的Options选项卡,分别设置下表item:

Position

Item

Description

General Options->Target->

Processor variant->Core

指定ARM内核版本

Endian mode

指定内核大小端情势

Floating point settings->FPU

指定内核协理的FPU版本

General Options->Library Configuration->

Library

分选C/C++动态链接库版本

General Options->Library Option 2->

Heap selection

选料HEAP落成版本

C/C++ Compiler->

Language 1->Language

点名编程语言类型

Language 1->C dialect

点名C语言标准

Language 1->Language conformance

慎选对标准C/C++的根据程度

Language 2->Plain ‘char’ is

挑选对char的符号性默许处理形式

Language 2->Floating-point semantics

分选对浮点数的拍卖遵从C标准的水准

Code->Process mode

点名内核指令集情势

Code->Position-independence

选择要转移地点毫不相关代码的对象

Optimizations->Level

选料优化等级

Note:越多ewp文件中option解释请查阅IAR软件设置目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文档里的General
Options和Compiler Options俩小节。

  编译设置音讯就是本文要说的第多少个input信息,当在project中团队好源文件并设置好正确的大局宏定义和编译选项,那么恭喜你,你的application设计工作早已主导形成了。

三、创建demo工程

  为方便后续课程的展开,本节课在最后顺便成立一个demo工程,以下是demo工程的新闻:

IDE:        IAR EWARM v8.11.2
Device:     NXP MKL25Z128VLH4
project layout:   
    \D\myProject\bsp\builds\demo\demo.ewp
    \D\myProject\bsp\linker\iar\KL25Z128xxx4_flash.icf
    \D\myProject\bsp\src\startup_MKL25Z4.s   (仅保留前16个系统中断)
    \D\myProject\bsp\src\system_MKL25Z4.c   (仅做关闭WDOG操作)
    \D\myProject\bsp\src\system_MKL25Z4.h
    \D\myProject\bsp\helloArm.eww
    \D\myProject\src\platfrom\CMSIS
    \D\myProject\src\platfrom\devices\MKL25Z4
    \D\myProject\src\startup\reset.s
    \D\myProject\src\startup\startup.c
    \D\myProject\src\startup\startup.h
    \D\myProject\src\application\main.c
    \D\myProject\src\application\task.c
    \D\myProject\src\application\task.h

// main.c
//////////////////////////////////////////////////////////
#include "task.h"
const uint32_t s_constant = 0x7f;
int main(void)
{
    uint32_t l_variable = 0x7f;
    if (s_constant == l_variable)
    {
        normal_task();
        ram_task();
        heap_task();
    }
    while (1);
}

// task.c
//////////////////////////////////////////////////////////
#include "task.h"
static    uint32_t s_variable0;
__no_init uint32_t n_variable1;
static    uint32_t s_variable2 = 0x5a;
static uint8_t s_array[16];
void normal_task(void)
{
    s_variable0 *= 2;
}
__ramfunc void ram_task(void)
{
    n_variable1++;
}
void heap_task(void)
{
    uint8_t *heap = (uint8_t *)malloc(16 * sizeof(uint8_t));
    if (heap != NULL)
    {
        memset(heap, 0xa5+s_variable2, 16);
        memcpy(s_array, heap, 16);
        s_variable0 = (uint32_t)heap;
        free(heap);
    }
}

2.1 源文件社团

  一个略带复杂一点的嵌入式工程,应用代码行数应该是以百行/千行为单位计算的(此处仅指的是由开发者自己创制的文书与代码),大家在团队代码的时候肯定不会只创立一个.c文件,单文件会导致代码成效模块结构不明晰,不便宜工程的军事管制与有限帮衬。
  当我们为工程创设三个文本时,就会波及到一个自然难题:引用路径难题(所以路径音讯就是本文要说的首先个input音讯)。当源文件数量较多时,平常大家会创制不一样文件夹把相同作用的源文件都坐落一块儿,当编译器发轫编译.c源文件时会搜索include语句所包罗的头文件。熟识C语言的恋人一定驾驭上面二种不相同include语句的用法:

#include <file.h>           // 引用编译器类库下的头文件(IDE安装路径)
#include "file.h"           // 引用当前工程下的头文件(project路径)

  所以在ewp文件里会含有路径消息,所有路线都应有列在Options->C/C++
Compiler->Preprocessor下有Additional include
directories里,那几个途径既可以是当下PC的相对路径,也得以是以ewp文件为条件的相对路径,为了确保工程得以在自由PC任意地方下健康编译,推荐使用如下相对路径方式列出装有路线:

ewp当前路径:$PROJ_DIR$/
ewp下级路径:$PROJ_DIR$/xxFolder/
ewp上级路径:$PROJ_DIR$/../

  说到路径难点,豹哥在此地顺便给大家介绍一种经典的嵌入式工程文件目录社团章程:

\projectDir
           \doc                            --放置工程文档

           \bsp                            --放置bsp(板级)相关的source file
                  \linker                    --工程linker文件
                  \src                       --板级相关的源文件(比如pinout,clock等)
                  \builds\xxBuild\.ewp       --工程ewp文件
                  .eww                       --工程workspace文件

           \src                            --放置bsp无关的source file
                  \platform                  --芯片头文件及CMSIS文件
                  \drivers                   --芯片片内外设driver
                  \include                   --要被所有source引用的头文件
                  \startup                   --标准的startup code
                  \utilities                 --标准的通用函数
                  \middleware                --独立的中间件
                  \components                --板级外设组件driver
                  \application               --当前应用主逻辑代码

2.1 源文件社团

  一个略带复杂一点的嵌入式工程,应用代码行数应该是以百行/千行为单位测算的(此处仅指的是由开发者自己创办的文本与代码),大家在集团代码的时候一定不会只成立一个.c文件,单文件会导致代码功效模块结构不明晰,不便宜工程的治本与保安。
  当大家为工程创制多少个文本时,就会波及到一个必将难题:引用路径难点(所以路径新闻就是本文要说的首先个input音信)。当源文件数量较多时,经常大家会创制分歧文件夹把相同效果的源文件都位居一起,当编译器发轫编译.c源文件时会搜索include语句所富含的头文件。了解C语言的意中人肯定晓得上面三种不一致include语句的用法:

#include <file.h>           // 引用编译器类库下的头文件(IDE安装路径)
#include "file.h"           // 引用当前工程下的头文件(project路径)

  所以在ewp文件里会包罗路径新闻,所有途径都应当列在Options->C/C++
Compiler->Preprocessor下有Additional include
directories里,那么些路子既可以是当前PC的相对路径,也得以是以ewp文件为条件的相对路径,为了确保工程得以在自由PC任意地方下健康编译,推荐使用如下相对路径格局列出装有路线:

ewp当前路径:$PROJ_DIR$/
ewp下级路径:$PROJ_DIR$/xxFolder/
ewp上级路径:$PROJ_DIR$/../

  说到路径难题,豹哥在此地顺便给我们介绍一种经典的嵌入式工程文件目录协会形式:

\projectDir
           \doc                            --放置工程文档

           \bsp                            --放置bsp(板级)相关的source file
                  \linker                    --工程linker文件
                  \src                       --板级相关的源文件(比如pinout,clock等)
                  \builds\xxBuild\.ewp       --工程ewp文件
                  .eww                       --工程workspace文件

           \src                            --放置bsp无关的source file
                  \platform                  --芯片头文件及CMSIS文件
                  \drivers                   --芯片片内外设driver
                  \include                   --要被所有source引用的头文件
                  \startup                   --标准的startup code
                  \utilities                 --标准的通用函数
                  \middleware                --独立的中间件
                  \components                --板级外设组件driver
                  \application               --当前应用主逻辑代码

  前面两节课里,豹哥分别给大家介绍了嵌入式开发中的二种典型input文件:source文件linker文件。豹哥要再度提问了,还有没有input文件呢?答案真的是有,但本次真正是有且仅有了,本文要介绍的中坚project文件也属于半个input文件。为何说是半个?因为project文件不仅含有开发者指定的input音讯,还富含众多别样帮助调试的input/output信息,算是嵌入式开发中承前启后的文件。而本文侧重点在于project文件中与开发者应用相关的input新闻,仅当拿到了这个input音讯,再加上后边介绍的source和linker文件,那么你就早已获得了application所有的新闻,你可以用它们来可以生成无歧义的可进行image
binary。
  随着嵌入式软件工程的进步,为了回应日益复杂的须要,现代IDE的成效也进一步强大了,IDE版本更迭令人应接不暇,Keil
MDK已然踏入5.0时代,IAR
EWARM更是进入了8.0时日,IDE各有千秋,但本文要讲的情节却是每个IDE必须怀有的基本成效,仍然持续以IAR
EWARM为例起头今日的始末:

番外一、多少个小技巧

  又赶到豹哥番外时间了,细心的意中人看出上表有两处标蓝,是的正确,明天的番外内容就是标蓝的品类有关。

1.1 IDE组件

  标准嵌入式开发相应至少包含以下6个等级,而IAR里对于每个阶段都有1个或七个零件:

  • 输入(IAR Editor):编辑源文件代码。
  • 编译(ICCARM、IASMARM):编译源文件代码生成可实施二进制机器码。
  • 剖析(C-STAT、MISRA-C):编译进程中检查代码中潜在的难题。
  • 链接(ILINK):链接可实施二进制机器码到指定ARM存储空间地址。
  • 下载(I-jet、flashloader):将链接好的可实施二进制机器码下载进芯片里面非易失性存储器。
  • 调剂(C-SPY、C-RUN):在线调试代码在芯片中举行景况。

  project文件珍重用来记录整合上述6个级次的保有开销必要。

二、解析project(ewp)文件

  前边豹哥铺垫了无数IDE/project基础概念,该是直奔主旨的时候了,本文主演ewp工程文件到底蕴涵怎么着开发者指定的input新闻?豹哥从上面3个方面为大家揭发:

三、创建demo工程

  为便于后续课程的展开,本节课在最终顺便创制一个demo工程,以下是demo工程的音信:

IDE:        IAR EWARM v8.11.2
Device:     NXP MKL25Z128VLH4
project layout:   
    \D\myProject\bsp\builds\demo\demo.ewp
    \D\myProject\bsp\linker\iar\KL25Z128xxx4_flash.icf
    \D\myProject\bsp\src\startup_MKL25Z4.s   (仅保留前16个系统中断)
    \D\myProject\bsp\src\system_MKL25Z4.c   (仅做关闭WDOG操作)
    \D\myProject\bsp\src\system_MKL25Z4.h
    \D\myProject\bsp\helloArm.eww
    \D\myProject\src\platfrom\CMSIS
    \D\myProject\src\platfrom\devices\MKL25Z4
    \D\myProject\src\startup\reset.s
    \D\myProject\src\startup\startup.c
    \D\myProject\src\startup\startup.h
    \D\myProject\src\application\main.c
    \D\myProject\src\application\task.c
    \D\myProject\src\application\task.h

// main.c
//////////////////////////////////////////////////////////
#include "task.h"
const uint32_t s_constant = 0x7f;
int main(void)
{
    uint32_t l_variable = 0x7f;
    if (s_constant == l_variable)
    {
        normal_task();
        ram_task();
        heap_task();
    }
    while (1);
}

// task.c
//////////////////////////////////////////////////////////
#include "task.h"
static    uint32_t s_variable0;
__no_init uint32_t n_variable1;
static    uint32_t s_variable2 = 0x5a;
static uint8_t s_array[16];
void normal_task(void)
{
    s_variable0 *= 2;
}
__ramfunc void ram_task(void)
{
    n_variable1++;
}
void heap_task(void)
{
    uint8_t *heap = (uint8_t *)malloc(16 * sizeof(uint8_t));
    if (heap != NULL)
    {
        memset(heap, 0xa5+s_variable2, 16);
        memcpy(s_array, heap, 16);
        s_variable0 = (uint32_t)heap;
        free(heap);
    }
}

技巧1:运行于异构双核

  如今嵌入式产品尤其复杂,对MCU的质量须要也愈加高,各大ARM厂商也在不停推出品质更是强大的ARM
MCU产品,超高主频,双核,四核MCU已经不鲜见了。对于里边的部分异构双核MCU产品,有时在开发中会有那般的须求:你有一份的middleware会被异构双核同时调用,而七个不等基础的一声令下集有可能是不等同的,怎么解决那个难点?有意中人会想到分别在每个核上面都编译一份binary停放于存储器差异岗位,运行时分别指向对应的binary,那是一个方法,但相比较浪费存储空间,且有可能会搞混淆导致误调用。有没有更好的法门?
  为了能做到Cortex-M软件重用,ARM公司在统筹Cortex-M处理器时为其予以了电脑向下包容软件二进制向上包容特性。通俗的话来说就是在较低版本处理器上编译的代码可以在较高版本处理器上推行。所以解决办法就是选取异构双核里较低版本的基础在编译middleware,这样那份middleware可以同时被多个核调用。

技能1:运行于异构双核

  近来嵌入式产品越发复杂,对MCU的品质须求也越来越高,各大ARM厂商也在时时刻刻推出品质更是强大的ARM
MCU产品,超高主频,双核,四核MCU已经不鲜见了。对于里边的一部分异构双核MCU产品,有时在开发中会有这般的必要:你有一份的middleware会被异构双核同时调用,而多少个不等基础的指令集有可能是不雷同的,怎么化解那么些难点?有意中人会想到分别在各样核上边都编译一份binary放置于存储器不相同义务,运行时分别指向对应的binary,这是一个主意,但正如浪费存储空间,且有可能会搞混淆导致误调用。有没有更好的章程?
  为了能不辱职责Cortex-M软件重用,ARM公司在统筹Cortex-M处理器时为其予以了微机向下包容软件二进制向上包容特色。通俗的话来说就是在较低版本处理器上编译的代码可以在较高版本处理器上推行。所以解决措施就是选择异构双核里较低版本的内核在编译middleware,那样那份middleware可以而且被七个核调用。

1.2 IDE文件类型

  既然IDE有过多组件,那么与此同时也会设有分化品种的文件以存储那个零件的所急需的音讯。IAR里援救的文书扩充类型相当多,豹哥在那里仅列举你所成立的工程根目录下的与工程同名的增加文件,相信您肯定会觉得驾驭。

.eww           // Workspace file
.ewp           // IAR Embedded Workbench project
.ewd           // Project settings for C-SPY
.ewt           // Project settings for C-STAT and C-RUN</td>
.dep           // Dependency information

  本文要讲的内容都包罗在.ewp文件里,ewp文件记录了开发者为运用指定的不行缺失的input新闻,没有那一个音信,application工程是不完整的。换句话说,倘使你取得了application的富有source文件和linker文件,但尚未ewp文件的话,可能引致最平生成的image
binary文件是见仁见智的。

Note:越来越多IAR帮衬的壮大文件类型请查阅IAR软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文档里的File types一节。

  后面两节课里,豹哥分别给我们介绍了嵌入式开发中的三种典型input文件:source文件linker文件。豹哥要再次提问了,还有没有input文件呢?答案真的是有,但本次真的是有且仅有了,本文要介绍的中坚project文件也属于半个input文件。为何说是半个?因为project文件不但包蕴开发者指定的input音信,还包含众多其他援救调试的input/output音讯,算是嵌入式开发中承前启后的文书。而本文侧重点在于project文件中与开发者应用相关的input新闻,仅当获得了这一个input信息,再增进前面介绍的source和linker文件,那么您就曾经得到了application所有的音信,你可以用它们来可以生成无歧义的可实施image
binary。
  随着嵌入式软件工程的前进,为了回应日益复杂的要求,现代IDE的意义也越来越强大了,IDE版本更迭令人无暇,Keil
MDK已然踏入5.0时代,IAR
EWARM更是进入了8.0时日,IDE各有千秋,但本文要讲的始末却是每个IDE必须拥有的基本成效,依然三番一遍以IAR
EWARM为例初叶前几日的情节:

一、标准IDE功能

  在开首明天的主意之前,豹哥觉得有须求先简要给大家常见一下标准IDE应该具备的效应。现代IDE基本都是由组件构成,嵌入式开发中的每个阶段都对应着相应的零件,由这一个零件去完结各等级的要求。

  大家好,我是豹哥,猎豹的豹,犀利哥的哥。今日豹哥给我们讲的是嵌入式开发里的project文件

技巧3:引用.c文件

  在项目支出中,大家在一个workspace下会创立七个project,日常是因为差异project须求包涵不相同的.c文件以落成区其余效益。那么能仍旧不能够只创立一个project呢能兑现差距功能吗?当然可以!平时状态下我们在.c文件中只会用#include
“xx.h”语句来引用.h头文件,其实大家也同样能够引用.c文件,比如那样#include
“xx.c”,只是须求小心尽量不要在.h文件中引用.c文件(除非该.h只会被一个.c文件include)。看到这里的意中人即使脑洞再大一些,你甚至足以成功工程里只需求添加一个.c文件,而任何.c文件全体由添加进工程的百般.c文件逐级(仅能单级)引用进工程。

  至此,嵌入式开发里的project文件豹哥便介绍完结了,掌声在什么地方~~~

2.3 编译选项

  编译选项包涵了编译器所急需的具有音信,代码需经过编译器编译才能生成二进制机器码,分裂的编译器选项配置会生成不一样的机器码,那么要求指定哪些选项呢?打开project的Options选项卡,分别设置下表item:

Position

Item

Description

General Options->Target->

Processor variant->Core

指定ARM内核版本

Endian mode

点名内核大小端方式

Floating point settings->FPU

点名内核帮助的FPU版本

General Options->Library Configuration->

Library

选择C/C++动态链接库版本

General Options->Library Option 2->

Heap selection

分选HEAP完成版本

C/C++ Compiler->

Language 1->Language

点名编程语言类型

Language 1->C dialect

点名C语言标准

Language 1->Language conformance

选取对标准C/C++的依照程度

Language 2->Plain ‘char’ is

分选对char的符号性默许处理措施

Language 2->Floating-point semantics

选料对浮点数的拍卖坚守C标准的程度

Code->Process mode

指定内核指令集格局

Code->Position-independence

分选要转变地点毫不相关代码的目的

Optimizations->Level

选料优化等级

Note:更加多ewp文件中option解释请查阅IAR软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文档里的General
Options和Compiler Options俩小节。

  编译设置音讯就是本文要说的第多少个input音讯,当在project中社团好源文件并安装好正确的大局宏定义和编译选项,那么恭喜你,你的application设计工作一度基本做到了。

番外一、多少个小技巧

  又过来豹哥番外时间了,细心的心上人看出上表有两处标蓝,是的不错,前几天的番外内容就是标蓝的种类有关。

1.2 IDE文件类型

  既然IDE有很多组件,那么与此同时也会设有不一样类型的公文以存储这么些零件的所要求的音讯。IAR里扶助的文书增加项目格外多,豹哥在那里仅列举你所创设的工程根目录下的与工程同名的壮大文件,相信你肯定会觉得精通。

.eww           // Workspace file
.ewp           // IAR Embedded Workbench project
.ewd           // Project settings for C-SPY
.ewt           // Project settings for C-STAT and C-RUN</td>
.dep           // Dependency information

  本文要讲的始末都含有在.ewp文件里,ewp文件记录了开发者为利用指定的不得缺失的input新闻,没有这一个新闻,application工程是不完全的。换句话说,即使您收获了application的享有source文件和linker文件,但尚无ewp文件的话,可能造成最平生成的image
binary文件是区其余。

Note:越来越多IAR援救的恢弘文件类型请查阅IAR软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文档里的File types一节。

  大家好,我是豹哥,猎豹的豹,犀利哥的哥。前日豹哥给大家讲的是嵌入式开发里的project文件

技巧3:引用.c文件

  在品种开发中,大家在一个workspace下会创制多个project,日常是因为分裂project必要包罗差其他.c文件以已毕分化的效劳。那么能无法只创立一个project呢能兑现分裂成效吗?当然能够!平日状态下大家在.c文件中只会用#include
“xx.h”语句来引用.h头文件,其实我们也一如既往可以引用.c文件,比如那样#include
“xx.c”,只是需求留意尽量不要在.h文件中引用.c文件(除非该.h只会被一个.c文件include)。看到此间的情人如果脑洞再大一点,你依然足以成功工程里只需求添加一个.c文件,而别的.c文件全部由添加进工程的格外.c文件逐级(仅能单级)引用进工程。

  至此,嵌入式开发里的project文件豹哥便介绍完成了,掌声在哪里~~~

二、解析project(ewp)文件

  前边豹哥铺垫了无数IDE/project基础概念,该是直奔主旨的时候了,本文主演ewp工程文件到底包括怎么样开发者指定的input音讯?豹哥从上面3个地方为大家揭发:

一、标准IDE功能

  在起首今日的主旨以前,豹哥觉得有须求先简要给我们普遍一下标准IDE应该具备的功力。现代IDE基本都是由组件构成,嵌入式开发中的每个阶段都对应着相应的零件,由那些零部件去落到实处各等级的要求。

2.2 全局宏定义

  平日使用标准编译的恋人一定知道workspace文件与project文件的关联,一个品种一般只会有一个eww文件,但却可能会有多少个ewp文件,那是因为源代码里日常会有规范编译,大家有时候会给品种分歧的安顿从而编译出分歧的结果(速度优先/面积优先,特性控制…),那个布置就是由全局宏定义来完毕的,打开Options->C/C++
Compiler->Preprocessor下的Defined
symbols,在框内写入你必要定义的全局宏:

MACRO1            // 等价于源文件里的#define MACRO1 (1)
MACRO2=2          // 等价于源文件里的#define MACRO2 (2)

  全局宏音讯就是本文要说的首个input音信,如若全局宏新闻丢失,有时候工程编译并不会报错,因为编译器在处理如下普遍用法里的规格编译语句时会默许未定义的宏为0,而在处理推荐用法里的尺度编译语句则会报错,所以推举我们利用第两种规格编译用法来躲避全局宏难题。

// 普遍用法
#if MACRO
    // your code block 1
#else
    // your code block 2
#endif

// 推荐用法
#if !defined(MACRO)
    #error "No valid MACRO defined!"
#elif (MACRO == 1)
    // your code block 1
#else
    // your code block 2
#endif

2.2 全局宏定义

  平日采纳口径编译的对象肯定领悟workspace文件与project文件的关联,一个序列一般只会有一个eww文件,但却可能会有多少个ewp文件,那是因为源代码里平时会有规范编译,大家有时会给项目区其余安排从而编译出分裂的结果(速度优先/面积优先,特性控制…),那么些配置就是由全局宏定义来完毕的,打开Options->C/C++
Compiler->Preprocessor下的Defined
symbols,在框内写入你必要定义的全局宏:

MACRO1            // 等价于源文件里的#define MACRO1 (1)
MACRO2=2          // 等价于源文件里的#define MACRO2 (2)

  全局宏新闻就是本文要说的第三个input音信,假如全局宏音讯丢失,有时候工程编译并不会报错,因为编译器在处理如下普遍用法里的原则编译语句时会默许未定义的宏为0,而在处理推荐用法里的尺码编译语句则会报错,所以推举大家使用第三种规格编译用法来规避全局宏难点。

// 普遍用法
#if MACRO
    // your code block 1
#else
    // your code block 2
#endif

// 推荐用法
#if !defined(MACRO)
    #error "No valid MACRO defined!"
#elif (MACRO == 1)
    // your code block 1
#else
    // your code block 2
#endif

1.1 IDE组件

  标准嵌入式开发相应至少包罗以下6个级次,而IAR里对于每个阶段都有1个或多个零件:

  • 输入(IAR Editor):编辑源文件代码。
  • 编译(ICCARM、IASMARM):编译源文件代码生成可实施二进制机器码。
  • 浅析(C-STAT、MISRA-C):编译进度中反省代码中潜在的难题。
  • 链接(ILINK):链接可实施二进制机器码到指定ARM存储空间地址。
  • 下载(I-jet、flashloader):将链接好的可实施二进制机器码下载进芯片里面非易失性存储器。
  • 调剂(C-SPY、C-RUN):在线调试代码在芯片中施行意况。

  project文件器重用来记录整合上述6个等级的拥有支付须要。

技巧2:生成PIC代码

  常常和bootloader打交道的对象肯定知道,代码在经过链接阶段生成binary文件后,那么些binary并不是足以置身任意地点的,必须置于linker文件指定的职位,如果地方并未放正确,可能会促成执行出错。究其原因,是因为编译器在汇编源代码时因为有些策略并不三番五次将富有function都汇编成地方非亲非故代码。如若我们依靠IDE编译选项将middleware汇编成PIC代码,那么我们得以在工程中间接参与middleware的binary,然后借助linker的自定义section效率将其放置于自由某个地点,最后只要为那么些middleware
binary建立一个以binary首地址为尺度的函数指针地址列表即可无障碍调用这几个middleware。

技巧2:生成PIC代码

  平常和bootloader打交道的爱人一定理解,代码在通过链接阶段生成binary文件后,那些binary并不是可以置身任意地点的,必须置于linker文件指定的职位,要是地点并未放正确,可能会促成执行出错。究其原因,是因为编译器在汇编源代码时因为有些国策并不三番五次将所有function都汇编成地方无关代码。假诺大家赖以IDE编译选项将middleware汇编成PIC代码,那么大家得以在工程中直接参预middleware的binary,然后借助linker的自定义section功用将其放置于自由某个地方,最后只要为这几个middleware
binary建立一个以binary首地址为尺度的函数指针地址列表即可无障碍调用那几个middleware。

相关文章