LINUX.ORG.RU

Сообщения COKPOWEHEU

 

RISC-V и выравнивание адресов

Разбираюсь с контроллером gd32vf103 (это тот, который на risc-v, а не на arm). В документации написано, что работать с невыровненными адресами он не умеет, и должен генерировать исключение 4 (load address misaligned, ошибка выравнивания памяти).

Note: the Bumblebee Core does not support misaligned memory access, so a misaligned memory access will cause in an exception.

На команду ecall он реагирует нормально (бросает исключение 11 или 8, которые за собственно ecall зарезервированы). На попытку выполнить .word 0xFFFFFFFF реагирует нормально (исключение 2, illegal instruction). А вот lw t0, 1(zero) почему-то заканчивается успешно: он читает байты 1, 2, 3 и 4 как будто так и надо. Причем что с правами машины, что юзера - безразлично. С другими адресами тоже самое.

Собственно вопрос: как его сломать так, чтобы он сломался? Или это я где-то в документации не увидел, что он научился читать данные с любого места?

 ,

COKPOWEHEU
()

udev собрать симлинк на основе атрибутов

При подключении переходников USB-UART они именуются /dev/ttyUSB0, /dev/ttyACM50 и т.д. Хотелось бы дать им более осмысленные имена. Для этого написал правило udev’а:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", PROGRAM="/bin/bash -c \"ls /dev | grep tty_ft232r_ | wc -l \"", SYMLINK+="tty_ft232r_%c"

Потом подключаю свое самодельное устройство, которое выглядит как сдвоенный переходник, причем назначения у «частей» переходника разные и описываются именем интерфейса. Это тоже решаемо:

SUBSYSTEM=="tty", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df" ENV{CONNECTED_vusb}="yes"
ENV{CONNECTED_vusb}=="yes", SUBSYSTEM=="tty", ATTRS{interface}=="term_cdc", PROGRAM="/bin/bash -c \"ls /dev | grep tty_TERM_CDC_ | wc -l \"", SYMLINK+="tty_TERM_CDC_%c"
ENV{CONNECTED_vusb}=="yes", SUBSYSTEM=="tty", ATTRS{interface}=="term", PROGRAM="/bin/bash -c \"ls /dev | grep tty_TERM_ | wc -l \"", SYMLINK+="tty_TERM_%c

Но мне не понравилось указывать имя симлинка в двух местах для каждого устройства: при подсчете количества и при собственно формировании симлинка. Интуитивно кажется, что должно быть решение.

Если у устройства уже есть атрибут ATTRS{interface} с нормальным текстовым описанием, нельзя ли его как-то подставить его в симлинк?

 , , ,

COKPOWEHEU
()

статический flexible array

Хочу в контроллере выделить пару однотипных структур с массивами разного размера. Для одной это делается просто:

struct{
  int field;
  char arr[ SIZE ];
}var;

Если же делать для нескольких, уже нужен прототип

typedef struct{
  int field;
  char arr[];
}str_t;
Объявление может быть только глобальным или статическим (в моем случае это не проблема). Но способа красиво задать размер я не нашел. Разве что вот такой костыль:
str_t var = {.arr[ SIZE ]=0};
Нет ли более человеческого способа?

 

COKPOWEHEU
()

avrdude новее oldstable не работает

Версия oldstable (6.3-2) работает прекрасно (проверял на avrdoper и ft232r), а та, что считается актуальной (6.3-20171130+svn1429-2+b1) ни одного программатора не видит. OS Debian.

Отсюда два вопроса: как в репозиторий положили сломанную версию и куда писать чтобы это починили?

 

COKPOWEHEU
()

Макрос, разворачивающийся в переменное число аргументов

Возможно ли вообще написать на Си макрос, который бы подставлялся в массив uint8_t как 1, 2, 3 или 4 числа в зависимости от аргумента? Например, если передать 0x12 то подставился как (1, 0x12), если передать 0x1234 то (2, 0x12, 0x34), если 0x123456 то (3, 0x12, 0x34, 0x56) и т.д. Пробовал даже через _Generic с явным указанием типа, но даже он выдает только одно значение.

 ,

COKPOWEHEU
()

RSS подписка на новые темы