嵌入式


自定义配置

<h4>自定义配置</h4> <p><code>ARM mbed</code>使用<code>JSON</code>描述构建的目标。在<code>targets/targets.json</code>可以找到构建目标,或在应用根目录下可以<code>custom_targets.json</code>可以找到构建目标。如果你提供了<code>--source</code>,<code>Mbed</code>将查找这个目录下的<code>custom_targets.json</code>.当你在<code>custom_targets.json</code>中增加新目标,他们将加到可用目标的列表里,并加入扫描规则。</p> <blockquote> <p>The Online Compiler does not support this functionality. You need to use Mbed CLI to take your code offline.</p> </blockquote> <p><code>custom_targets.json</code>例:</p> <pre><code>{ "TEENSY3_1": { "inherits": ["Target"], "core": "Cortex-M4", "extra_labels": ["Freescale", "K20XX", "K20DX256"], "OUTPUT_EXT": "hex", "is_disk_virtual": true, "supported_toolchains": ["GCC_ARM", "ARM"], "post_binary_hook": { "function": "TEENSY3_1Code.binary_hook", "toolchains": ["ARM_STD", "ARM_MICRO", "GCC_ARM"] }, "device_name": "MK20DX256xxx7", "detect_code": ["0230"] } }</code></pre> <h2>标准属性</h2> <p>以下列出<code>mbed</code>可理解的所有属性。除非特殊说明,否则所有属性都是可选的。</p> <h4><code>inherits</code></h4> <p>当目标继承其他目标时,它称为孩子,其他目标称为父亲。孩子自动拷贝父亲的所有属性。孩子拷贝完父亲所有属性后,它可以复写或增加或删除这些属性。</p> <pre><code>"Target": { "core": null, "default_toolchain": "ARM", "supported_toolchains": null, "extra_labels": [], "is_disk_virtual": false, "macros": [], "detect_code": [], "public": false }</code></pre> <p>继承顺序的描述:</p> <ol> <li>查找当前目标的属性</li> <li>若没有找到,找第一个父亲的属性,然后是父亲的父亲。</li> <li>若没有找打,找剩下的父亲的属性</li> </ol> <h4><code>core</code></h4> <p><code>ARM</code>核心,可能的值: &quot;Cortex-M0&quot;, &quot;Cortex-M0+&quot;, &quot;Cortex-M1&quot;, &quot;Cortex-M3&quot;, &quot;Cortex-M4&quot;, &quot;Cortex-M4F&quot;, &quot;Cortex-M7&quot;, &quot;Cortex-M7F&quot;, &quot;Cortex-A9&quot;, &quot;Cortex-M23&quot;, &quot;Cortex-M23-NS&quot;, &quot;Cortex-M33&quot;, &quot;Cortex-M33-NS&quot;</p> <h4><code>public</code></h4> <p>控制构建系统可以构建哪些目标,你可能定义其他目标的父亲目标。那么它的<code>public</code>属性必须是<code>false</code>。默认<code>true</code></p> <h4><code>macros, macros_add and macros_remove</code></h4> <p><code>macro</code>属性定义了编译代码是可用的宏列表。你可以没有值或有值的宏。如,<code>"macros": ["NO_VALUE", "VALUE=10"]</code>将加入<code>-DNO_VALUE -DVALUE=10</code>到编译器命令行。当目标继承它时,他可以使用<code>macros_add</code>和<code>macros_remove</code>重定义宏</p> <pre><code> "TargetA": { "macros": ["PARENT_MACRO1", "PARENT_MACRO2"] }, "TargetB": { "inherits": ["TargetA"], "macros_add": ["CHILD_MACRO1"], "macros_remove": ["PARENT_MACRO2"] }</code></pre> <h4><code>extra_labels, extra_labels_add and extra_labels_remove</code></h4> <p>标签列表定义了构建系统如何查找源目录和包含目录等。<code>extra_labels</code>使构建系统可以意识到额外需要扫描文件的目录。 当目标继承时可以使用<code>extra_labels_add</code>和<code>extra_labels_remove</code>改变<code>extra_labels</code>的值。</p> <h4><code>features, features_add and features_remove</code></h4> <p><code>feature</code>列表打开软件特性。类似<code>extra_labels</code>,<code>feature</code>使构建系统意识到额外的目录扫描这些资源。不同于<code>extra_labels</code>,构建系统识别列表中固定的取值集合。构建系统识别以下特性:</p> <ul> <li>BOOTLOADER.</li> <li>BLE.</li> <li>CRYPTOCELL310. 当使用这个列表以外的特性时构建系统将报错。 当你使用目标继承时,你可使用<code>features_add</code>和<code>features_remove</code>改变特性值。</li> </ul> <h4><code>config</code>和复写</h4> <blockquote> <p><code>Arm Mbed</code>配置系统自定义组件(目标,库和应用)的编译时间 .每个组件可以定义配置参数。这些参数的值可以以不同的方式复写。</p> </blockquote> <p><code>config</code>列表提供了改写宏的方法。每个配置有一个默认值。默认宏的名字是配置的名字。如</p> <pre><code>"config": { "clock_src": { "help": "Clock source to use, can be XTAL or RC", "value": "XTAL" }, "clock_freq": { "help": "Clock frequency in Mhz", "value": "16", "macro_name": "CLOCK_FREQUENCY_MHZ" } }</code></pre> <p><code>clock_src</code>的宏是<code>CLOCK_SRC</code>,配置<code>clock_freq</code>的宏是<code>CLOCK_FREQUENCY_MHZ</code>. <code>overrides</code>允许孩子目标改写配置的值。如 孩子目标使用内部的RC时钟代替晶振。</p> <pre><code>"overrides": { "clock_src": "RC" }</code></pre> <p>你可以使用<code>target_overrides</code>改写<code>config</code>的值</p> <pre><code>"target_overrides": { "*": { "clock_src": "RC" }, "NRF51_DK": { "clock_freq": "16" } }</code></pre> <h4><code>device_has</code></h4> <p>定义设备有哪些硬件的列表.<code>Mbed</code>,库和应用源码可以选择执行不同的可用硬件的驱动;选择只编译存在硬件的驱动;只运行特定平台的测试。<strong><code>device_has</code>的值在<code>C</code>,<code>C++</code>和汇编中作为<code>DEVICE_</code>前缀的宏都可以使用</strong>。</p> <h4><code>is_disk_virtual</code></h4> <p>打开在烧写固件完成后增加延迟确保mount是正确的。这个字段不再使用.<code>Mbed</code>测试工具使用<code>Mbed LS</code>确保烧录前<code>mount</code>是正确的。</p> <h4><code>supported toolchain</code></h4> <p>支持目标的工具链列表,可取值为: ARM, uARM, ARMC5, ARMC6, GCC_ARM and IAR. 当使用<code>ARM,ARMC5,ARMC6</code>时请注意:</p> <ul> <li>如果目标只支持<code>Arm Compiler 5 (version 5.06 update 6)</code>,<code>supported_toolchains</code>指定<code>ARMC5</code>。构建系统使用<code>Arm Compiler 5</code>当使用<code>-t ARM</code>或<code>-t ARMC5</code></li> <li>当目标只支持<code>Arm Compiler 6 (version 6.11)</code>,<code>supported_toolchains</code>指定<code>ARMC6</code>。构建系统使用<code>Arm Compiler 6</code>当使用<code>-t ARM</code>或<code>-t ARMC6</code></li> <li>当目标支持<code>Arm Compiler 5</code>和<code>Arm Compiler 6</code>时<code>supported_toolchains</code>指定<code>ARM</code>。<code>Arm Compiler 6</code>是默认的arm编译器。</li> </ul> <p>你只可指定<code>ARM</code>,<code>ARMC5</code>或<code>ARMC6</code>其中一个工具链。</p> <h4><code>default_toolchain</code></h4> <p><code>default_toolchain</code>在在线编译器上编译代码。可选的值是: ARM or uARM.</p> <h4><code>post_binary_hook</code></h4> <p>一些目标需要特定的动作来生成二进制镜像。使用<code>post_binary_hook</code>属性指定这些动作和自定义python代码。 它的值必须是JSON对象,有<code>function</code>和可选的<code>toolchain</code>。<code>function</code>键必须包含python函数,它可以从<code>tools/targets/__init__.py</code>的命名空间中访问到。可选的工具链必须包含处理<code>post_binary_hook</code>的工具链列表。 你可以假设<code>post_binary_hook</code>应用到所有工具链。如:</p> <pre><code>"post_binary_hook": { "function": "TEENSY3_1Code.binary_hook", "toolchains": ["ARM_STD", "ARM_MICRO", "GCC_ARM"] }</code></pre> <p>在构建<code>TEENSY3_1</code>生成初始二进制镜像后,构建系统调用<code>tools/targets/__init__.py::TEENSY3_1Code</code>类的<code>binary_hook</code>函数. 构建工具在使用<code>ARM_STD,ARM_MICRO,GCC_ARM</code>工具链时调用<code>TEENSY3_1 post_binary_hook</code></p> <p><code>tools/targets/__init__.py</code>:</p> <pre><code>class TEENSY3_1Code: @staticmethod def binary_hook(t_self, resources, elf, binf): from intelhex import IntelHex binh = IntelHex() binh.loadbin(binf, offset = 0) with open(binf.replace(".bin", ".hex"), "w") as f: binh.tofile(f, format='hex')</code></pre> <h4><code>device_name</code></h4> <p>这个属性是导出到第三方工具或IDE和带bootloader的应用必须的数据。我们使用<code>ArmPackManager</code>工具解析<code>CMSIS Packs</code>,<code>index.json</code>存储从每个<code>CMSIS Pack PDSC</code>解析到的信息。 <code>device_name</code>属性将<code>Mbed OS</code>的目标映射到<code>CMSIS Pack</code>的设备。为了支持<code>IAR</code>和<code>uVision</code>的导出,你必须增加<code>device_name</code>属性到<code>targets.json</code></p> <p><a href="http://www.keil.com/pack/Keil.Kinetis_K20_DFP.pdsc">http://www.keil.com/pack/Keil.Kinetis_K20_DFP.pdsc</a> 是包含TEENSY_31 device (MK20DX256xxx7)的<code>PDSC</code> <code>ArmPackManager</code>解析这个<code>PDSC</code>,并且<code>index.json</code>存储设备信息。设备信息从<code>.pdsc</code>文件的第204行开始。</p> <pre><code>&lt;device Dname="MK20DX256xxx7"&gt; &lt;processor Dfpu="0" Dmpu="0" Dendian="Little-endian" Dclock="72000000"/&gt; &lt;compile header="Device\Include\MK20D7.h" define="MK20DX256xxx7"/&gt; &lt;debug svd="SVD\MK20D7.svd"/&gt; &lt;memory id="IROM1" start="0x00000000" size="0x40000" startup="1" default="1"/&gt; &lt;memory id="IROM2" start="0x10000000" size="0x8000" startup="0" default="0"/&gt; &lt;memory id="IRAM1" start="0x20000000" size="0x8000" init ="0" default="1"/&gt; &lt;memory id="IRAM2" start="0x1FFF8000" size="0x8000" init ="0" default="0"/&gt; &lt;algorithm name="Flash\MK_P256.FLM" start="0x00000000" size="0x40000" default="1"/&gt; &lt;algorithm name="Flash\MK_D32_72MHZ.FLM" start="0x10000000" size="0x8000" default="1"/&gt; &lt;book name="Documents\K20P100M72SF1RM.pdf" title="MK20DX256xxx7 Reference Manual"/&gt; &lt;book name="Documents\K20P100M72SF1.pdf" title="MK20DX256xxx7 Data Sheet"/&gt; &lt;/device&gt;</code></pre> <h4><code>detect_code</code></h4> <p><code>detect_code</code>包含4个字符 (A-F and 0-9). 这个代码对于所有相同类型的平台都是相同的 。<code>Mbed LS</code>不再使用这个字段识别平台。而使用它自己的数据库。</p> <h4><code>OUTPUT_EXT</code></h4> <p><code>OUTPUT_EXT</code>属性控制构建系统发行的文件类型。<code>OUTPUT_EXT</code>可以设置成<code>bin</code>,<code>hex</code>或<code>elf</code>。我们不建议设置<code>elf</code>。因为构建系统必须总是发行ELF文件。</p> <h4><code>default_lib</code></h4> <p><code>delault_lib</code>属性控制<code>GCC_ARM</code>工具链连接什么库,是small还是标准的。这个属性可以是<code>std</code>(标准库),<code>small</code>(小库)</p> <h4><code>bootloader_supported</code></h4> <p><code>bootloader_supported</code>属性控制构建系统是否允许bootloader或自带bootloader应用构建目标。默认是<code>false</code></p> <h4><code>release_versions</code></h4> <p><code>release_versions</code>属性是目标支持的<code>Mbed OS</code>主版本列表。<code>release_versions</code>列表可能有<code>2</code>和<code>5</code></p> <h4><code>supported_form_factors</code></h4> <p><code>supported_form_factors</code>属性是可选的,它是开发板支持的<code>form factors</code>列表。 你可以使用这个属性传递以<code>TARGET_FF_</code>开头的宏到C,C++和汇编。 可接收的值:<code>ARDUINO</code>(表明兼容Arduino头), <code>MORPHO</code>(兼容ST Morpho头)</p>

页面列表

ITEM_HTML