Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rust
zig
换个rust的使用方式:rust调用C
发布于 2020-12-27 21:50:36 浏览:2022
订阅该版
[tocm] # Rust中调用C [上篇](https://club.rt-thread.org/ask/article/2439.html)实现了C调用rust。 此篇计划实现在rust中调用c,并实现字符串打印。 查阅了相关资料: * https://zhuanlan.zhihu.com/p/76536088 * https://blog.csdn.net/weixin_33692284/article/details/88021256 * https://doc.rust-lang.org/nomicon/ffi.html 更新`lib.rs` ```c extern "C" { fn test_putchar(ch:char); } fn test_puts(s: &str) { for ch in s.chars() { unsafe { test_putchar(ch); } } } #[no_mangle] pub extern "C" fn foo(a: i32, b: i32) -> i32 { // println!("hello : a + b = {}", a + b); test_puts("hello"); return (a+b)*2; } ``` 编译通过,但警告说类型不安全,先忽略这个问题。 ``` warning: `extern` block uses type `char`, which is not FFI-safe --> src/lib.rs:11:24 | 11 | fn test_putchar(ch:char); | ^^^^ not FFI-safe | = note: `#[warn(improper_ctypes)]` on by default = help: consider using `u32` or `libc::wchar_t` instead = note: the `char` type has no C equivalent warning: 1 warning emitted ``` 然后在C这边进行编译,提示`libfoo.a`有引用`test_putchar` ``` ... -Lapplications\libs -lfoo -lc -lm applications\libs\libfoo.a(foo-2647ba6178cfa41e.foo.6bpsobu5-cgu.3.rcgu.o): In function `foo': foo.6bpsobu5-cgu.3:(.text.foo+0x24): undefined reference to `test_putchar' foo.6bpsobu5-cgu.3:(.text.foo+0x110): undefined reference to `test_putchar' ``` 接下来我们在C这边实现`test_putchar` ```c void test_putchar(int ch) { printf("test_putchar:0x%08X %c\n", ch, ch); } ``` 运行结果如下 ``` hello rt-thread test_putchar:0x00000068 h test_putchar:0x00000065 e test_putchar:0x0000006C l test_putchar:0x0000006C l test_putchar:0x0000006F o call rust fn: foo(1, 2) == 6 ``` 再看下最终的反汇编 ``` 60010070
: 60010070: e92d4800 push {fp, lr} 60010074: e28db004 add fp, sp, #4 60010078: e24dd008 sub sp, sp, #8 6001007c: e30402a8 movw r0, #17064 ; 0x42a8 60010080: e3460009 movt r0, #24585 ; 0x6009 60010084: fa01f6e5 blx 6008dc20
60010088: e3a01002 mov r1, #2 6001008c: e3a00001 mov r0, #1 60010090: eb01f2ee bl 6008cc50
6008cc50
: 6008cc50: e92d4bf0 push {r4, r5, r6, r7, r8, r9, fp, lr} 6008cc54: e3004c67 movw r4, #3175 ; 0xc67 6008cc58: e1a08001 mov r8, r1 6008cc5c: e346400a movt r4, #24586 ; 0x600a 6008cc60: e1a09000 mov r9, r0 6008cc64: e3a07707 mov r7, #1835008 ; 0x1c0000 6008cc68: e1a06004 mov r6, r4 6008cc6c: ea000004 b 6008cc84
6008cc70: e1a06003 mov r6, r3 6008cc74: ebfe0cf1 bl 60010040
6008cc78: e2840005 add r0, r4, #5 6008cc7c: e1560000 cmp r6, r0 6008cc80: 0a000037 beq 6008cd64
6008cc84: e1a03006 mov r3, r6 6008cc88: e0d310d1 ldrsb r1, [r3], #1 6008cc8c: e3710001 cmn r1, #1 6008cc90: e6ef0071 uxtb r0, r1 6008cc94: cafffff5 bgt 6008cc70
6008cc98: e2842005 add r2, r4, #5 6008cc9c: e200101f and r1, r0, #31 6008cca0: e1530002 cmp r3, r2 6008cca4: 0a00000d beq 6008cce0
6008cca8: e5d63001 ldrb r3, [r6, #1] 6008ccac: e2865002 add r5, r6, #2 6008ccb0: e35000df cmp r0, #223 ; 0xdf 6008ccb4: e203303f and r3, r3, #63 ; 0x3f 6008ccb8: 9a000016 bls 6008cd18
6008ccbc: e1550002 cmp r5, r2 6008ccc0: 0a00001e beq 6008cd40
6008ccc4: e2862003 add r2, r6, #3 6008ccc8: e5d66002 ldrb r6, [r6, #2] 6008cccc: e206603f and r6, r6, #63 ; 0x3f 6008ccd0: e1863303 orr r3, r6, r3, lsl #6 6008ccd4: e35000f0 cmp r0, #240 ; 0xf0 6008ccd8: 2a000007 bcs 6008ccfc
6008ccdc: ea00001b b 6008cd50
6008cce0: e3a03000 mov r3, #0 6008cce4: e35000df cmp r0, #223 ; 0xdf 6008cce8: e3a06000 mov r6, #0 6008ccec: 9a00001a bls 6008cd5c
6008ccf0: e1863303 orr r3, r6, r3, lsl #6 6008ccf4: e35000f0 cmp r0, #240 ; 0xf0 6008ccf8: 3a000014 bcc 6008cd50
6008ccfc: e2846005 add r6, r4, #5 6008cd00: e1520006 cmp r2, r6 6008cd04: 0a000006 beq 6008cd24
6008cd08: e4d20001 ldrb r0, [r2], #1 6008cd0c: e200003f and r0, r0, #63 ; 0x3f 6008cd10: e1a06002 mov r6, r2 6008cd14: ea000003 b 6008cd28
6008cd18: e1830301 orr r0, r3, r1, lsl #6 6008cd1c: e1a06005 mov r6, r5 6008cd20: eaffffd3 b 6008cc74
6008cd24: e3a00000 mov r0, #0 6008cd28: e0071901 and r1, r7, r1, lsl #18 6008cd2c: e1811303 orr r1, r1, r3, lsl #6 6008cd30: e1810000 orr r0, r1, r0 6008cd34: e3500811 cmp r0, #1114112 ; 0x110000 6008cd38: 1affffcd bne 6008cc74
6008cd3c: ea000008 b 6008cd64
6008cd40: e3a06000 mov r6, #0 6008cd44: e1863303 orr r3, r6, r3, lsl #6 6008cd48: e35000f0 cmp r0, #240 ; 0xf0 6008cd4c: 2affffea bcs 6008ccfc
6008cd50: e1830601 orr r0, r3, r1, lsl #12 6008cd54: e1a06002 mov r6, r2 6008cd58: eaffffc5 b 6008cc74
6008cd5c: e1a00301 lsl r0, r1, #6 6008cd60: ebfe0cb6 bl 60010040
6008cd64: e0880009 add r0, r8, r9 // 纯计算 (a + b ) * 2; 这里先做加法 6008cd68: e1a00080 lsl r0, r0, #1 // 乘2优化为左移 6008cd6c: e8bd8bf0 pop {r4, r5, r6, r7, r8, r9, fp, pc} ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
aozima
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
文章
28
回答
4480
被采纳
381
关注TA
发私信
相关文章
1
Rust 嵌入式开发 STM32 和 RISC-V
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部