豹哥嵌入式讲堂澳门新莆京


  大家好,作者是豹哥,猎豹的豹,犀利哥的哥。今日豹哥给大家讲的是嵌入式开拓里的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
EWARM更是步入了8.0时代,IDE不相上下,但本文要讲的剧情却是每种IDE必须怀有的基本效用,依然持续以IAR
EWARM为例初阶今日的原委:

一、标准IDE功能

澳门新莆京,  在起来明天的主旨早先,豹哥感觉有不可缺少先简要给我们广泛一下职业IDE应该有所的职能。今世IDE基本都是由组件构成,嵌入式开荒中的每种阶段都对应着相应的组件,由这个零器件去落到实处各阶段的急需。

1.1 IDE组件

  规范嵌入式开采相应最少包蕴以下6个阶段,而IA汉兰达里对于每一种阶段都有1个或五个零零器件:

  • 输入(IALAND Editor):编辑源文件代码。
  • 编写翻译(ICCARM、IASMARM):编译源文件代码生成可举办二进制机器码。
  • 解析(C-STAT、MISRA-C):编写翻译进度中检查代码中神秘的难点。
  • 链接(ILINK):链接可进行二进制机器码到钦命ARM存款和储蓄空间地址。
  • 下载(I-jet、flashloader):将链接好的可举行二进制机器码下载进晶片内部非易失性存储器。
  • 调治将养(C-SPY、C-RUN):在线调节和测量检验代码在集成电路中执市场价格况。

  project文件重视用来记录整合上述6个等第的有着支付要求。

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:更加多IAMurano支持的增加文件类型请查阅IAEscort软件设置目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_IDEGuide.ENU.pdf文书档案里的File types风姿罗曼蒂克节。

二、解析project(ewp)文件

  前边豹哥铺垫了非常多IDE/project底蕴概念,该是直接奔着主旨的时候了,本文主演ewp工程文件到底包含如何开荒者钦赐的input音讯?豹哥从上边3个地点为大家爆料:

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.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.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解释请查阅IA奥迪Q3软件安装目录下\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);
    }
}

番外生机勃勃、多少个小本事

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

才具1:运营于异构双核

  前段时间嵌入式产物特别复杂,对MCU的性质供给也尤其高,各大ARM厂家也在相连推出品质更加强大的ARM
MCU成品,超高主频,双核,四核MCU已经不鲜见了。对于里边的部分异构双核MCU成品,不常在开拓中会有那样的供给:你有风度翩翩份的middleware会被异构双核同期调用,而三个不等根基的命令集有一点都不小概率是非常的小器晚成致的,怎么杀绝这几个主题素材?有意中人会想到分别在各个核上面都编写翻译风流倜傥份binary放置于存款和储蓄器不相同岗位,运维时分别指向对应的binary,那是三个措施,但正如浪费存款和储蓄空间,且有望会搞混淆导致误调用。有未有越来越好的点子?
  为了能做到Cortex-M软件重用,ARM公司在筹划Cortex-M微机时为其予以了电脑向下包容软件二进制向上宽容特性。通俗的话来讲就是在异常低版本微处理器上编译的代码能够在较高版本微处理机上实行。所以解决方法正是选取异构双核里异常的低版本的木本在编译middleware,那样那份middleware能够何况被七个核调用。

技巧2:生成PIC代码

  平日和bootloader打交道的对象肯定明白,代码在通过链接阶段生成binary文件后,这一个binary并不是足以放在大三位置的,必得置于linker文件钦点的岗位,假诺地方并没有纠正确,或许会造成施行出错。究其原因,是因为编写翻译器在汇编源代码时因为有些战术并不总是将持有function都汇编成地点非亲非故代码。要是我们依据IDE编译选项将middleware汇编成PIC代码,那么大家得以在工程中央机关单位接参加middleware的binary,然后依附linker的自定义section功效将其放置于自由有个别地方,最后只要为这一个middleware
binary建立三个以binary首地址为标准的函数指针地址列表就可以无障碍调用这几个middleware。

技巧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文件豹哥便介绍完成了,掌声在哪个地方~~~

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注