什么是代码替换?
代码替换是指更改代码生成器为函数和运算符生成的代码以满足应用程序代码要求的一种方法。例如,您可以替换生成的代码以满足以下要求:
针对特定运行时环境的优化,包括(但不限于)特定目标硬件。
与现有应用程序代码集成。
符合某种标准,例如 AUTOSAR。
修改代码行为,例如启用或禁用非有限或内联支持。
特定于应用程序或工程的代码要求,例如:
消除
math.h
。消除系统头文件。
消除对
memcpy
或memset
的调用。使用 BLAS。
使用特定的 BLAS。
要应用此方法,请将代码生成器配置为在代码生成期间应用代码替换库 (CRL)。默认情况下,代码生成器不应用代码替换库。您可以从 MathWorks® 提供的库以及您使用 Embedded Coder® 产品创建和注册的库中进行选择。可用库的列表取决于:
已安装的支持包。
系统目标文件、语言、语言标准和设备供应商配置。
您是否使用 Embedded Coder 产品创建并注册了库。
包含 GNU99 扩展的库旨在与 GCC 编译器结合使用。如果您将其中一个库与其他编译器结合使用,生成的代码可能无法编译。
代码替换库
代码替换库由一个或多个代码替换表组成,这些表指定函数和运算符的特定于应用程序的实现。例如,特定嵌入式处理器的库指定针对该处理器优化所生成代码的函数和运算符替换。
代码替换表包含一个或多个代码替换条目,每个条目表示一个函数或运算符的潜在替换。每个条目将函数或运算符的概念表示映射到实现表示和优先级。
表条目组成部分 | 描述 |
---|---|
概念表示 | 标识表条目并包含代码生成器的匹配条件。包括:
|
实现表示 | 指定替换代码。包括:
|
优先级 | 定义相对于表中其他条目的条目优先级。该值的范围可以是从 0 到 100,0 表示最高优先级。如果多个条目具有相同的优先级,代码生成器将使用具有该优先级的第一个匹配项。 |
当代码生成器在代码替换库中查找匹配项时,它会创建一个调用位置对象并使用函数或运算符概念表示填充该对象。如果存在匹配项,代码生成器将使用用实现表示填充的匹配代码替换条目,并使用它来生成代码。
代码生成器按照各表在库中出现的顺序在代码替换库中搜索匹配项。如果代码生成器在一个表中找到多个匹配项,将根据优先级确定匹配项。代码生成器使用优先级较高的条目,而不是优先级较低的类似条目。
代码替换术语
术语 | 定义 |
---|---|
缓存命中 | 对于在指定的代码替换库中定义的函数或运算符的代码替换条目,代码生成器找到与之匹配的条目。 |
缓存未命中 | 代码生成器找不到与函数或运算符的概念表示匹配的条目。 |
调用位置对象 | 代码生成器在遇到函数或运算符的调用位置时使用的函数或运算符的概念表示。代码生成器使用该对象来查询代码替换库,以获得概念表示匹配项。如果存在匹配项,代码生成器将返回一个代码替换对象,该对象由概念表示、实现表示和优先级完全填充,并使用该对象生成替换代码。 |
代码替换库 | 一个或多个代码替换表,这些表指定函数和运算符的特定于应用程序的实现。当配置为使用代码替换库时,代码生成器使用库中定义的条件来搜索匹配项。如果找到匹配项,代码生成器会将默认情况下生成的代码替换为库中定义的特定于应用程序的代码。 |
代码替换表 | 一个或多个代码替换表条目。提供一种将相关或共享的条目分组的方法,以便在不同库中使用。 |
代码替换条目 | 表示函数或运算符的潜在替换。将函数或运算符的概念表示映射到实现表示和优先级。 |
概念参量 | 表示被替换的函数或运算符的输入或输出参量。概念参量遵循命名约定('y1' 、'u1' 、'u2' ...)和代码生成器熟悉的数据类型。 |
概念表示 | 表示代码生成器用于限定要替换的函数和运算符的匹配条件。包括:
|
实现参量 | 表示 C 或 C++ 替换函数的输入或输出参量。实现参量遵循 C/C++ 名称和数据类型设定。 |
实现表示 | 指定 C 或 C++ 替换函数原型。包括:
|
键 | 标识将被替换的函数或运算符。函数名称或键出现在代码替换条目的概念表示中。RTW_OP_ADD 键表示加法运算符。 |
优先级 | 定义代码替换条目相对于代码替换库中具有相同名称和概念参量列表的其他条目的匹配优先级。优先级的范围可以是从 0 到 100,0 表示最高优先级。默认值为 100。如果库为一个函数或运算符提供两个实现,则优先级较高的实现会遮蔽优先级较低的实现。 |
代码替换限制
代码替换验证 - 代码替换的行为可能与您预期的不同。例如,您在代码生成器输入中观测到的数据类型可能与代码生成器在运算期间用作中间数据类型的数据类型不匹配。通过检查生成的代码来验证代码替换。
矩阵的代码替换 - 代码替换库不支持动态和符号大小的矩阵。