工程文件,豹哥嵌入式讲堂

技巧1:运营于异构双核

  近来嵌入式产品越来越复杂,对MCU的习性供给也愈发高,各大ATucsonM厂商也在不停推出质量进一步强大的AXC60M
MCU产品,超高主频,双核,四核MCU已经不鲜见了。对于在那之中的局地异构双核MCU产品,有时在付出中会有那样的须求:你有一份的middleware会被异构双核同时调用,而八个不一致基础的下令集有只怕是不平等的,怎么消除那个标题?有意中人会想到分别在各种核上边都编写翻译一份binary停放于存款和储蓄器分裂地点,运行时分别指向对应的binary,那是1个艺术,但相比浪费存款和储蓄空间,且有可能会搞混淆导致误调用。有没有更好的方法?
  为了能一气呵成Cortex-M软件重用,ATiggoM集团在布署Cortex-M处理器时为其授予了电脑向下包容软件二进制向上包容特色。通俗的话来说就是在较低版本处理器上编写翻译的代码可以在较高版本处理器上推行。所以解决办法就是选用异构双核里较低版本的水源在编写翻译middleware,那样那份middleware能够同时被七个核调用。

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

一、标准IDE功能

  在上马今日的大旨以前,豹哥觉得有必不可少先简要给我们普遍一下正式IDE应该具有的机能。现代IDE基本都是由组件构成,嵌入式开发中的每一种阶段都对应着相应的零件,由那个组件去贯彻各阶段的要求。

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.3 编写翻译选项

  编写翻译选项包罗了编写翻译器所急需的有所音信,代码需通过编写翻译器编写翻译才能生成二进制机器码,差别的编写翻译器选项配置会转移区别的机器码,那么必要内定哪些选项呢?打开project的Options选项卡,分别设置下表item:

Position

Item

Description

General Options->Target->

Processor variant->Core

钦命A昂CoraM内核版本

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解释请查阅IALAND软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文书档案里的General
Options和Compiler Options俩小节。

  编写翻译设置音讯正是本文要说的第多个input新闻,当在project中协会好源文件并安装好正确的大局宏定义和编写翻译选项,那么恭喜您,你的application设计工作早就主导形成了。

技巧2:生成PIC代码

  日常和bootloader打交道的爱人一定晓得,代码在经过链接阶段生成binary文件后,那么些binary并不是能够置身任意地点的,必须置于linker文件钦赐的地方,假使地方没有放正确,大概会促成执行出错。究其原因,是因为编写翻译器在汇编源代码时因为部分政策并不延续将有所function都汇编成地方毫无干系代码。如若大家赖以IDE编写翻译选项将middleware汇编成PIC代码,那么大家能够在工程中一向投入middleware的binary,然后借助linker的自定义section功效将其放置于自由有些地点,最终只要为这么些middleware
binary建立2个以binary首地址为尺度的函数指针地址列表即可无障碍调用那一个middleware。


番外壹 、几个小技巧

  又来到豹哥番外时间了,细心的爱人看到上表有两处标蓝,是的正确性,明日的番外内容正是标蓝的品种有关。

三、创建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);
    }
}

一、标准IDE功能

  在起来前天的宗意在此以前,豹哥觉得有必不可少先简要给大家常见一下规范IDE应该具备的意义。现代IDE基本都以由组件构成,嵌入式开发中的每一个阶段都对应着相应的零部件,由那一个零部件去落到实处各等级的须求。

1.2 IDE文件类型

  既然IDE有不少组件,那么与此同时也会设有不一致类别的文件以存款和储蓄这么些零部件的所急需的信息。IARubicon里扶助的文书扩展类型分外多,豹哥在此地仅列举你所创立的工程根目录下的与工程同名的恢弘文件,相信你肯定会以为领悟。

.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:越来越多IAHighlander帮忙的扩张文件类型请查阅IA安德拉软件设置目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文书档案里的File types一节。

