EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Tronlong123 于 2021-9-1 15:01 编辑 : J7 ]3 E u; T9 J& b
, I$ ^# l3 \& i! _6 s' f' e4 t1 U7 A
目录 4.tl_can_echo案例 4.1 案例功能 4.2 操作说明 4.3 关键代码 5 tl_devmem_rw案例 5.1 案例功能 5.2 操作说明 5.3 关键代码 6 tcp_udp_demos案例 6.1 案例功能 6.2 操作说明 6.3 关键代码 ; {2 h' s0 S# C& ~4 o
本篇文章,咱们继续分享几个Linux应用开发案例,分别是tl_can_echo案例、tl_devmem_rw案例、tcp_udp_demos案例这三个较为常见的Linux开发案例,并配备关键代码,本次延续使用创龙科技的TL335x-EVM(AM3352/AM3354/AM3358/AM3359)ARM Cortex-A8架构的一系列开发板,详细讲解Linux的应用开发。 ) W# |- X5 ~/ @, ~3 x# Y. D
4.tl_can_echo案例 - 案例功能
, z4 |1 f- k2 z$ p0 \% H
本案例使用canutils工具包的canecho程序,实现CAN接口数据接收并重发功能。 canutils工具包内含5个独立的程序,分别为canconfig、candump、canecho、cansend、cansequence。各程序功能简述如下: - canconfig:用于配置CAN接口参数,比如波特率、模式等。
- candump:从CAN接口接收数据并以十六进制形式打印到标准输出,亦可输出到指定文件。
- canecho:从CAN接口接收数据,并将接收到的数据对外发送。
- cansend:向指定CAN接口发送数据。
- cansequence:向指定CAN接口发送自动重复递增数字,或指定接收模式并校验接收的递增数字。
7 k1 }& v2 b% l. q7 \9 `
本案例仅使用canecho功能,如需实现其他功能,可自行下载canutils工具包并从中获取对应功能程序源码。 程序流程如下图所示:
* m$ e% m, Z. R# Q2 }9 N* D j7 j图 25 2.操作说明 使用USB转CAN模块连接评估板CAN0接口和PC机USB接口,如下图所示。
3 t, \, z! W, E# f图 26 参照调试工具安装文档安装USB转CAN驱动和ECAN Tools调试软件,双击打开ECAN Tools软件,选择设备类型,然后点击“打开设备”。 % r7 _8 {! w) O2 u, r4 w
图 27 打开ECAN Tools,界面如下图所示。
, q0 Z8 j3 F& c/ A6 ]$ c+ U& U' s9 s图 28 进入评估板文件系统,使用文件系统自带的canconfig工具设置波特率,并启动CAN0接口。 Target# canconfig can0 stop Target# canconfig can0 bitrate 125000 Target# canconfig can0 start
' I% l( B9 y( _. i, ^! {1 @7 W图 29 将本案例bin目录下的可执行程序tl_can_echo复制到评估板文件系统,进入可执行程序所在目录,执行如下命令查看程序参数信息。 Target# ./tl_can_echo -help
8 z. f1 |$ p" H7 U: n% B2 H3 g: i图 30 执行如下命令绑定CAN0接口,并接收由ECAN Tools发出的数据,然后将接收到的数据重新发送出去。在ECAN Tools中输入数据并点击发送按钮,可看到有两帧数据,一帧是发送数据,另一帧是接收数据。 Target# ./tl_can_echo -v can0 0 ?) J" O- w) O7 Z
图 31
+ h* s( t9 F! b6 x3 ]图 32 可按"Ctrl+Z"暂停程序,并执行如下命令退出程序。 Target# killall -9 tl_can_echo 7 X$ \4 p6 z3 X
图 33 3.关键代码 - 使用socket监听CAN接口。2 Q2 r& r) e x* U
% j+ ^4 J( R: _/ ~+ s8 [ @ D6 Z
图 34 - 将从CAN接口接收到的数据重新发送出去。
: ~. [' Z( l& S; m6 e 8 V+ G+ t/ f- h8 o/ {% W( A; @/ O
图 35 5.tl_devmem_rw案例 - 案例功能/ h) C) r0 T2 K+ Y# W0 S7 D
本案例主要实现对内存设备进行数据读写操作,同时测试数据正确性和读写速度。 程序支持test、read、write三种测试模式,使用mmap对物理地址进行转换,可根据指定的访问操作类型按字节(Byte)、按半字(Halfword)进行访问。 2.操作说明 将本案例bin目录下的可执行程序tl_devmem_rw复制到评估板文件系统,进入可执行程序所在目录,执行如下命令查看程序参数信息。 Target# ./tl_devmem_rw -h " B* H$ h; z' l3 g
图 36 请执行如下命令进行读写测试。此命令写入1MByte大小的随机数据到指定地址并将写入的数据重新读出,测试数据正确性和读写速度。 Target# ./tl_devmem_rw -t -a 0x90000000 -s 1048576 -o halfword 4 r) s+ ?2 S( b3 n: _5 w
图 37 请新建一个test.txt文件,并输入任意内容(比如十六进制符0到f),同时执行如下命令进行写测试。此命令将test.txt文件中的16Byte数据写到指定地址。 Target# ./tl_devmem_rw -w -a 0x90000000 -s 16 -o halfword -f test.txt + k+ p2 d* L3 {8 X! ]% g
图 38 请执行如下命令进行读测试。此命令从指定地址读取16Byte的数据,并将内容打印(下图对应的值为十六进制符号0到f的ASCII码)。 Target# ./tl_devmem_rw -r -a 0x90000000 -s 16 -o halfword - ~: c# t( \1 I" N' W" R
图 39 3.关键代码 - 把设备物理地址映射到虚拟地址。7 H" r0 u( ^! [' z n) }
6 H7 e1 S! ^ |% A; @ c图 40 2.根据指定的操作方式进行数据读取。
5 X+ O6 L# w* O: F& {& x0 L$ Z( ~4 J图 41 3.根据指定的操作方式进行数据写入。 + p) D2 s! G7 ^7 j# U9 u, T
图 42 6.tcp_udp_demos案例 - 案例功能
, ]/ H" d! M) |8 i- C: `4 [9 a& z5 \
本案例主要实现客户端(client)与服务端(server)的文本数据相互收发功能。本案例包含4个程序: - tl_tcp_server:TCP服务端测试程序。
- tl_tcp_client:TCP客户端测试程序。
- tl_udp_server:UDP服务端测试程序。
- tl_udp_client:UDP客户端测试程序。! J7 L, H n% r/ z+ }/ W, P
程序流程如下图所示: * v9 S' A8 s0 j" d' Z, v
图 43 TCP通信
5 m' [; _( L; J7 r/ A图 44 UDP通信 服务端和客户端程序均可在评估板、PC机Ubuntu系统上运行。当服务端与客户端程序均在评估板上运行时,可通过127.0.0.1进行本地回环测试,无需经过路由器。为方便测试,本章节采用评估板本地回环测试,bin目录下的4个文件均为ARM端可执行程序。 2.操作说明 将本案例bin目录下的4个可执行程序复制到评估板文件系统。 在Ubuntu中执行如下命令使用OpenSSH登陆评估板文件系统,如下图所示。 5 X6 a1 @( p/ n( y+ ?$ |7 o) y
图 45 - TCP通信测试
5 s) C- r* A. D" y% M5 y
在可执行程序所在目录执行如下命令运行TCP服务端和客户端程序。2233为服务端程序指定的端口号,客户端程序端口号参数需与服务端程序一致。 Target# ./tl_tcp_server 2233 //TCP服务端命令 Target# ./tl_tcp_client 127.0.0.1 2233 //TCP客户端命令 程序执行后,客户端将会连接服务端。在服务端输入字符串"Tronlong",按下回车键即可在客户端显示对应内容。在客户端输入字符串"Hello Tronlong",按下回车键即可在服务端显示对应内容,如下图所示。 ! ?( b/ n8 g2 ?8 [4 J% N' @
图 46 TCP服务端 ! i! g8 a: }) x9 b
图 47 TCP客户端 UDP通信测试 在可执行程序所在目录执行如下命令运行UDP服务端和客户端程序。2233为服务端程序指定的端口号,客户端程序端口号参数需与服务端程序一致。 Target# ./tl_udp_server 2233 //UDP服务端命令 Target# ./tl_udp_client 127.0.0.1 2233 //UDP客户端命令 程序执行后,客户端将不会连接服务端。服务端在收到客户端信息前无法得知客户端的存在,因此需要客户端先向服务端发送信息。 在客户端输入字符串"Tronlong",按下回车键即可在服务端显示对应内容。在服务端输入字符串"Hello Tronlong",按下回车键即可在客户端显示对应内容,如下图所示。 & C% S, P2 F6 r
图 48 UDP客户端
7 z7 _1 s- C- S, U图 49 UDP服务端 如需在PC端Ubuntu系统运行服务端或客户端程序,请将案例src源码目录拷贝到Ubuntu工作目录。进入源码目录后执行make命令,即可在当前目录下生成x86端可执行程序。在不同终端运行服务端或客户端程序的命令类似,但127.0.0.1需使用服务器IP地址替代。 Host# make
/ r2 d+ T8 u' O. M1 c1 U/ F图 50 3.关键代码 以TCP通信程序为例。 1.tl_tcp_client.c 注意源码中的struct sockaddr_in、socket、connect、fgets、send、recv等数据结构和系统调用的使用。 2.tl_tcp_server.c 注意源码中的struct sockaddr_in、socket、connect、fgets、send、recv、bind、listen、accept等数据结构和系统调用的使用。 由于开发案例篇幅过长,给大家分为多个版本,今天先讲tl_can_echo案例、tl_devmem_rw案例、tcp_udp_demos。感兴趣的朋友,欢迎在评论区留言和我探讨! ) t- q3 j( X0 I S2 n- C
% p' ^. f. h7 S
|