Возможно, это немного зависит от того, что вы подразумеваете под «простым символьным устройством». Я предполагаю, что вам нужно что-то, что доступно через интерфейс устройства (аналогично символьным устройствам Linux).
В RTEMS есть некоторые платформы для I2C, SPI, последовательных портов и некоторые более простые интерфейсы. Довольно много драйверов извлекается из FreeBSD через libbsd и поэтому использует интерфейс FreeBSD. Аппаратное обеспечение, которое не соответствует ни одной из платформ, большую часть времени использует самоопределяемый интерфейс. Это также может быть интерфейс типа файла.
Если вы хотите использовать интерфейс типа файла, вам нужно взглянуть на IMFS_make_generic_node. Вы можете взглянуть на драйвер I2C для полностью работающего примера: https://git.rtems.org/rtems/tree/cpukit/dev/i2c/i2c-dev.c?id=94481cedc4165f6a49ef5287098251740922fee1#n147
Немного более минимальный пример может выглядеть следующим образом: Обратите внимание, что я пишу следующее более или менее из моей головы, так чтоможет быть довольно много опечаток, и вполне наверняка пропущены заголовки:
#include <rtems/imfs.h>
static ssize_t my_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
memset(buffer, 42, count);
return count;
}
static const rtems_filesystem_file_handlers_r my_handler = {
.open_h = rtems_filesystem_default_open,
.close_h = rtems_filesystem_default_close,
.read_h = my_read,
.write_h = rtems_filesystem_default_write,
.ioctl_h = rtems_filesystem_default_ioctl,
.lseek_h = rtems_filesystem_default_lseek_file,
.fstat_h = rtems_filesystem_default_fstat,
.ftruncate_h = rtems_filesystem_default_ftruncate,
.fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev
};
static const IMFS_node_control my_node_control = IMFS_GENERIC_INITIALIZER(
&my_handler,
IMFS_node_initialize_generic,
IMFS_node_destroy_default,
);
void my_Initialize( void )
{
IMFS_make_generic_node(
"/dev/my_dev",
S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO,
&my_node_control,
NULL
);
}
Вызов my_Initialize должен дать вам "/ dev / my_dev", где вы можете прочитать любое количество из 42, которое вы хотите.