STM32 общается с микросхемой по SPI.
Почему вместо ведомого снова говорит мастер?
Может у вас есть мысли какие-то?
Может надо сделать их объектными elf файлами, затем скомпоновать и зачистить формат?
gcc
для компиляции исходников на С (*.c
) и ассемблере (*.S
), gcc
или ld
для линковки, objcopy
для преобразования ELF-файла с выхода линковщика в бинарник.как Cmake передать расположение библиотеки openssl под нужную архитектуру (я попытаюсь собрать openssl из исходников под aarch64).
В CMakeLists.txt модуль обнаруживается при помощи find_package(OpenSSL REQUIRED).
Если сигнал синусоидальный то погрешность не превышает 0,3% на 2 КГц, но если цифровой сигнал(мендр) то погрешность может достигать 2% на 2 КГц.
Почему у меня не хотят работать корректно цепные команды?
mov ax,Data2
mov es,ax ; запис адреси data2 в ds
...
lea si, node1 ; <---
node1
находится в сегменте Data2
, адрес которого загружен в es
, но команда lodsb
загружает данные из ds:si
.@finish_cycle_namex:
inc I_struc ;+1 до ітерації
add si, 5
si
? si
указывает на область памяти в которой лежит массив 5-символьных имён, внутренний цикл как раз перемещает si
на следующее имя. Почему от добавления функций помимо main() в начало кода ядро перестает работать?
i686-elf-ld -Ttext 0x7E00 --oformat binary kernel.o -o kernel -e main
; Jump to the kernel's entry point
JMP 0x0000:0x7E00
-e main
?main()
. Чтобы поместить нужный код в нужное место собранного образа обычно используют скрипт линковщика.Как ... автоматически запускать bash скрипт после загрузки ядра linux?
/etc/inittab
или добавлением файла с именем вида S[0-9][0-9]*
в /etc/init.d
(если busybox), либо добавлением юнита systemd если systemd.С помощью buildroot
Как узнать, какой адрес этих регистров уже после инициализации устройств и загрузки ОС?
ioremap()
или какой-нибудь его обёрткой. Если драйверу нужен доступ к регистрам -- драйвер просто вызывает ioremap()
сам и получает адрес. Если доступ нужен в юзерспейсе -- можно (при наличии разрешений) сделать mmap()
файлу /dev/mem
по смещению равному физическому адресу устройства.Или обратная задача: есть процесс, который пишет в некоторую область памяти, как узнать, возможно, это какие-то регистры SOM
cat /proc/<pid>/maps
и посмотреть, что отображено в эту область виртуальных адресов.// Получаю ошибку:
7FFF0000: The instruction at 0x7FFF0000 referenced memory at 0x7FFF0000. The memory could not be executed -> 7FFF0000 (exc.code c0000005, tid 6332)
В чем проблема?
7FFF0000
-- не исполняемая.Как починить?
7FFF0000
исполняемой. После этого вывод в лог должен заработать, но будет падать после него, потому что функция mySuperFunction
не возвращается. Почему ОС не запускается на Virtual box, а на QEMU запускаеться?
-enable-kvm
, то оно тоже не будет работать.ret
в реализацию GDT::load_gdt()
и не вызывать load_tss()
то оно начинает в qemu-kvm работать:diff --git a/src/GDT/GDT_impl.s b/src/GDT/GDT_impl.s
index 4f69835abd9d..5476837f3d0a 100644
--- a/src/GDT/GDT_impl.s
+++ b/src/GDT/GDT_impl.s
@@ -2,6 +2,7 @@
.extern _ZN8SimpleOS3GDT7gdt_ptrE
_ZN8SimpleOS3GDT8load_gdtEv:
lgdt _ZN8SimpleOS3GDT7gdt_ptrE
+ ret
.global _ZN8SimpleOS3GDT8load_tssEv
_ZN8SimpleOS3GDT8load_tssEv:
выводится ошибка - [: missing `]'
Что значит эта ошибка
if [ "$projectDir" == "video" && "$flag" != "noflag" ]; then
следующим образом: ключевое слово if
, команда [
с аргументами "$projectDir" == "video"
, оператор &&
, команда "$flag"
с аргументами != "noflag" ]
, разделитель ;
, оператор then
.[
(она же test
), очевидно, не нашла в своих аргументах закрывающей скобки ]
, которая должна там быть при таком её вызове.как ее можно исправить?
-a
вместо &&
, как говорит man test. std::copy(arr1, arr1 + n, buf);
int off = 0;
...
for (GLfloat i = 0; i <= 3.14; i += 0.01)
for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01)
{
...
std::copy(arr1, arr1 + n, buf + off);
off += n;
}
кода я не нашел, или плохо искал
через ряд тейлора не вариант при больших значениях угла ряд медленно сходится
map::copy
, вот в этом месте. Нельзя копировать сложные объекты функцией memcpy()
, потому что при удалении копии её деструктор освободит данные оригинала. Для такого копирования следует либо использовать placement new, либо копировать целиком объект Node, типа того. Для того чтобы это работало потребуется реализовать глобальный оператор new, типа того. С этими изменениями конкретно описанная в топике проблема решается, но я вижу, что и другие методы класса map
реализованы с похожими ошибками, так что не расслабляйся и не думай, что это была единственная проблема в коде.FileSystem::get_root()
копирует всё дерево файловой системы, когда FileSystem::tree()
явно не собирается его менять, можно было бы в этом случае обойтись константной ссылкой. В чем может быть проблема?
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
packed
, иначе компилятор вставляет паддинг для выравнивания поля base
на границу uint32_t
, из-за чего в IDT загружается неверный адрес.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