概述
文章目录
- 型号
- 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_sample
和 dvpp_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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复