我是靠谱客的博主 爱听歌小蜜蜂,最近开发中收集的这篇文章主要介绍MDC300F MDS新建工程 GPIO,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 型号
    • MDS新建GPIO工程
    • 命令行运行
    • rtfnode rtfevent
    • SOMEIP Event定义
    • 程序的调用关系

型号

MDC300F, 刷的新的101版本, 操作系统是Ubuntu18. 有3路GPI和3路GPO:

  • GPI输入0~12V, 可以接 急停开关, 进入自动驾驶按钮等
  • GPO不太清楚怎么用

这里主要是GPI的使用, 借着这个熟悉下MDS的应用.

MDS新建GPIO工程

板子有3路GPI, 12V时表示输入1, 默认输入0. MDC会采集接入低速连接器的GPIO管脚的电平,供客户APP订阅。电平的更新周期为100ms。

官方给的Platform Example中, 删掉 camera_ap_to_ros_sampledvpp_decode_sample 两个工程, 可以全部导入编译, 也可以按照下面的例子, 单个导入.

打开 MDC Development Studio -> File -> New -> MDC Project, 新建一个tk_gpio的工程

在这里插入图片描述

默认的文件树为

$ tree
.
├── cmake
│   └── toolchain.cmake
├── CMakeLists.txt
├── modules
│   └── CMakeLists.txt
└── tests
    └── CMakeLists.txt

3 directories, 4 files

删掉tests文件夹, 最外层的CMakeLists.txt也删除最后一行

add_subdirectory(tests)

从工程例子中拷贝 modules 文件夹中的 gpio_sample, 拷贝整个 manifest 文件夹, 删除不必要的文件, 现在文件树看起来这个样子

$ tree
.
├── cmake
│   └── toolchain.cmake
├── CMakeLists.txt
├── manifest
│   ├── application_sample
│   │   └── gpio_sample
│   │       └── gpio_abstract_sample.arxml
│   └── common
│       ├── data_type
│       │   ├── mdc_data_type.arxml
│       │   └── mdc_mode_declaration.arxml
│       ├── machine
│       │   ├── dmini0_machine.arxml
│       │   ├── dmini1_machine.arxml
│       │   ├── dmini2_machine.arxml
│       │   ├── dmini3_machine.arxml
│       │   └── host_machine.arxml
│       └── service_interface
│           └── canfd_can_uart_gpio_sample
│               └── gpio_rx_service_interface.arxml
└── modules
    ├── CMakeLists.txt
    └── gpio_sample
        ├── CMakeLists.txt
        └── src
            ├── gpio_msg_init.cpp
            ├── gpio_msg_init.h
            ├── gpio_msg_rx.cpp
            └── main.cpp

12 directories, 17 files

依次点击 Generate 和 Reload Cmake 按钮

在这里插入图片描述

这时Targets下面已经有了gpio_sample, 双击编译

在这里插入图片描述

点击齿轮图标进行设置

在这里插入图片描述

Executable 和 Manifest 要一一对应

在这里插入图片描述

点击上图中的New…按钮, SSH, OK

在这里插入图片描述

输入mdc账户

在这里插入图片描述

点击Browse...可以选择MDC300F中应用程序放置的位置, 然后点击 Applay and Close 按钮

在这里插入图片描述

点击运行按钮

在这里插入图片描述

可以看到Console已经打印出了信号值, 10个里面有用的是前3个, 接12V信号就变成了1, 悬空或接地是0

在这里插入图片描述

点击上图红色方块可以停止运行

命令行运行

如果想在命令行里运行, 根据提示(小bug, 换行处多了个字母)

在这里插入图片描述

切换到mdc或者root账户, 在命令行里输入

# 工程路径 /home/mdc/wks, 工程名 tk_gpio
# 路径里面是json和xml文件的配置
$ export CM_CONFIG_FILE_PATH=/home/mdc/wks/tk_gpio/etc/HostMachine/mdcgpio/MdcGpioProcess
$ /home/mdc/wks/tk_gpio/bin/gpio_sample

程序的名字还是 gpio_sample而不是tk_gpio, 这在top中也可以看出来

$ top | grep -i gpio
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.19 gpio_sample                     
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.20 gpio_sample                     
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.21 gpio_sample                     
20127 root      20   0 1267572  22868   9700 S   0.3  0.1   0:00.22 gpio_sample 

