AnyMath 文档

调试目标

本文介绍了下载支持包的一般机制 自定义引擎支持包.综合服务. 本文讨论开发目标时重要的功能。

加载自定义目标

用户目标实现为支持包。 这意味着他 添加至*Engee。整合*及 同步AnyMath . 之后,所有必要的组件应该可以通过支持包,库 .nglib,*EDM-Target*块设置和安装外部依赖项的明确说明。 用户不必独立搜索或修改支持包存储库中的文件。

Julia支持包代码是接口层。 它使支持包的类和方法可以从块和脚本访问。 AnyMath . Python代码是一个实现:它包含类 基本目标、项目生成、构建、下载、启动、使用XCP、驱动程序和外部实用程序。

实践规则由此而来。:

如果Python方法的主体已更改,但方法名称,参数和返回类型未更改,则通常足以重新启动*Engee客户端程序。综合服务; 如果添加了新的公共方法、更改了签名、重命名了类或更改了包结构,则必须再次运行 syncExtensions() 节中所述 支持包的同步和使用 AnyMath; *如果用户库已更改 .nglib,您需要在会话中更新库 *AnyMath 根据机制为 用户库; *如果模型本身或*EDM-Target*块的参数已更改,则必须从模型重新生成目标项目。

日志和错误

对于用户消息,请使用内置日志记录系统,如本节所述 调试支持包。 消息应该解释用户的操作:检查端口,安装tulchain,选择正确的执行模式,指定编译器的路径以及连接设备。

建议将目标错误作为例外呈现,并提供一条应包含原因的短消息和消除建议。 您不应依赖用户访问呼叫报告或支持包的源代码,因此消息应该是自包含的,不需要额外的分析。

错误消息示例

if model_settings.is_ext_mode:
    raise RuntimeError(
        "This target supports only independent execution. "
        "Disable interactive execution in Target Hardware settings."
    )

无需重新生成模型即可进行调试

在目标开发过程中,经常需要多次调试。 generate_executable_code. 从接口生成C代码 AnyMath 这可能需要时间,所以很方便将方法的输入数据保存到JSON文件一次,然后在这些数据上本地运行Python代码。

此机制仅用于目标开发和调试;它不应该是用户工作场景的一部分,也不应该是提供的支持包的强制组件。

保存输入数据的示例 generate_executable_code

import json
from pathlib import Path
from typing import Any


def _to_jsonable(value: Any) -> Any:
    if hasattr(value, "model_dump"):
        return value.model_dump(mode="json", by_alias=True)
    if isinstance(value, dict):
        return {str(k): _to_jsonable(v) for k, v in value.items()}
    if isinstance(value, list):
        return [_to_jsonable(v) for v in value]
    return value


def dump_codegen_inputs(model, model_settings, model_code) -> None:
    dump_dir = Path("/tmp/mytarget-codegen-dump")
    dump_dir.mkdir(parents=True, exist_ok=True)

    payload = {
        "model": _to_jsonable(model),
        "model_settings": _to_jsonable(model_settings),
        "model_code": _to_jsonable(model_code),
    }

    for name, data in payload.items():
        path = dump_dir / f"{name}.json"
        path.write_text(
            json.dumps(data, ensure_ascii=False, indent=2),
            encoding="utf-8",
        )

这样的呼叫可以在开始时临时放置 generate_executable_code:

def generate_executable_code(self, model, model_settings, model_code):
    dump_codegen_inputs(model, model_settings, model_code)
    ...

之后,您可以重现项目生成,而无需从界面重新启动代码生成。 AnyMath .

使用保存的JSON进行本地启动的示例

from pathlib import Path

from targets.base_models import EngeeModel, ModelCode
from targets.contract_compat import ModelSettings

from targets.my_target.my_target import MyTarget


dump_dir = Path("/tmp/mytarget-codegen-dump")

model = EngeeModel.model_validate_json(
    (dump_dir / "model.json").read_text(encoding="utf-8")
)
model_settings = ModelSettings.model_validate_json(
    (dump_dir / "model_settings.json").read_text(encoding="utf-8")
)
model_code = ModelCode.model_validate_json(
    (dump_dir / "model_code.json").read_text(encoding="utf-8")
)

目标=MyTarget()
目标。generate_executable_code(model,model_settings,model_code)
目标。compile_model(模型)

如果只需要调试模板和复制文件,运行就足够了 generate_executable_code. 如果您需要检查与tulchain的集成,请添加 compile_model的. upload_modelstart_model的 最好单独运行它们,因为它们已经依赖于连接的硬件。

在发送目标之前进行检查

根据以下方案检查目标:

  1. 支持包 上传通过*Engee.整合*。

  2. 之后 syncExtensions() 目标在脚本和块中可用 AnyMath .

  3. 座 *EDM-Target*显示在用户库中,并保存蒙版参数。

  4. generate_executable_code 无需手动编辑即可创建项目。

  5. 编译模型 从头开始构建项目。

  6. upload_model 将工件上载到设备或运行时环境。

  7. 开始模型 启动模型并返回可理解的状态。

  8. 不支持的执行模式以可理解的错误结束。

  9. 演示模型经历了一个完整的用户场景。

互动模式另外检查:

  1. 推出 更改命令数据流。

  2. 成就;成就 要更改的命令至少一个参数。

  3. 正确的资源释放 停止模型.

目标自述文件中的信息

目标的自述文件应该面向用户,不应该包含存储库的内部描述。 我们建议您指定:

支持的平台和执行模式; *如何安装外部依赖:工具链、程序员、操作系统驱动程序; *如何下载支持包以及何时同步 syncExtensions(); *它在哪里 .nglib-积木图书馆; *EDM-Target块有哪些参数?; *如何启动演示模型; *典型的连接、构建和下载错误。