环境信息
鲲鹏服务器和网迅1Ge网卡
组件版本
component_drivers:1.2.30
libmcpp:1.2.35
devmon:1.2.13
操作步骤
前提:在i_chip.cpp中添加了Drvwritedelay.Property_changed相关监控操作
操作:通过mdbctl setprop modify修改资源树上Drvwritedelay属性值,发现通过busctl introspect查看的devmon资源树上Drvwritedelay属性内容有被更新,但是通过mdbctl lsprop查看的Chip中DrvWriteDelay属性内容没有被更新
问题定位情况
目前怀疑是不是还有其他地方(闭源的代码里)对Drvwritedelay.Property_changed()进行了connector,然后去修改mdbctl lsprop查看的Chip属性?导致对同一signal的两次connector中前一个Connector被覆盖,没有生效,所以mdbctl lsprop查看的Chip属性没有更新?
modify和busctl set-property是一样的效果 我能想到有两种可能
- 代码里持续在修改这个属性,可以加点打印验证,或者说通过getprop看下这个属性的配置,是否引用了其他对象,导致查询的时候值重新刷新了
- 之前有通过mdbctl setprop set设置过这个属性,set模式是覆写,其余的属性修改在unset之前都不会显现,可以通过mdbctl setprop unset之后再试试
执行mdbctl setprop unset命令后再调用mdbctl setprop modify命令修改Drvwritedelay属性,mdbctl lsprop Chip回显的Drvwritedelay属性恢复初始值后保持不变,busctl –user introspect回显的Drvwritedelay属性会根据传参值进行修改
是指busctl –user get-property命令吗?

在米尔开发板上同样进行了测试,结果是一样的:(序号代表操作顺序)
0、Drvwritedelay初始配置为20
1、通过mdbctl setprop set命令修改Drvwritedelay属性为16,mdbctl lsprop和busctl –user introspect回显的Drvwritedelay都会被修改为16,但是这个修改并不会应用到实际(网卡侧抓smbus波形发现实际延时还是20);
2、执行mdbctl setprop modify命令修改Drvwritedelay属性为12,mdbctl lsprop和busctl –user introspect回显的Drvwritedelay内容还是16,网卡抓到的smbus波形中实际延时变成了16;
3、执行mdbctl setprop unset命令后,mdbctl lsprop和busctl –user introspect回显的Drvwritedelay内容都被修改为12,但是实际延时还是16;
4、执行mdbctl setprop modify命令修改Drvwritedelay属性为18,mdbctl lsprop回显还是12,busctl –user introspect回显的Drvwritedelay内容修改为了18,网卡抓到的smbus波形中实际延时也变成了18;
那实际csr配置就没有生效,这是一个固定值 可以检查下实际生效的csr
您提到的实际csr配置是指sr文件中配置的DrvWriteDelay值吗?这个值是有生效的,刚上电时,mdbctl lsprop和busctl资源树上都是显示的这个值,实际延时也是这个值。帖子恢复里发的busctl –user get-property和mdbctl getprop回显截图是后续执行setprop modify等命令后修改了的值。
那你试一下ssh下执行lsprop查询,看能否查询到符合预期的值
可以,ssh下查询是准确的(mdbctl和busctl查询都是准确的),telnet下不是。抓线显示实际延时是18。
看起来应该是因为没写入共享内存的原因,目前看可能跟你上面信号订阅的方式有关,这个需要内部分析下原因
有个想法,你把update_drvwritedelay_value传入的this->DrvWriteDelay改为value.as<uint8_t>()试试。
还是不行。网卡侧有抓波形,modify的修改是有作用到实际的,但还是没有更新mdbctl lsprop返回的bmc.dev.Chip。
libmcpp/include/mc/engine/property.h 文件里if m_signal分支的return注释掉试试?
void notify() {
mc::variant value(m_value);
if (m_signal) {
(*m_signal)(value, *this);
// return;
}
if (has_extension_data() && m_extension_data->override_value) {
mc::variant override_variant(*m_extension_data->override_value);
get_observer().notify_update_shm(override_variant, *this);
// 已有Override值的情况下,原始属性值修改不发对象属性变更信号
} else {
get_observer().notify_update_shm(value, *this);
get_observer().notify(value, *this);
}
}
感谢您的帮助,加上这笔修改后解决了问题。在开发板和服务器上都进行了测试,都成功修改了。