При старте экран чёрный (так и задумано на этом этапе), но клавиатура реагирует на клавишу ESC — код отрабатывает корректно.
Прерывания будто блокируются после первого-второго вызова.
dummy_handler_asm, который вызывается по таймеру, но не завершается отправкой кода окончания обработки прерывания в PIC.diff --git a/system/drivers/interrupts.asm b/system/drivers/interrupts.asm
index 75ea06c4bc2f..17ac87fa6b06 100644
--- a/system/drivers/interrupts.asm
+++ b/system/drivers/interrupts.asm
@@ -98,5 +98,7 @@ dummy_handler_asm:
push rax
mov rax, 0xFEE000B0
mov dword [rax], 0
+ mov al, 0x20
+ out 0x20, al
pop rax
iretqbs->AllocatePages(2, 4, ...), а 2 -- это AllocateAddress, т.е. запрос на выделение памяти по фиксированному тобой адресу. У меня этот код сразу возвращает ошибку, а вот bs->AllocatePages(0, 4, ...) -- работает:diff --git a/boot/bootloader.c b/boot/bootloader.c
index 377e907c1728..5ae82dca7fc0 100644
--- a/boot/bootloader.c
+++ b/boot/bootloader.c
@@ -59,7 +59,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
// 1. Выделяем память под скрытый буфер экрана (1024 * 768 * 4 байта = 3145728 байт = 768 страниц по 4КБ)
unsigned long long v_buffer_addr = 0;
// 2 = EfiAllocateAnyPages, 4 = EfiRuntimeServicesData (чтобы ядро гарантированно видело эту память)
- long long status = bs->AllocatePages(2, 4, 768, &v_buffer_addr);
+ long long status = bs->AllocatePages(0, 4, 768, &v_buffer_addr);
if (status != 0) {
while(1) { __asm__ __volatile__("hlt"); }
}
@@ -85,7 +85,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
unsigned long long map_buffer = 0;
// Выделяем временную память под саму карту памяти (округлим map_size до страниц)
- bs->AllocatePages(2, 4, (map_size / 4096) + 1, &map_buffer);
+ bs->AllocatePages(0, 4, (map_size / 4096) + 1, &map_buffer);
// Получаем финальную карту памяти и MapKey
status = bs->GetMemoryMap(&map_size, (void*)map_buffer, &map_key, &desc_size, &desc_ver);Проблема заключается в том, что при достижении конца цикла, dma подстовывает цап нулевое значение.
dma_init_struct.memory_addr = (uint32_t)_binary_C__data_for_MC_2_bin_start + 20;dma_init_struct.number на 1, а потом увеличить dma_init_struct.memory_addr на 2 и понаблюдать за тем, не исчезает ли эффект. Отсюда вывод, что если происходит запись в исполняемую кеш-линию, то добавляется 100 наносекунд, и под 50-100 раз падает скорость .И я не могу загуглить почему так.
Какой минимальный набор изменений требуется в main.rs чтобы было понимание что выполнение находится в _start?
-d in_asm,exec и смотреть в лог выполнения.Какой командой лучше запускать qemu чтобы происходило размещение в памяти и передача управления ELF?
-kernel.Если запускать через -device loader, какой адрес (dts в спойлере ниже) необходимо указать (и можно ли так вообще)?
Можно ли запускать через параметр -kernel и, если да, то как?
если вернуть графику то в окне вместо такой же пустой консольной строки уже другая с вводом команд в qemu).
-monitor none. (a + i) (API) и (-1)^i (M1PI), переменную для результата (result), текущее слагаемое собирать в регистре 1. На каждой итерации вычислять текущее слагаемое ряда, прибавлять его к результату, а потом обновлять значения (-1)^i и (a + i) для следующей итерации. Как-то так:movr 0, N
srm 0, ONE
jz PRINT
CYCL:
movr 1, M1PI
mrm 1, API
arm 1, result
movm 1, result
mmm M1PI, M1
amm API, ONE
loop CYCL
PRINT:
movr 1, result
out 1
stop
ONE: .dw 1
M1: .dw -1
M1PI: .dw 1
API: .dw 1
result: .dw 0
end декодирование кода Хэмминга происходит неверно(да и приём байт в целом), если в цикле заполнения буфера отсутствует вывод serial
for(int i = 0;i<24;++i) {
sendByte(block[i]);
Serial.print(block[i],HEX);Serial.print(' ');
}for(int i = 0;i<10;++i) {
uint8_t byte1 = receiveByte();uint8_t byte2 = receiveByte();
buffer[i*2] = byte1; buffer[i*2+1] = byte2;
//delay(200);
Serial.print(byte1,HEX); Serial.print(' '); Serial.print(byte2,HEX);Serial.print(' ');
}Serial.print() или других функций с переменным временем выполнения в алгоритм требующий работы в режиме реального времени. int mat(int ***matrix, int m, int n) {
int mat(int **matrix, int m, int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
printf("x: %d / y: %d / ", i, j);
matrix[i][j] = 1;
}
return 0;
}
int mato(int **matrix, int m, int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (j == m - 1) {
printf("%d\n", matrix[i][j]);
} else {
printf("%d ", matrix[i][j]);
}
return 0;
}
int main() {
int **matrix = malloc(XMAX * YMAX * sizeof(int) + XMAX * sizeof(int*));
...
if (mat(matrix, XMAX, YMAX) != 0) {
free(matrix);
return 1;
}
mato(matrix, XMAX, YMAX);
...
}mat(&matrix[0][0], XMAX, YMAX)matrix --- это не настоящий двумерный массив, и matrix и &matrix[0][0] указывают в разные места.Теоретически, это позволит делать вызов функции за один (или несколько) тактов, и при этом не сохранять не только регистр возврата, но и другие временные регистры, или регистры передающие параметры.
Адрес возвртата недоступен, и его не только не перезапишут, но и не узнают.
ld.exe: .pio\build\desktop\test\desktop\test_user\user.test.o: in function `test_only_strongest_zone_applies()':
P:\stalker\dosimetr-arduino/test/desktop/test_user/user.test.cpp:31:(.text+0x104): undefined reference to `User::updatePosition(GpsPosition const&)'
User не определены.в какую сторону копать
objects/User.hpp или где-то ещё, и понять, каким образом должен собираться этот код. я использовал микроконтроллер Attiny13, прослушивающий по UART последовательность команд, поэтому для загрузки нового кода достаточно любого адаптера USB-UART.
выдаёт ошибку
insmod: ERROR: could not insert module flc2.ko: Invalid parameters
flc2_module_init() возвращает -EINVAL. Заглянув в единственную функцию register_qdisc() которую ты вызываешь, можно увидеть следующее:if (qops->peek == NULL) {
if (qops->dequeue == NULL)
qops->peek = noop_qdisc_ops.peek;
else
goto out_einval;
}peek == NULL и dequeue != NULL гарантированно приводит к ошибке которую ты наблюдаешь.flc2_qdisc_ops. А как быть, если истек срок годности sub ключа, которым шифровались пароли?
Ну или другой вариант, украли телефон и всё.
При этом есть секретный ключ.
cout << (args << ...) << endl; надо было написать (cout << ... << args) << endl;почему ж в результате оно себя ведёт так, как будто скобки есть??
Какой приоритет операций, разворачивающихся из fold-expression?