Pensei por um longo tempo se é possível republicar um artigo sobre Habré, estudei as regras, parece que agora não é proibido. Se eu cometer um erro, vou corrigi-lo :)
Assim...
Há algum tempo, escrevi o código de firmware para os Epiphan grabbers da linha AV.io:
- AV.io HD - nosso piloto, no qual muita coisa foi depurada e formada arquitetura
- AV.io SDI - fixando posições
- AV.io 4K - novo hardware e novas abordagens, agora lançamos quase instantaneamente
- KVM2USB 3.0 - Um profundo repensar do AV.io HD . De fato, graças ao potencial de modernização do modelo básico, praticamente sem modificações de hardware, eles conseguiram criar um novo produto apenas com software.
O Cypress FX3 estava envolvido lá , e o SDK foi construído sobre o ThreadX. Você pode usar o Olimex ARM-USB-OCD-H em conjunto com o OpenOCD como um depurador JTAG . Infelizmente, o OpenOCD não sabe nada sobre threads no RTOS e, embora o suporte básico esteja presente no código, especificamente para o nosso processador, usamos um esquema de empilhamento de registros que era diferente do que já havia sido implementado. Eu tive que entender e modificar . Os lucros do uso do JTAG para desenvolvimento dificilmente podem ser superestimados, pelo menos no caso de trabalho distribuído .
Então o tempo está acabando. Agora é a vez do FPG do Xilinx e seu processador de software MicroBlaze, onde você pode executar a versão 10.x do FreeRTOS portada. Mas o problema é exatamente o mesmo: não há suporte para threads no depurador!
XSDK
Xilinx ARM Cortex-A53, ARM Cortex-R5 MicroBlaze. MicroBlaze — , FPGA. .
( CPU, FPGA, — Vivado) — XSDK ( 2020 Vitis), Eclipse. FPGA . , JTAG ( OpenOCD!) , . : , , .
, Eclipse, , — XSTC. . .
.
JTAG hw_server
. TCP , — 3121, , , 3000 — GDB :
N+0
(3000) — ARM Cortex-A53N+1
(3001) — ARM Cortex-R5N+2
(3002) — MicroBlaze ( )
-, .
, . , . , ( !) — System Debugger GDB. MicroBlaze GDB — mb-gdb
.
System Debugger . , Xilinx GDB — .
,
, RTOS OpenOCD, , , :
- RTOS TCB (Thread Control Block), , . . ( ) — Reverse Engineering! : , , .
- RTOS — . , , . , , — . .. . — .
- 1 — TCB ( — RTOS).
, GDB GDB , info threads
info registers
thread N
bt
.
, RTOS , , RTOS ( , SDK , ). , .
: . . p
, , . , ThreadX Cypress FX3. , . — .
… GDB-client GDB-server , , , MitM ""? , , , , ?
, : . gdbproxy , .
— . C++ ( , , ), Asio, C++17 , , C++2a — , , , 100%, 90% !
,
, — . . Asio , . . .
: . TCB, . … GDB- . . … ! — . , , ( — ) : qSymbol::
, : - ? — . — , . qSymbol:NAME
, qSymbol:ADDR:NAME
qSymbol::NAME
, nullptr
. - ( , — ) , .
. , , , , — … , !
.. , .
, : , . .
, . . (SMP , ) — . GDB ( ) — : . .
, GDB-client . , . : - , - SP (Stack Pointer) FP (Frame Pointer) . , .
: Set Current Thread ( OK EXX — XX — , ), . RTOS, , , . , — . — Current Execution? : — . , . ! . Set Current Thread Set Current Thread , xxxxxxxx
, — ! , RTOS , Set Current Thread , Set Current Thread . : . .
, SP : TCB . SP , .
, . . Stop Reply Packets. , . , breakpoint, watchpoint Break ( , , 0x03 Stop Reply Packet). , , . Stop Reply Packet, . . Stop Reply Packets : vCont
c
— Continue s
— Step ( ).
. , , .
, , . : . — . GDB. MicroBlaze GDB microblaze-tdep.h
enum microblaze_regnum
:
enum microblaze_regnum
{
MICROBLAZE_R0_REGNUM,
MICROBLAZE_R1_REGNUM, MICROBLAZE_SP_REGNUM = MICROBLAZE_R1_REGNUM,
MICROBLAZE_R2_REGNUM,
MICROBLAZE_R3_REGNUM, MICROBLAZE_RETVAL_REGNUM = MICROBLAZE_R3_REGNUM,
MICROBLAZE_R4_REGNUM,
MICROBLAZE_R5_REGNUM, MICROBLAZE_FIRST_ARGREG = MICROBLAZE_R5_REGNUM,
MICROBLAZE_R6_REGNUM,
MICROBLAZE_R7_REGNUM,
MICROBLAZE_R8_REGNUM,
MICROBLAZE_R9_REGNUM,
MICROBLAZE_R10_REGNUM, MICROBLAZE_LAST_ARGREG = MICROBLAZE_R10_REGNUM,
MICROBLAZE_R11_REGNUM,
MICROBLAZE_R12_REGNUM,
MICROBLAZE_R13_REGNUM,
MICROBLAZE_R14_REGNUM,
MICROBLAZE_R15_REGNUM,
MICROBLAZE_R16_REGNUM,
MICROBLAZE_R17_REGNUM,
MICROBLAZE_R18_REGNUM,
MICROBLAZE_R19_REGNUM,
MICROBLAZE_R20_REGNUM,
MICROBLAZE_R21_REGNUM,
MICROBLAZE_R22_REGNUM,
MICROBLAZE_R23_REGNUM,
MICROBLAZE_R24_REGNUM,
MICROBLAZE_R25_REGNUM,
MICROBLAZE_R26_REGNUM,
MICROBLAZE_R27_REGNUM,
MICROBLAZE_R28_REGNUM,
MICROBLAZE_R29_REGNUM,
MICROBLAZE_R30_REGNUM,
MICROBLAZE_R31_REGNUM,
MICROBLAZE_PC_REGNUM,
MICROBLAZE_MSR_REGNUM,
MICROBLAZE_EAR_REGNUM,
MICROBLAZE_ESR_REGNUM,
MICROBLAZE_FSR_REGNUM,
MICROBLAZE_BTR_REGNUM,
MICROBLAZE_PVR0_REGNUM,
MICROBLAZE_PVR1_REGNUM,
MICROBLAZE_PVR2_REGNUM,
MICROBLAZE_PVR3_REGNUM,
MICROBLAZE_PVR4_REGNUM,
MICROBLAZE_PVR5_REGNUM,
MICROBLAZE_PVR6_REGNUM,
MICROBLAZE_PVR7_REGNUM,
MICROBLAZE_PVR8_REGNUM,
MICROBLAZE_PVR9_REGNUM,
MICROBLAZE_PVR10_REGNUM,
MICROBLAZE_PVR11_REGNUM,
MICROBLAZE_REDR_REGNUM,
MICROBLAZE_RPID_REGNUM,
MICROBLAZE_RZPR_REGNUM,
MICROBLAZE_RTLBX_REGNUM,
MICROBLAZE_RTLBSX_REGNUM,
MICROBLAZE_RTLBLO_REGNUM,
MICROBLAZE_RTLBHI_REGNUM,
MICROBLAZE_SLR_REGNUM, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_SLR_REGNUM,
MICROBLAZE_SHR_REGNUM,
MICROBLAZE_NUM_REGS
};
, . - , , 00000000
xxxxxxxx
, — , — : unavail. — . , qFeatures
(TBD: !) , — .
, ?
: https://github.com/h4tr3d/gdbproxy/
, BSD MIT. OpenOCD (, : , , , ). .
: . , , RTOS, . . .
?
XSDK:
- — GDB , System Debugger
- GDB, 4002 (
gdbproxy
, ) gdbproxy
, XSDK hw_server
:
./gdbproxy --port 4002 --remote-host localhost --remote-port 3002 -- mb_freertos
- ...
- PROFIT!
No caso de usar o controle remoto hw_server
, devido à pequena flexibilidade da configuração do XSDK, ele gdbproxy
deve ser executado na mesma máquina que hw_server
.
achados
Nenhum. Apenas a linha inferior: é suportado o encadeamento no FreeRTOS e MicroBlaze.