CSR 语法汇总指南
更新时间:2025/07/12
在Gitcode上查看源码

📋 文档信息

项目内容
文档标题CSR 语法汇总指南
文档版本1.0
创建日期2025-07-12
最后更新2025-07-12
维护状态活跃维护

📋 变更历史记录

版本日期变更内容变更人
1.02025-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)))"源数据变化时管道操作符(|>)和各种函数、位置参数引用,提供复杂数据处理能力硬件真实数据转换,为硬件配置和状态管理提供强大的灵活计算转换能力软件
变量语法$"Slot","{SystemId}", "ManagerId""{Container}","${ChassisId}"加载时替换支持将上级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}