libnml 通信

本文记录了一次CNC系统中共享内存通信出现的问题及调用堆栈信息,涉及rcs_shm_open与rcs_sem_create等关键函数的错误细节。通过对调用堆栈的分析,可以了解到从共享内存创建到应用程序初始化过程中的具体步骤。

 

CNC 共享内存通信通道

#0  rcs_shm_open (key=1003, size=8192, oflag=512) at libnml/os_intf/_shm.c:235
#1  0x00140ee8 in RCS_SHAREDMEM (this=0x805e1e8, key=8224788, size=134603264, oflag=<value optimized out>, mode=511) at libnml/os_intf/shm.cc:40
#2  0x00143698 in SHMEM::open (this=0x805d8d0) at libnml/buffer/shmem.cc:189
#3  0x00144100 in SHMEM (this=0x805d8d0,
    bufline=0xbfffeddc "B emcError", ' ' <repeats 14 times>, "SHMEM   localhost       8192    0       0       3       16 1003 TCP=5005 xdr queue\n",
    procline=0xbfffeea4 "P emcsvr        emcError        LOCAL   localhost       R       1       1.0     1       2\n", set_to_server=0, set_to_master=0)
    at libnml/buffer/shmem.cc:160
#4  0x0014ec58 in cms_create (cms=0x805d81c,
    buffer_line=0xbfffeddc "B emcError", ' ' <repeats 14 times>, "SHMEM   localhost       8192    0       0       3       16 1003 TCP=5005 xdr queue\n",
    proc_line=0xbfffeea4 "P emcsvr        emcError        LOCAL   localhost       R       1       1.0     1       2\n", buffer_type=0xbfffef6c "SHMEM",
    proc_type=0xbffff034 "LOCAL", set_to_server=0, set_to_master=0) at libnml/cms/cms_cfg.cc:904
#5  0x001501d8 in cms_config (cms=0x805d81c, bufname=0x804dd6d "emcError", procname=0x804dd26 "emcsvr",
    filename=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0) at libnml/cms/cms_cfg.cc:491
#6  0x00164cfc in NML::reconstruct (this=0x805d6d0, f_ptr=0x8048e38 <_Z14nmlErrorFormatlPvP3CMS@plt>, buf=0x804dd6d "emcError", proc=0x804dd26 "emcsvr",
    file=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0) at libnml/nml/nml.cc:245
#7  0x00164fb9 in NML (this=0x805d6d0, f_ptr=0x8048e38 <_Z14nmlErrorFormatlPvP3CMS@plt>, buf=0x804dd6d "emcError", proc=0x804dd26 "emcsvr",
    file=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0, __in_chrg=<value optimized out>,
    __vtt_parm=<value optimized out>) at libnml/nml/nml.cc:195
#8  0x080493dc in main (argc=3, argv=0xbffff474) at emc/task/emcsvr.cc:116
(gdb) frame
#0  rcs_shm_open (key=1003, size=8192, oflag=512) at libnml/os_intf/_shm.c:235
235     if ((shm->addr = (void *) shmat(shm->id, 0, shmflg)) == (void *) -1) {

 

信号量生成

#0  rcs_sem_create (id=1003, mode=511, state=1) at libnml/os_intf/_sem.c:348
#1  0x00140ce6 in RCS_SEMAPHORE (this=0x805e260, _id=1003, _oflag=<value optimized out>, _time=1, _mode=511, _state=1) at libnml/os_intf/sem.cc:34
#2  0x00143709 in SHMEM::open (this=0x805d8d0) at libnml/buffer/shmem.cc:215
#3  0x00144100 in SHMEM (this=0x805d8d0,
    bufline=0xbfffeddc "B emcError", ' ' <repeats 14 times>, "SHMEM   localhost       8192    0       0       3       16 1003 TCP=5005 xdr queue\n",
    procline=0xbfffeea4 "P emcsvr        emcError        LOCAL   localhost       R       1       1.0     1       2\n", set_to_server=0, set_to_master=0)
    at libnml/buffer/shmem.cc:160
#4  0x0014ec58 in cms_create (cms=0x805d81c,
    buffer_line=0xbfffeddc "B emcError", ' ' <repeats 14 times>, "SHMEM   localhost       8192    0       0       3       16 1003 TCP=5005 xdr queue\n",
    proc_line=0xbfffeea4 "P emcsvr        emcError        LOCAL   localhost       R       1       1.0     1       2\n", buffer_type=0xbfffef6c "SHMEM",
    proc_type=0xbffff034 "LOCAL", set_to_server=0, set_to_master=0) at libnml/cms/cms_cfg.cc:904
#5  0x001501d8 in cms_config (cms=0x805d81c, bufname=0x804dd6d "emcError", procname=0x804dd26 "emcsvr",
    filename=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0) at libnml/cms/cms_cfg.cc:491
#6  0x00164cfc in NML::reconstruct (this=0x805d6d0, f_ptr=0x8048e38 <_Z14nmlErrorFormatlPvP3CMS@plt>, buf=0x804dd6d "emcError", proc=0x804dd26 "emcsvr",
    file=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0) at libnml/nml/nml.cc:245
#7  0x00164fb9 in NML (this=0x805d6d0, f_ptr=0x8048e38 <_Z14nmlErrorFormatlPvP3CMS@plt>, buf=0x804dd6d "emcError", proc=0x804dd26 "emcsvr",
    file=0x80521c0 "/home/zcnc/linuxcnc-dev/configs/common/linuxcnc.nml", set_to_server=0, set_to_master=0, __in_chrg=<value optimized out>,
    __vtt_parm=<value optimized out>) at libnml/nml/nml.cc:195
#8  0x080493dc in main (argc=3, argv=0xbffff474) at emc/task/emcsvr.cc:116
(gdb) s
355     sem = rcs_sem_open(id, IPC_CREAT, mode);
(gdb) s
353     rcs_sem_open_val = state;

 

LinuxCNC主要代码结构包括src目录下的多个部分,如emc(实际LinuxCNC代码)、canterp(命令解释器)、ini(操作的配置文件)、kinematics(运动规划)、motion(运动控制器)、nml_intf(NML实现)、rs274ngc(g代码解释器)、task(任务控制器)、tp(轨迹规划)、usr_intf(GUI接口)、hal(硬件抽象层)、libnml(rcslib实现)等[^3]。 其完整的目录结构如下: ```plaintext linuxcnc/ ├── debian //包含用于 Debian 打包的文件。 ├── docs //包含项目的文档文件。 ├── etc //包含配置文件模板和示例。 ├── hal //包含硬件抽象层(HAL)相关的文件。 ├── ini //包含初始化文件和配置示例。 ├── input_plugins //包含输入插件文件。 ├── lib //包含库文件。 ├── po //包含翻译文件。 ├── scripts //包含脚本文件。 ├── share //包含共享资源文件 ├── src //包含源代码文件 │ ├── emc (实际LinuxCNC代码) │ │ ├── canterp(命令解释器) │ │ ├── ini(操作的配置文件) │ │ ├── kinematics(运动规划) │ │ ├── motion(运动控制器) │ │ ├── nml_intf(NML实现) │ │ ├── rs274ngc(g代码解释器) │ │ ├── task(任务控制器) │ │ ├── tp(轨迹规划) │ │ ├── usr_intf(GUI接口) │ │ ├── hal (硬件抽象层,提供了跨所有硬件的统一接口) │ │ ├── libnml (a clean implementation of RCSLIB) │ ├── module_helper │ ├── objects │ ├── po (Translation files for i18n support) │ ├── rtapi (*.c and *.h for RTAPI) (unified RT API, wraps over RTLinux, RTAI and sim) │ ├── tests ├── tcl //包含 Tcl 脚本文件 └── tools //包含工具文件 ``` 其中,gcodemodule.cc是rs274 gcode解析器和python交互模块,emcmodule.cc用于生成python交互文件 [^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值