rtfnode rtfevent

可以用 rtfnode info 来查看APP进程信息

$ rtfnode list | grep -i gpio
/HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]

$ rtfnode info /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]
Node [/HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]]
ServiceInstance:
* /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/Service/Consumer/MdcGpioRxServiceInstance[SOME/IP]

Event Publications: None 

Event Subscriptions:
* /HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent

Method: None 

Field: None 

Pid: 13848

查看event

$ rtfevent list | grep -i gpio
/HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent[/UnknownPubEvent_212_1_SOMEIP]

$ rtfevent info /HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent[/UnknownPubEvent_212_1_SOMEIP]
Event type:/HuaweiMDC/MdcPlatformServices/GpioRxServiceInterface/GpioRxServiceInterface/GpioDataRxEvent
Publishers:None

Subscribers:
* /HuaweiMDC/PlatformApplication/MdcGpioCenterApplication/SwComponent/mdcgpio/MdcGpioProcess[mdchost]

SOMEIP Event定义

gpio_abstract_sample.arxml 中定义的 udp 端口是 54864(这是host的, mcu的为51381).
gpio_rx_service_interface.arxml有部分 SOME/IP Event 的定义:

<EVENT-ID>32769</EVENT-ID>
...
<SERVICE-INTERFACE-ID>212</SERVICE-INTERFACE-ID>
...
<EVENT-GROUP-ID>1</EVENT-GROUP-ID>

arxml中是十进制, 换算成十六进制:

  • EventID, 32769=0x8001, GPIO, UART和CAN上行的EventID都是0x8001(32769), 而CANFD短包上行为0x8002(32770), CANFD长包上行为0x8003(32771), EventID对应的还有MethodID, 两种方式
  • ServiceID, 212=0xd4, GPIO(只上行?)为0xd4(212), UART上下行均为0xd3(211), CAN/CANFD上行和CANFD Method方式下行为0xd0(208), CAN下行为0xd1(209), CANFD Event下行为0xa1(161)
  • InstanceID看有多少外设, GPIO数据量少, 3路GPI合并编成一组可用GPIO, 编号就是1. UART可用的只有1路, 编号也是1. CAN有12路, 每路单独编组, InstanceID就有1~12. 程序里初始化中服务发现直接指定这个Instance Id就可以
  • EventGroupID 手册是0x10, 十进制应该是16, 不知道为什么这里是1, 用于服务发现

手册中的GPIO的SOME/IP Event定义

  • EventID:0x8001
  • ServiceID:0xd4
  • InstanceID:1
  • EventGroupID:0x10

即便停止掉程序的运行, MCU还是会不断往外发布

# gpio_abstract_sample.arxml 中定义了 54864 端口
$ tcpdump port 54864
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:28:15.592031 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
10:28:15.692039 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
10:28:15.792039 IP 192.168.1.66.51381 > mdchost.54864: UDP, length 83
...

这在主程序中也能看出来

int main(int argc, char *argv[])
{
    McuApInterface mcuApInterfaceNode;
    mcuApInterfaceNode.Init();
    // 注册GPIO帧处理回调函数
    mcuApInterfaceNode.RegisterRxEventCallBackFunc(std::bind(&OnGpioRawDataRecieved, std::placeholders::_1));
    while (1) {
        usleep(SLEEP_TIME);
    }
    return 0;
}

相当于这个程序只是个使能开关, 录下数据

$ tcpdump port 54864 -w /home/sftpuser/uploads/tk_gpio.pcap -v
# tcpdump port 30491 -w /home/sftpuser/uploads/tk_gpio.pcap -v

# 获取Host和MCU通信的所有报文,存为pcap文件
# tcpdump host 192.168.1.66 -w /home/sftpuser/uploads/gpio.pcap -v

图中, 圈中的就是3路的值

在这里插入图片描述

54864这个端口是被占用的, 不能用其它程序或者脚本 bind. 需要用SOME/IP的 30491 的组播服务

程序的调用关系

在这里插入图片描述

AP的接口(ara::)可以在产品文档查看帮助.

最后

以上就是爱听歌小蜜蜂为你收集整理的MDC300F MDS新建工程 GPIO的全部内容,希望文章能够帮你解决MDC300F MDS新建工程 GPIO所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部