Новости:

Форум Infotex WeaponMod

Тема: Baofeng DM-32  (Прочитано 223145 раз)

Оффлайн Koshak 04 Октября 2025, 08:58:00 (#405)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
JTAG is working  :$





У кошки четыре ноги: вход, выход, земля и питание
  • « Последнее редактирование: 04 Октября 2025, 09:34:49 от Koshak »

Оффлайн GTMoraes 04 Октября 2025, 15:02:31 (#406)

  • Переведено Gemini
  • Постоялец
  • ***
  • Сообщений: 24
  • Карма: +4/-0
  • HI21MX
    • Просмотр профиля
Это круто! Я, на самом деле, понятия не имею, что из этого выйдет, но любая разработка только приветствуется! Я тут пытался с помощью ChatGPT найти способ, как можно было бы отключить проверки CRC в DMR, чтобы принимать столько же передач, сколько я могу с OpenGD77, но безрезультатно.
Может быть, дело и не в проверках CRC, но я цепляюсь за единственную зацепку, которая у меня есть, лол.

Я скармливал ChatGPT код из реверс-инжиниринга бинарников (кстати, спасибо, что уточнили насчёт процессора C-SKY!), моддил бинарники и пробовал всякое. Это просто жесть, как вы вообще это делаете? лол

Спасибо за ваши усилия. Надеюсь, ваша усердная работа принесёт много новых крутых штук.

Оффлайн Koshak 04 Октября 2025, 17:08:45 (#407)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Это круто!
Многие вещи мне пока не понятны, стараюсь разобраться  :-)
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Koshak 05 Октября 2025, 09:41:42 (#408)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
С помощью дизассемблера нашёл место проверки кода ALPU но могу ошибаться  :D



У кошки четыре ноги: вход, выход, земля и питание

Оффлайн GTMoraes 05 Октября 2025, 16:56:02 (#409)

  • Переведено Gemini
  • Постоялец
  • ***
  • Сообщений: 24
  • Карма: +4/-0
  • HI21MX
    • Просмотр профиля
С помощью дизассемблера нашёл место проверки кода ALPU но могу ошибаться  :D



Я попробовал использовать Ghidra для дизассемблирования кода, но в итоге не смог, потому что не получилось надёжно выставить язык. Инструкции процессора — C-Sky, верно? Какой-то кастомный вариант RISC от Alibaba или типа того. Точно не уверен. Мне во всём этом помогал ChatGPT.

В конце концов, кажется, у меня получилось дизассемблировать код с помощью другого, уже готового специализированного инструмента для C-Sky с официального портала T-Head. Найти его было тем ещё геморроем, но в итоге я нашёл его здесь: https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource/1356021/1619529111421/csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gz

Не уверен, разобрался ли ты с этим уже, или я вообще не в ту степь пошёл, но ChatGPT начал давать мне внятные ответы только после того, как получил декомпилированный код, обработанный этим инструментом.

Оффлайн Koshak 05 Октября 2025, 17:33:59 (#410)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
В конце концов, кажется, у меня получилось дизассемблировать код с помощью другого, уже готового специализированного инструмента для C-Sky с официального портала T-Head. Найти его было тем ещё геморроем, но в итоге я нашёл его здесь: https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource/1356021/1619529111421/csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gz
Спасибо!
У меня идея!
Я пробросил порт 1025 в глобальную сеть  :D ты можешь подключится к плате через GDB target remote 94.181.174.35:1025
Ты можешь подключится?
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн GTMoraes 05 Октября 2025, 18:54:11 (#411)

  • Переведено Gemini
  • Постоялец
  • ***
  • Сообщений: 24
  • Карма: +4/-0
  • HI21MX
    • Просмотр профиля
В конце концов, кажется, у меня получилось дизассемблировать код с помощью другого, уже готового специализированного инструмента для C-Sky с официального портала T-Head. Найти его было тем ещё геморроем, но в итоге я нашёл его здесь: https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource/1356021/1619529111421/csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gz
Спасибо!
У меня идея!
Я пробросил порт 1025 в глобальную сеть  :D ты можешь подключится к плате через GDB target remote 94.181.174.35:1025
Ты можешь подключится?


Думаю, я бы мог, но хочу прояснить: я АБСОЛЮТНО НЕ ПОНИМАЮ, что я делаю 🤣
Нет, серьёзно, это не скромность, я не шучу! Всё, что я до сих пор «нарыл», — это результат общения с ChatGPT. Я в жизни не слышал о Ghidra, и я не программист. Я, в лучшем случае, ковыряльщик.

Из всего твоего последнего поста я понял только то, что ты использовал Ghidra, а у меня не получалось её запустить, и ChatGPT был без понятия, как интерпретировать декомпилированный код, который я ему отправлял. Тогда я отправил в ChatGPT скриншот командной строки JTAG, который ты присылал ранее, и китайский PDF на HR_C7000, который ты отправлял несколько недель назад, и ChatGPT определил, что мне нужно использовать из этой инфы — и опять же, я даже не уверен, действительно ли он это сделал, или это были его галлюцинации.

Я пытался редактировать .bin-файл в HEX-редакторе, чтобы отключить проверки DMR CRC и посмотреть, смогу ли я таким образом декодировать передачи скорой помощи и DMR-передачи Motorola с RAS. Он [ChatGPT] перепробовал кучу всего, и хотя я всё ещё не могу декодировать передачи скорой (зелёный светодиод загорается, шкала RSSI заполняется, но звука нет), он смог правильно найти пределы TX и RX (я и так знал, где они были), так что, я полагаю, он действительно смог понять код через декомпилированную версию.

Оффлайн Koshak 05 Октября 2025, 21:27:08 (#412)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Я, в лучшем случае, ковыряльщик.
Аналогично  :D
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Koshak 06 Октября 2025, 06:42:20 (#413)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Ещё один пароль CPS

Adjust Mode --> bfcps

У кошки четыре ноги: вход, выход, земля и питание

Оффлайн GTMoraes 06 Октября 2025, 16:56:33 (#414)

  • Переведено Gemini
  • Постоялец
  • ***
  • Сообщений: 24
  • Карма: +4/-0
  • HI21MX
    • Просмотр профиля
Ещё один пароль CPS

Adjust Mode --> bfcps


Интересно. А что это даёт?


Оффлайн Koshak 06 Октября 2025, 18:37:04 (#415)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Интересно. А что это даёт?
Недокументированная функция CPS для обновления прошивки.
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Koshak 09 Октября 2025, 19:56:18 (#416)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
JTAG отключил...
Ломать нужно прошивку  ???
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн mvisions 09 Октября 2025, 22:59:36 (#417)

  • Новичок
  • *
  • Сообщений: 2
  • Карма: +0/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
Español (original): Podría usted probar esos archivos en Visual Code, ya que lleva IA agregada al programa y puede leer archivos. Le hará una gran ayuda, pues la misma IA modificará el código a sus deseos.Si usted puede enviarme los archivos, podría intentar ayudarle.

Inglés: Could you try those files in Visual Code, since the program has AI integrated and can read files. It will be a great help, as the AI itself will modify the code to your wishes.If you can send me the files, I could try to help you.

Polaco: Czy mógłby Pan/Pani wypróbować te pliki w Visual Code, ponieważ program ma zintegrowaną sztuczną inteligencję i potrafi odczytywać pliki. To będzie dużą pomocą, ponieważ sama SI zmodyfikuje kod zgodnie z Państwa życzeniami.Jeśli może mi Pan/Pani przesłać pliki, mógłbym/mogłabym spróbować Panu/Pani pomóc.

Ruso: Не могли бы вы попробовать эти файлы в Visual Code, так как в программе встроен искусственный интеллект и она может читать файлы. Это будет большой помощью, ведь сама ИИ изменит код в соответствии с вашими пожеланиями.Если вы сможете отправить мне файлы, я мог бы попытаться вам помочь.
  • « Последнее редактирование: 09 Октября 2025, 23:05:08 от mvisions »

Оффлайн Koshak 11 Октября 2025, 08:45:56 (#418)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 3210
  • Карма: +286/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Я скинул пару функций DeepSeek  :D, ищем дальше...

int FUN_300dc690(uint param_1,uint param_2,undefined *param_3)

{
  int *piVar1;
  int iVar2;
  uint uVar3;
  int iVar4;
  uint uVar5;
 
  if (*DAT_300dc764 == 1) {
    iVar2 = -1;
  }
  else if (param_3 == (undefined *)0x0) {
    iVar2 = -1;
  }
  else if ((uint)DAT_300dc764[4] < param_1) {
    iVar2 = -1;
  }
  else if (param_2 == 0) {
    iVar2 = -1;
  }
  else {
    iVar2 = FUN_300dc574(0xfffffff);
    FUN_300dc410(0x14);
    piVar1 = DAT_300dc764;
    while (iVar2 == 0) {
      iVar4 = piVar1[3];
      uVar3 = piVar1[1];
      iVar2 = FUN_300dc574(0xfffff);
      if (iVar2 != 0) {
        return iVar2;
      }
      if (param_2 <= uVar3) {
        uVar3 = param_2;
      }
      uVar5 = iVar4 - (iVar4 - 1U & param_1);
      if (uVar5 < uVar3) {
        uVar3 = uVar5;
      }
      FUN_300dc47c(6,1,0,(undefined *)0x0);
      iVar2 = FUN_300dc47c(param_1 & 0xffffff | 0x2000000,4,uVar3,param_3);
      if (iVar2 != 0) {
        return iVar2;
      }
      param_2 = param_2 - uVar3;
      iVar2 = FUN_300dc574(0xfffffff);
      FUN_300dc410(0x14);
      if (param_2 == 0) {
        return iVar2;
      }
      param_1 = param_1 + uVar3;
      param_3 = param_3 + uVar3;
    }
  }
  return iVar2;
}


void UndefinedFunction_300dc8d0(void)

{
  uint uVar1;
  int iVar2;
  char cVar3;
  undefined auStack_24 [4];
 
  func_0x330c1578(0x10c,auStack_24,4);
  FUN_300c0964();
  FUN_300c0a14();
  FUN_300dc5c0(0x300b000,0x1000);
  uVar1 = DAT_300dc988;
  cVar3 = '\0';
  do {
    iVar2 = FUN_300dc690(uVar1,4,auStack_24);
    if (iVar2 != -1) break;
    FUN_300de844(100);
    cVar3 = cVar3 + '\x01';
  } while (cVar3 != '\v');
  FUN_300c0a38();
  FUN_300c0974();
  return;
}


подскажи что происходит

We are given two functions. The first one (FUN_300dc690) is a complex function that does some kind of I/O operation (likely reading from a device) and the second one (UndefinedFunction_300dc8d0) uses the first function to read 4 bytes and does so with retries.

Let me break down the first function in more detail:

FUN_300dc690:
Inputs:
param_1 (uint): offset or address
param_2 (uint): size to read
param_3 (undefined*): buffer to read into

Returns: int (0 on success, -1 on error, or other error codes)

Steps:

Check if *DAT_300dc764 is 1 -> return -1

Check if param_3 is NULL -> return -1

Check if DAT_300dc764[4] (maybe a max offset) is less than param_1 -> return -1

Check if param_2 is 0 -> return -1

Call FUN_300dc574(0xfffffff) and then FUN_300dc410(0x14). These might be setup or lock functions.

Then we enter a loop that breaks when iVar2 != 0 (which is set by the call to FUN_300dc574 inside the loop) or when we've read all data (param_2 becomes 0).

Inside the loop:

iVar4 = piVar1[3] (maybe a sector size or alignment value)

uVar3 = piVar1[1] (maybe a maximum chunk size we can read at once)

Then we call FUN_300dc574(0xfffff) again (maybe a wait for device to be ready?)

We set uVar3 to the minimum of param_2 and uVar3 (so we read in chunks)

uVar5 = iVar4 - (iVar4 - 1U & param_1) -> This calculates the number of bytes from the current offset to the next sector boundary?

Then we set uVar3 to the minimum of uVar3 and uVar5 (so we don't cross a boundary)

Then we call FUN_300dc47c(6,1,0,0) -> maybe a command to the device? (command 6, with 1 and 0 as arguments)

Then we call FUN_300dc47c with:

param_1 & 0xffffff | 0x2000000 -> maybe the address with a command bit set?

4 -> maybe the size of the address? or a mode?

uVar3 -> the size to read

param_3 -> the buffer

If that returns non-zero, we return that error.

Then we update:
param_2 -= uVar3
param_1 += uVar3
param_3 += uVar3

Then we call FUN_300dc574(0xfffffff) and FUN_300dc410(0x14) again (maybe for the next chunk)

If we break out of the loop because param_2 becomes 0, we return iVar2 (which should be 0).

So, the first function seems to be reading from a device in chunks, taking into account alignment and maximum transfer size.

Now the second function:

UndefinedFunction_300dc8d0:
This function:
- Declares a 4-byte stack buffer (auStack_24)
- Calls func_0x330c1578(0x10c, auStack_24, 4) -> this might be initializing the stack buffer or setting up a request?
- Then calls FUN_300c0964 and FUN_300c0a14 (initialization functions for the device?)
- Then calls FUN_300dc5c0(0x300b000, 0x1000) -> maybe mapping or setting up a memory region?

text
- Then it tries to read 4 bytes from the address stored in DAT_300dc988 (which is a global variable) into the stack buffer.

- It uses a loop that tries up to 11 times (cVar3 from 0 to 10) to read the 4 bytes.

- If FUN_300dc690 returns something other than -1, it breaks out of the loop.

- If it fails, it waits for 100 time units (FUN_300de844(100)) and tries again.

- Then it calls FUN_300c0a38 and FUN_300c0974 (cleanup functions) and returns.
So, the second function is trying to read a 4-byte value from a specific address (stored in DAT_300dc988) with retries.

Given the context, it seems like this code is for reading from a hardware device (like flash memory) that may require retries due to occasional read failures.

Note: The function names are automatically generated by the decompiler and don't convey meaning, but we can infer their purpose from the code.

If you have any specific questions or need more clarification, let me know.

Here's the analysis of the assembly code in English:

Function FUN_300dc690
Purpose: Read data from a device/memory with error handling and byte-by-byte access.

Logic:

Input parameter validation:

Checks global state (*DAT_300dc764)

Validates param_3 pointer

Checks param_1 boundaries

Verifies param_2 ≠ 0

Main read loop:

Calls FUN_300dc574 and FUN_300dc410 (likely device preparation)

Calculates available read block size:

c
uVar3 = min(param_2, piVar1[1]);  // Max size limitation
uVar5 = iVar4 - (iVar4 - 1U & param_1);  // Alignment/boundaries
uVar3 = min(uVar3, uVar5);  // Final block size
Executes commands via FUN_300dc47c (likely low-level device access)

Updates counters and pointers for next iteration

Returns: 0 on success, -1 on errors

Function UndefinedFunction_300dc8d0
Purpose: Read a 4-byte value with retry mechanism on failures.

Algorithm:

Initializes system (FUN_300c0964, FUN_300c0a14)

Configures memory access (FUN_300dc5c0)

Retry loop (up to 11 attempts):

Attempts to read 4 bytes via FUN_300dc690

On success - breaks loop

On error - waits 100 time units (FUN_300de844(100)) and retries

Cleans up system

Likely Context
This appears to be:

Device driver (e.g., Flash memory, EEPROM)

Hardware initialization system

Protected memory access

The code is typical for embedded systems where hardware failures are handled through retry mechanisms with delays between attempts.


У кошки четыре ноги: вход, выход, земля и питание

Оффлайн mvisions 11 Октября 2025, 12:02:36 (#419)

  • Новичок
  • *
  • Сообщений: 2
  • Карма: +0/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
Отчёт об Анализе Функций Прошивки
Informe de análisis de funciones de firmware
Анализируемый код, состоящий из низкоуровневой функции ввода-вывода (FUN_300dc690) и высокоуровневой функции чтения с повторами (UndefinedFunction_300dc8d0), представляет собой типичный и надёжно спроектированный фрагмент прошивки (firmware) или драйвера устройства для встроенных систем, работающих с энергонезависимой памятью (например, Flash или EEPROM).
El código analizado, que consta de una función de E/S de bajo nivel (FUN_300dc690) y una función de lectura y reproducción (UndefinedFunction_300dc8d0) de alto nivel, es una pieza típica y bien diseñada de firmware o controlador de dispositivo para sistemas integrados que funcionan con memoria no volátil (por ejemplo, Flash o EEPROM).

1. FUN_300dc690: Драйвер Чтения (Низкий Уровень)
1. FUN_300dc690: Leer controlador (bajo)
Эта функция является основным механизмом для доступа к оборудованию. Её сложность обусловлена необходимостью строгого соблюдения ограничений и протоколов устройства.
Esta característica es el mecanismo principal para acceder al hardware. Su complejidad se debe a la necesidad de cumplir estrictamente con las restricciones y protocolos del dispositivo.

Аспект  Aspecto   Детали Анализа  Detalles del análisis   Значимость в Embedded Systems
Importancia en los sistemas integrados
Цель  Propósito   Безопасное чтение блока данных с указанного смещения (param_1) в буфер (param_3).
Lee de forma segura un bloque de datos de un desplazamiento especificado (param_1) a un búfer (param_3).   Ядро I/O Драйвера. Непосредственно взаимодействует с контроллером памяти.
Núcleo de E/S del controlador. Se comunica directamente con el controlador de memoria.
Проверки  Comprobar   Жёсткая валидация входных данных: состояние системы, NULL-указатели, границы смещения и размер чтения.
Validación dura de los datos de entrada: estado del sistema, punteros nulos, límites de desplazamiento y tamaño de lectura.   Защита от сбоев (crash) и недопустимого доступа к памяти, что критично для прошивки.
Protección contra bloqueos y acceso a memoria no válido, que es fundamental para el firmware.
Логика Разбиения (Chunking)
Lógica de partición (fragmentación)   Чтение выполняется частями (uVar3), размер которых ограничивается: 1. Максимальным размером передачи устройства. 2. Границами выравнивания/сектора (uVar5).
Las lecturas se realizan en partes (uVar3), cuyo tamaño está limitado por: 1. El tamaño máximo de transferencia del dispositivo. 2. Alineación/límites de sector (uVar5).   Соблюдение аппаратных ограничений. Предотвращает передачу данных, которая может пересечь границы физических секторов/страниц, требуя двух отдельных аппаратных операций.
Cumplimiento de las limitaciones de hardware. Evita las transferencias de datos que pueden cruzar los límites de los sectores físicos/páginas al requerir dos operaciones de hardware independientes.
Команда  Equipo   Формирование адреса, включающего командный бит (0x2000000), перед вызовом низкоуровневой функции обмена (FUN_300dc47c).
Genere una dirección que incluya el bit de comando (0x2000000) antes de llamar a la función de intercambio de bajo nivel (FUN_300dc47c).   Протокол Управления. Указывает устройству, что нужно выполнить операцию чтения.
Protocolo de gestión. Indica al dispositivo que realice una operación de lectura.
Синхронизация  Sincronización   Использование функций FUN_300dc574 (Ожидание) и FUN_300dc410 (Блокировка).
Uso de las funciones FUN_300dc574 (Espera) y FUN_300dc410 (Bloqueo).   Обеспечение готовности устройства и взаимного исключения (исключение одновременного доступа).
Garantizar la disponibilidad del dispositivo y la exclusión mutua (excluir el acceso simultáneo).

Exportar a Hojas de cálculo
2. UndefinedFunction_300dc8d0: Чтение с Повторами (Высокий Уровень)
2. UndefinedFunction_300dc8d0: Lectura de repetición (alta)
Эта функция использует низкоуровневый драйвер для выполнения критической операции чтения с добавлением механизма устойчивости к сбоям.
Esta característica usa un controlador de bajo nivel para realizar una operación de lectura crítica con la adición de un mecanismo de tolerancia a errores.

Аспект  Aspecto   Детали Анализа  Detalles del análisis   Значимость в Embedded Systems
Importancia en los sistemas integrados
Цель  Propósito   Чтение 4 байтов из фиксированной ячейки памяти (DAT_300dc988) для получения важного значения (напр., magic number, счётчик, конфигурация).
Lectura 4 de bytes de una ubicación de memoria fija (DAT_300dc988) para obtener un valor importante (por ejemplo, número mágico, contador, configuración).   Гарантия целостности данных. Ценность значения важнее скорости.
Garantía de integridad de los datos. El valor del valor es más importante que la velocidad.
Механизм Устойчивости  Mecanismo de estabilidad   Цикл 11 повторов. При неудаче (возврат

=−1) выполняется задержка 100 единиц времени (FUN_300de844(100)), после чего предпринимается новая попытка.
11 Ciclo de repetición. Si falla (retorno

=−1 ), las unidades de tiempo 100 se retrasan (FUN_300de844(100)) y luego se realiza un nuevo intento.   Толерантность к временным сбоям (transient faults), характерным для Flash-памяти или шины данных (например, из-за шума, сбоев питания или процесса внутреннего выравнивания заряда).
Tolerancia a fallas transitorias específicas de la memoria Flash o el bus de datos (por ejemplo, debido a ruido, fallas de energía o equilibrio de carga interno).
Управление Ресурсами  Gestión de recursos   Чёткая последовательность: Инициализация (Init), Картирование (Map), Работа (Work), Очистка (Cleanup).
Secuencia clara: Inicialización ( Init ), Asignación ( Map ), Trabajo ( Work ), Limpieza ( Cleanup ).   Безопасность. Гарантирует, что доступ к памяти правильно настроен до чтения и ресурсы освобождаются после него.
Seguridad. Garantiza que el acceso a la memoria esté configurado correctamente antes de la lectura y que los recursos se liberen después de la lectura.

Exportar a Hojas de cálculo
Вывод  Inferencia
Анализируемый код демонстрирует высокий уровень инженерной подготовки в области встроенных систем. Он сочетает сложную низкоуровневую логику, учитывающую физические ограничения аппаратного обеспечения (выравнивание, разбиение на части), с высокоуровневой логикой устойчивости к сбоям (циклы повторов и задержки). Такой подход необходим для обеспечения надёжности и долговечности систем, использующих Flash-память, где ошибки чтения, вызванные утечкой заряда или помехами, являются обычным явлением.
El código analizado demuestra un alto nivel de experiencia en ingeniería en el campo de los sistemas integrados. Combina una lógica compleja de bajo nivel que tiene en cuenta las limitaciones físicas del hardware (alineación, división) con una lógica de tolerancia a errores de alto nivel (bucles de reintento y retrasos). Este enfoque es necesario para garantizar la fiabilidad y durabilidad de los sistemas que utilizan memoria Flash, donde los errores de lectura causados por fugas de carga o interferencias son comunes.

Видео по ссылке объясняет концепцию встроенной Flash-памяти и роль, которую играют задержки и специальные операции в её работе. Embedded Flash Memory
El video en el enlace explica el concepto de memoria Flash integrada y el papel que juegan los retrasos y las operaciones especiales en su funcionamiento. Memoria flash integrada