调试目标
本文介绍了下载支持包的一般机制 自定义引擎支持包.综合服务. 本文讨论开发目标时重要的功能。
加载自定义目标
用户目标实现为支持包。 这意味着他 添加至*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_model 和 start_model的 最好单独运行它们,因为它们已经依赖于连接的硬件。
在发送目标之前进行检查
根据以下方案检查目标:
-
支持包 上传通过*Engee.整合*。
-
之后
syncExtensions()目标在脚本和块中可用 AnyMath . -
座 *EDM-Target*显示在用户库中,并保存蒙版参数。
-
generate_executable_code无需手动编辑即可创建项目。 -
编译模型从头开始构建项目。 -
upload_model将工件上载到设备或运行时环境。 -
开始模型启动模型并返回可理解的状态。 -
不支持的执行模式以可理解的错误结束。
-
演示模型经历了一个完整的用户场景。
为 互动模式另外检查: