как это можно решить?
dividing_by_zero
, восстановит все регистры и сделает iret
. я думал это решит проблему, но не помогло(
dividing_by_zero
. Код надо перестроить, твой Makefile с этим не очень хорошо справляется.dividing_by_zero
не удаётся вернуться -- это уже другая проблема. iret
из середины с++-функции, потому что компилятор организовал в ней кадр стека и вместо возврата iret
снимает и интерпретирует мусор из этого кадра:001000e6 <SimpleOS::IDT::dividing_by_zero()>:
1000e6: 55 push %ebp
1000e7: 89 e5 mov %esp,%ebp
1000e9: 53 push %ebx
1000ea: 83 ec 04 sub $0x4,%esp
1000ed: e8 15 01 00 00 call 100207 <__x86.get_pc_thunk.ax>
1000f2: 05 06 11 00 00 add $0x1106,%eax
1000f7: 83 ec 0c sub $0xc,%esp
1000fa: 8d 90 08 fe ff ff lea -0x1f8(%eax),%edx
100100: 52 push %edx
100101: 89 c3 mov %eax,%ebx
100103: e8 4c 00 00 00 call 100154 <SimpleOS::Terminal::print(char const*)>
100108: 83 c4 10 add $0x10,%esp
10010b: fa cli
10010c: cf iret
10010d: 90 nop
10010e: 8b 5d fc mov -0x4(%ebp),%ebx
100111: c9 leave
100112: c3 ret
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
packed
, иначе компилятор вставляет паддинг для выравнивания поля base
на границу uint32_t
, из-за чего в IDT загружается неверный адрес. *.s
, *.cpp
, *.h
и linker.ld. Типа того. когда на SD карту что-то загружается давать на CS карты HIGH и на mfrc522 LOW,
у SD какой вывод CS?Я не нашёл в документации.
HS2_DATA3
на этой схеме. что вы подразумеваете под
руками подавать сигнал на второй CS, по окончании транзакции -- вернуть всё в исходное состояние.
SPI
с аппаратным CS для одного из устройств, как у вас сейчас, а когда нужно работать с другим устройством -- вызывать SPI.setHwCs(false)
и руками подавать сигнал на второй CS, по окончании транзакции -- вернуть всё в исходное состояние.SPI
без аппаратного CS, включать CS нужного устройства как сигнал GPIO перед транзакцией, выключать после.
Из-за ошибок работы с памятью.
Бесполезно приводить случайные куски кода. Чтобы сказать наверняка что происходит нужен полный собирающийся код.