Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?
ioremap()
или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap()
сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap()
файлу /dev/mem
по смещению равному физическому адресу устройства.Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM
cat /proc/<pid>/maps
и посмотреть, что отображено в эту область виртуальных адресов.Сигналы доходят до меги, но она не включает ни один из светиков.
Что это значит
���`�B��Χh� �l<*�� !�����
-- это вывод скетча на 9600. Откуда LoadProhibited -- непонятно.можно ли это как-то исправить?
idf.py monitor
обычно декодирует стек трейс и выводит соответствующие строчки исходников, можно начать отсюда. как это сделать вместе?
U2RXD
с разъёма P1
можно для этого использовать, если речь об этом модуле. какое напряжение на контактах FSPI на esp32 s3 n16r8
uint8_t led_state = 0x03; Данной командой мы завели переменную, которая равна 3
что под этим подразумевается?
HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET); Это я так понимаю мы сначала устанавливаем самый первый светодиод, т.е. 8, но на практике ни так.
led_state = led_state >> 1 | led_state << 7;Эту строку совсем не понимаю.
И решение, если я читаю часы-минуты-секунды и получаю в секундах 00 - то мне следует перечитать минуты ещё раз и сделать вывод.
почему нельзя занести этот бит в регистр без сдвига, зачем это придумано
UCSRA |= (1<<U2X);
UCSRA |= U2X;
. В ассемблерном коде avr оба эти варианта превратятся в инструкцию sbi UCSRA, 1
, устанавливающую бит в регистре по номеру.Схема подключения:
В микроконтроллерах понимания ноль
Какие косяки меня могут поджидать?
Есть способ лучше?
void send_uint32(uint32_t v)
{
uint8_t transmitBuffer[4];
memcpy(transmitBuffer, &v, sizeof(v));
HAL_UART_Transmit_IT(&huart1, transmitBuffer, sizeof(v));
}
$ cat > test.cpp <<EOF
class type_class {
int field1;
int field2;
public:
constexpr type_class (int f1, int f2): field1(f1), field2(f2) {
}
};
extern const type_class var;
const type_class var(12, 34);
EOF
$ g++ -S -O2 test.cpp
$ cat test.s
.file "test.cpp"
.globl var
.section .rodata
.align 8
.type var, @object
.size var, 8
var:
.long 12
.long 34
.ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
.section .note.GNU-stack,"",@progbits
Почему так происходит, если делать изменения в коде, которые я описал выше?
Если в этом коде удалить саму метку RESET:, то есть только метку, но не обработчик прерывания RESET - код не работает
почему если я размещаю обработчик прерывания RESET последним - он также не работает
Для чего нужна процедура RESET?
Как она вызывается
P.S. выделение памяти в прерываниях зло и т.д. ага.
Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();