1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
/*
* Copyright (c) 2006-2025, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author foxglove
* 2025-09-15 foxglove 1.0 version
*/
/*! RT-Thread OS API bindings
Provides Rust wrappers for RT-Thread kernel and device driver APIs
*/
#![allow(non_camel_case_types)]
use core::ffi::{c_char, c_int, c_uint, c_void, c_long, c_ulong, c_uchar};
/* RT-Thread basic type definitions */
pub type rt_base_t = c_long;
pub type rt_ubase_t = c_ulong;
pub type rt_err_t = rt_base_t;
pub type rt_uint32_t = c_uint;
pub type rt_int32_t = c_int;
pub type rt_uint8_t = c_uchar;
pub type rt_tick_t = rt_uint32_t;
pub type rt_size_t = rt_ubase_t;
pub type rt_ssize_t = rt_base_t;
pub type rt_thread_t = *mut c_void;
pub type rt_sem_t = *mut c_void;
pub type rt_mutex_t = *mut c_void;
pub type rt_device_t = *mut c_void;
pub type rt_mq_t = *mut c_void;
/* RT-Thread error codes */
pub const RT_EOK: rt_err_t = 0;
pub const RT_ERROR: rt_err_t = 1;
pub const RT_ETIMEOUT: rt_err_t = 2;
pub const RT_EFULL: rt_err_t = 3;
pub const RT_EEMPTY: rt_err_t = 4;
pub const RT_ENOMEM: rt_err_t = 5;
pub const RT_ENOSYS: rt_err_t = 6;
pub const RT_EBUSY: rt_err_t = 7;
pub const RT_EIO: rt_err_t = 8;
pub const RT_EINTR: rt_err_t = 9;
pub const RT_EINVAL: rt_err_t = 10;
/* ============== Kernel object management ============== */
unsafe extern "C" {
pub fn rt_object_get_type(object: *mut c_void) -> u8;
pub fn rt_object_find(name: *const c_char, object_type: u8) -> *mut c_void;
}
/* ============== Thread management ============== */
unsafe extern "C" {
pub fn rt_thread_create(
name: *const c_char,
entry: extern "C" fn(*mut c_void),
parameter: *mut c_void,
stack_size: rt_size_t,
priority: rt_uint8_t,
tick: rt_tick_t,
) -> rt_thread_t;
pub fn rt_thread_delete(thread: rt_thread_t) -> rt_err_t;
pub fn rt_thread_startup(thread: rt_thread_t) -> rt_err_t;
pub fn rt_thread_self() -> rt_thread_t;
pub fn rt_thread_yield() -> rt_err_t;
pub fn rt_thread_delay(tick: rt_tick_t) -> rt_err_t;
pub fn rt_thread_mdelay(ms: rt_uint32_t) -> rt_err_t;
pub fn rt_thread_suspend(thread: rt_thread_t) -> rt_err_t;
pub fn rt_thread_resume(thread: rt_thread_t) -> rt_err_t;
}
/* ============== Semaphore management ============== */
unsafe extern "C" {
pub fn rt_sem_create(name: *const c_char, value: rt_uint32_t, flag: rt_uint8_t) -> rt_sem_t;
pub fn rt_sem_delete(sem: rt_sem_t) -> rt_err_t;
pub fn rt_sem_take(sem: rt_sem_t, time: rt_tick_t) -> rt_err_t;
pub fn rt_sem_trytake(sem: rt_sem_t) -> rt_err_t;
pub fn rt_sem_release(sem: rt_sem_t) -> rt_err_t;
}
/* ============== Mutex management ============== */
unsafe extern "C" {
pub fn rt_mutex_create(name: *const c_char, flag: rt_uint8_t) -> rt_mutex_t;
pub fn rt_mutex_delete(mutex: rt_mutex_t) -> rt_err_t;
pub fn rt_mutex_take(mutex: rt_mutex_t, time: rt_tick_t) -> rt_err_t;
pub fn rt_mutex_release(mutex: rt_mutex_t) -> rt_err_t;
}
/* ============== Message queue management ============== */
unsafe extern "C" {
pub fn rt_mq_create(name: *const c_char, msg_size: rt_size_t, max_msgs: rt_size_t, flag: rt_uint8_t) -> rt_mq_t;
pub fn rt_mq_send(mq: rt_mq_t, buffer: *const c_void, size: rt_size_t) -> rt_err_t;
pub fn rt_mq_send_wait(mq: rt_mq_t, buffer: *const c_void, size: rt_size_t, timeout: rt_int32_t) -> rt_err_t;
pub fn rt_mq_recv(mq: rt_mq_t, buffer: *mut c_void, size: rt_size_t, timeout: rt_int32_t) -> rt_ssize_t;
pub fn rt_mq_delete(mq: rt_mq_t) -> rt_err_t;
pub fn rt_mq_detach(mq: rt_mq_t) -> rt_err_t;
}
/* ============== Memory management ============== */
unsafe extern "C" {
pub fn rt_malloc(size: rt_size_t) -> *mut c_void;
pub fn rt_free(ptr: *mut c_void);
pub fn rt_realloc(ptr: *mut c_void, newsize: rt_size_t) -> *mut c_void;
pub fn rt_calloc(count: rt_size_t, size: rt_size_t) -> *mut c_void;
pub fn rt_malloc_align(size: rt_size_t, align: rt_size_t) -> *mut c_void;
pub fn rt_free_align(ptr: *mut c_void);
}
/* ============== Device management ============== */
unsafe extern "C" {
pub fn rt_device_find(name: *const c_char) -> rt_device_t;
pub fn rt_device_open(dev: rt_device_t, oflag: u16) -> rt_err_t;
pub fn rt_device_close(dev: rt_device_t) -> rt_err_t;
pub fn rt_device_read(
dev: rt_device_t,
pos: c_ulong,
buffer: *mut c_void,
size: rt_size_t,
) -> rt_size_t;
pub fn rt_device_write(
dev: rt_device_t,
pos: c_ulong,
buffer: *const c_void,
size: rt_size_t,
) -> rt_size_t;
pub fn rt_device_control(dev: rt_device_t, cmd: c_int, arg: *mut c_void) -> rt_err_t;
}
/* ============== System tick ============== */
unsafe extern "C" {
pub fn rt_tick_get() -> rt_tick_t;
pub fn rt_tick_from_millisecond(ms: c_int) -> rt_tick_t;
}
/* ============== Debug output ============== */
unsafe extern "C" {
pub fn rt_kprintf(fmt: *const u8, ...) -> c_int;
pub fn rt_kputs(str: *const u8) -> c_int;
}
/* ============== Interrupt management ============== */
unsafe extern "C" {
pub fn rt_hw_interrupt_disable() -> rt_base_t;
pub fn rt_hw_interrupt_enable(level: rt_base_t);
pub fn rt_cpus_lock() -> rt_base_t;
pub fn rt_cpus_unlock(level: rt_base_t);
pub fn rt_interrupt_enter();
pub fn rt_interrupt_leave();
pub fn rt_interrupt_get_nest() -> u8;
}
|