CSR 语法汇总指南
更新时间:2025/07/12
在Gitcode上查看源码📋 文档信息
项目 | 内容 |
---|---|
文档标题 | CSR 语法汇总指南 |
文档版本 | 1.0 |
创建日期 | 2025-07-12 |
最后更新 | 2025-07-12 |
维护状态 | 活跃维护 |
📋 变更历史记录
版本 | 日期 | 变更内容 | 变更人 |
---|---|---|---|
1.0 | 2025-07-12 | 初始版本创建 | Hardware SIG |
🎯 语法概述
CSR语法汇总 提供了CSR配置中所有支持的语法规则和使用方法。这些语法为BMC固件开发提供了强大的数据引用、同步、转换和变量替换功能,是实现复杂硬件配置和状态管理的核心工具。
主要语法类型
- 引用语法
#/
:用于对象属性的静态引用 - 同步语法
<=/
:用于对象属性的动态同步 - 表达式语法
expr
:用于数据的复杂计算和转换 - 变量语法
${}
:用于动态参数替换 - 默认值语法
@Default
:用于属性默认值设置
📊 语法定义表
语法类型 | 语法格式 | 举例 | 触发机制 | 描述 | 使用场景 | 分类 |
---|---|---|---|---|---|---|
引用语法 | #/对象.属性 | "#/Accessor_Cpu1ClearThermalTripAccessor.Value" | 读取时触发 | 引用语法用于表示某个对象的属性值直接依赖另一个对象的属性,被引用者变化不会触发signal,在读取属性时触发一次被引用值访问 | 在event的Component属性引用实际Component:当读取event.Component时,软件自动访问实际对应的Component。需要实时硬件交互的属性(如LED状态)推荐使用Accessor | 软件 |
同步语法 | <=/对象.属性 | "<=/Scanner_Cpu1ThermalTripAccessor.Value" | 变化时触发 | 同步语法是基于信号和主动获取的方式来获取另一个对象的属性,被引用者变化会触发signal,并且发给每一个该属性归属object的订阅者 | 在event/sensor的reading属性同步Scanner结果:Scanner值变化后,会自动同步到Reading。需要定时采集但无需实时响应的属性(如温度、电压)推荐使用Scanner | 软件 |
表达式语法 | <=/对象.属性 |> expr(...) | "<=/Scanner_12v1.Value;<=/Scanner_PowerGood.Value |> expr(($2 == 0) ? 0 : (($1 / 12) > 255 ? 204 : ($1 / 12)))" | 源数据变化时 | 管道操作符(|>)和各种函数、位置参数引用,提供复杂数据处理能力 | 硬件真实数据转换,为硬件配置和状态管理提供强大的灵活计算转换能力 | 软件 |
变量语法 | $ | " | 加载时替换 | 支持将上级Connector对象的属性值作为参数,替换下级加载组件的SR中对象的变量 | 动态参数替换,支持硬件模块化配置 | 软件 |
默认值语法 | "@Default": | "@Default": | 初始化或运行时 | 默认值适用范围包括同步语法属性和表达式计算属性,如果同步对象属性配置默认值,当对象初始化未获取到被同步对象属性时,将设置属性值为配置的默认值 | 同步语法属性(如Reading属性通过@Default配置初始默认值)、表达式(计算异常时提供容错值) | 软件 |
🔗 语法详细说明
1. 引用语法 #/
语法格式:#/对象名.属性名
特点:
- 静态引用,不会自动更新
- 只在读取时触发一次访问
- 适用于需要获取当前值但不需要实时同步的场景
使用示例:
json
{
"Component": "#/Accessor_Cpu1ClearThermalTripAccessor.Value"
}
2. 同步语法 <=/
语法格式:<=/对象名.属性名
特点:
- 动态同步,自动更新
- 被引用对象变化时会触发signal
- 适用于需要实时同步数据的场景
使用示例:
json
{
"Reading": "<=/Scanner_Cpu1ThermalTripAccessor.Value"
}
3. 表达式语法 expr
语法格式:<=/对象1.属性1;<=/对象2.属性2 |> expr(表达式)
特点:
- 支持管道操作符
|>
- 支持函数调用如
expr()
、string.format()
- 支持位置参数引用
$1, $2, ...
- 支持条件表达式和数学运算
使用示例:
json
{
"ProcessedValue": "<=/Scanner_12v1.Value;<=/Scanner_PowerGood.Value |> expr(($2 == 0) ? 0 : (($1 / 12) > 255 ? 204 : ($1 / 12)))"
}
表达式语法规则:
$1, $2, ...
:位置参数,对应管道前的各个引用值expr()
:数学表达式函数string.format()
:字符串格式化函数?:
:三元条件运算符+, -, *, /, %
:数学运算符==, !=, >, <, >=, <=
:比较运算符&&, ||, !
:逻辑运算符
4. 变量语法 ${}
语法格式:${变量名}
支持的变量:
${Slot}
:插槽号${SystemId}
:系统ID${ManagerId}
:管理器ID${Container}
:容器标识${GroupId}
:组ID${ChassisId}
:机箱ID${GroupPosition}
:组位置${SilkText}
:丝印文本
使用示例:
json
{
"FruName": "CpuBoard${Slot}",
"Container": "${Container}",
"SystemId": "${SystemId}",
"ManagerId": "${ManagerId}",
"ChassisId": "${ChassisId}"
}
5. 默认值语法 @Default
语法格式:"@Default": { 属性名: 默认值 }
特点:
- 用于属性初始化
- 当无法获取被同步对象属性时使用
- 提供容错机制
使用示例:
json
{
"Reading": "<=/Scanner_Temperature.Value",
"@Default": {
"Reading": 1.1
}
}
📝 语法组合使用
复杂表达式示例
json
{
"VoltageSensor": {
"Reading": "<=/Scanner_12v1.Value;<=/Scanner_PowerGood.Value |> expr(($2 == 0) ? 0 : (($1 / 12) > 255 ? 204 : ($1 / 12)))",
"@Default": {
"Reading": 12.0
}
}
}
动态对象引用
json
{
"CpuBoard${Slot}": {
"Component": "#/Accessor_Cpu${Slot}ThermalTrip.Value",
"Reading": "<=/Scanner_Cpu${Slot}Temp.Value",
"SystemId": "${SystemId}",
"ManagerId": "${ManagerId}",
"@Default": {
"Reading": 0.0
}
}
}
多级变量替换
json
{
"FruName": "Board${Slot}_Sys${SystemId}",
"Container": "${Container}",
"Position": "${GroupPosition}",
"SilkText": "${SilkText}"
}
🔧 使用指南
引用语法使用原则
- 用于静态数据获取
- 避免在频繁变化的数据上使用
- 适合配置信息和状态查询
同步语法使用原则
- 用于实时数据同步
- 确保被引用对象存在
- 注意性能影响
表达式语法使用原则
- 保持表达式简洁
- 避免过于复杂的嵌套
- 充分测试边界条件
变量语法使用原则
- 变量名必须与支持列表匹配
- 确保上级
Connector
对象提供相应属性 - 注意变量的作用域
5. 默认值语法使用原则
- 为关键属性提供合理默认值
- 默认值应符合属性的类型和取值范围
- 考虑系统的容错需求
💡 高级用法
1. 条件表达式
json
{
"Status": "<=/Scanner_Power.Value |> expr($1 > 0 ? 1 : 0)"
}
2. 数学运算
json
{
"Percentage": "<=/Scanner_Current.Value;<=/Scanner_Max.Value |> expr(($1 / $2) * 100)"
}
3. 字符串格式化
json
{
"Message": "<=/Scanner_Temp.Value |> string.format('Temperature: %.1f°C', $1)"
}
4. 多条件判断
json
{
"Level": "<=/Scanner_Value.Value |> expr($1 < 30 ? 'LOW' : ($1 < 70 ? 'MEDIUM' : 'HIGH'))"
}
❓ 常见问题
Q1: 引用语法和同步语法的区别?
A: 引用语法#/
是静态的,只在读取时访问一次;同步语法<=/
是动态的,被引用对象变化时会自动更新。
Q2: 变量的取值来源是什么?
A: 变量的取值来源于上级Connector
对象的属性值,在组件加载时进行替换。
--
Q3: 默认值什么时候使用?
A: 默认值在对象初始化时使用,当无法获取被同步对象属性时,会设置为配置的默认值。
Q4: 表达式语法支持哪些函数?
A: 主要支持expr()
数学表达式函数和string.format()
字符串格式化函数。
Q5: 如何处理表达式中的错误?
A: 建议使用条件表达式进行边界检查,并配置合理的默认值作为容错机制。
📚 语法参考速查
基础语法
- 引用:
#/对象.属性
- 同步:
<=/对象.属性
- 变量:
${变量名}
- 默认值:
"@Default": {...}
表达式运算符
- 算术:
+, -, *, /, %
- 比较:
==, !=, >, <, >=, <=
- 逻辑:
&&, ||, !
- 条件:
条件 ? 值1 : 值2
支持变量
${Slot}
,${SystemId}
,${ManagerId}
${Container}
,${GroupId}
,${ChassisId}
${GroupPosition}
,${SilkText}