1.1 IDE组件

  标准嵌入式开发相应至少包蕴以下多少个等级,而IAKoleos里对于每个阶段都有2个或四个零部件:

  • 输入(IAKuga 艾德itor):编辑源文件代码。
  • 编写翻译(ICCARM、IASMA翼虎M):编写翻译源文件代码生成可实行二进制机器码。
  • 剖析(C-STAT、MISRA-C):编写翻译进程中检查代码中潜在的难题。
  • 链接(ILINK):链接可进行二进制机器码到钦点ALX570M存款和储蓄空间地址。
  • 下载(I-jet、flashloader):将链接好的可进行二进制机器码下载进芯片内部非易失性存款和储蓄器。
  • 调剂(C-SPY、C-RUN):在线调节和测试代码在芯片中执市价况。

  project文件根本用来记录整合上述5个阶段的具有支付要求。

2.2 全局宏定义

  日常选用标准编写翻译的朋友肯定驾驭workspace文件与project文件的关联,3个连串一般只会有2个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.3 编写翻译选项

  编写翻译选项包涵了编写翻译器所急需的具备音信,代码需通过编写翻译器编写翻译才能生成二进制机器码,不相同的编写翻译器选项配置会变卦差异的机器码,那么需求钦命哪些选项呢?打开project的Options选项卡,分别设置下表item:

Position

Item

Description

General Options->Target->

Processor variant->Core

钦定A奥迪Q7M内核版本

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解释请查阅IA君越软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文书档案里的General
Options和Compiler Options俩小节。

  编写翻译设置音信正是本文要说的第五个input音讯,当在project中团队好源文件并设置好正确的大局宏定义和编写翻译选项,那么恭喜你,你的application设计工作早已基本到位了。

番外① 、多少个小技巧

  又过来豹哥番外时间了,细心的朋友看出上表有两处标蓝,是的没错,后日的番外内容正是标蓝的门类有关。


技巧3:引用.c文件

  在档次开销中,大家在二个workspace下会创造多少个project,平时是因为不一致project必要包蕴不一样的.c文件以成功差异的功效。那么能还是无法只开创1个project呢能落到实处分化成效吗?当然能够!平时状态下大家在.c文件中只会用#include
“xx.h”语句来引用.h头文件,其实我们也同样能够引用.c文件,比如那样#include
“xx.c”,只是须求小心尽量不要在.h文件中引用.c文件(除非该.h只会被四个.c文件include)。看到那里的恋人一旦脑洞再大学一年级些,你居然足以成功工程里只须求加上一个.c文件,而其它.c文件全部由添加进工程的不行.c文件逐级(仅能单级)引用进工程。

  至此,嵌入式开发里的project文件豹哥便介绍实现了,掌声在何地~~~

技巧3:引用.c文件

  在项目支出中,大家在2个workspace下会创立多少个project,平时是因为区别project须求包罗差别的.c文件以形成差别的功能。那么能还是无法只开创3个project呢能兑现不相同功用吗?当然能够!平日情形下大家在.c文件中只会用#include
“xx.h”语句来引用.h头文件,其实大家也同等能够引用.c文件,比如那样#include
“xx.c”,只是须要小心尽量不要在.h文件中引用.c文件(除非该.h只会被3个.c文件include)。看到那里的情侣一旦脑洞再大一些,你仍是能够形成工程里只要求丰裕四个.c文件,而任何.c文件全部由添加进工程的尤其.c文件逐级(仅能单级)引用进工程。

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

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
EWAOdysseyM更是进入了8.0一代,IDE各有千秋,但本文要讲的情节却是各样IDE必须怀有的基本功用,还是持续以IAR
EWA锐界M为例初始明日的始末:

二、解析project(ewp)文件

  前面豹哥铺垫了诸多IDE/project基础概念,该是直奔大旨的时候了,本文主演ewp工程文件到底包蕴哪些开发者钦点的input音讯?豹哥从底下3个方面为大家揭穿:

1.2 IDE文件类型

  既然IDE有很多组件,那么与此同时也会设有不一致品类的文书以存款和储蓄那一个零件的所须求的音信。IA酷路泽里帮助的公文增添项目万分多,豹哥在那边仅列举你所开创的工程根目录下的与工程同名的恢宏文件,相信您一定会以为通晓。

.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:愈来愈多IA卡宴协理的扩展文件类型请查阅IAKuga软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文书档案里的File types一节。

1.1 IDE组件

  标准嵌入式开发相应至少包含以下5个阶段,而IAPRADO里对于每一个阶段都有三个或多少个零件:

  • 输入(IASportage 艾德itor):编辑源文件代码。
  • 编写翻译(ICCACRUISERM、IASMA奥迪Q7M):编写翻译源文件代码生成可实施二进制机器码。
  • 浅析(C-STAT、MISRA-C):编写翻译进程中反省代码中潜在的标题。
  • 链接(ILINK):链接可实行二进制机器码到钦命A昂科拉M存款和储蓄空间地址。
  • 下载(I-jet、flashloader):将链接好的可进行二进制机器码下载进芯片内部非易失性存款和储蓄器。
  • 调剂(C-SPY、C-RUN):在线调节和测试代码在芯片中执市场价格况。

  project文件重庆大学用来记录整合上述5个级次的装有费用需求。

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

  前边两节课里,豹哥分别给大家介绍了嵌入式开发中的二种典型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
EWA途乐M更是进入了8.0权且,IDE各有千秋,但本文要讲的剧情却是每一个IDE必须怀有的基本功效,依然接二连三以IAR
EWA奥迪Q5M为例开端前些天的内容:

技术1:运营于异构双核

  近年来嵌入式产品特别复杂,对MCU的属性须要也越来越高,各大A福睿斯M厂商也在不停推出质量更是强大的A卡宴M
MCU产品,超高主频,双核,四核MCU已经不鲜见了。对于里边的一对异构双核MCU产品,有时在付出中会有诸如此类的急需:你有一份的middleware会被异构双核同时调用,而三个不一致基础的吩咐集有大概是不雷同的,怎么消除这一个难题?有对象会想到分别在每一种核上边都编译一份binary放置于存款和储蓄器不一致职位,运营时分别指向对应的binary,那是三个格局,但正如浪费存款和储蓄空间,且有大概会搞混淆导致误调用。有没有更好的法门?
  为了能做到Cortex-M软件重用,ALX570M集团在规划Cortex-M处理器时为其予以了计算机向下兼容软件二进制向上包容特点。通俗的话来说便是在较低版本处理器上编译的代码能够在较高版本处理器上实施。所以化解方式正是选拔异构双核里较低版本的根本在编写翻译middleware,那样那份middleware能够同时被四个核调用。

技巧2:生成PIC代码

  日常和bootloader打交道的恋人肯定知道,代码在通过链接阶段生成binary文件后,这几个binary并不是足以放在任意地点的,必须置于linker文件钦定的职位,如若地方并未放正确,只怕会招致执行出错。究其原因,是因为编译器在汇编源代码时因为一些方针并不总是将富有function都汇编成地点非亲非故代码。若是大家借助IDE编写翻译选项将middleware汇编成PIC代码,那么大家得以在工程中央直机关接进入middleware的binary,然后借助linker的自定义section功能将其放置于自由有个别地点,最后只要为那几个middleware
binary建立1个以binary首地址为原则的函数指针地址列表即可无障碍调用这一个middleware。

三、创建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);
    }
}

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

二、解析project(ewp)文件

  前边豹哥铺垫了众多IDE/project基础概念,该是直奔核心的时候了,本文主演ewp工程文件到底包罗哪些开发者钦赐的input音讯?豹哥从底下3个方面为咱们揭发: