export
exports.cjumptable_init malloc分配jt_funcs结构体,并将函数指针赋值给jt_funcs结构体 jt_funcs结构体中的函数指针是在_exports.h中定义的 这些函数在u-boot中是代码段中的函数,在u-boot中是通过函数指针调用的 jt跳转表包含指向导出函数的指针。指向跳转表将传递给独立应用程序。 123456789101112131415161718192021EXPORT_FUNC(get_version, unsigned long, get_version, void)EXPORT_FUNC(getchar, int, getc, void)EXPORT_FUNC(tstc, int, tstc, void)EXPORT_FUNC(putc, void, putc, const char)EXPORT_FUNC(puts, void, puts, const char *)struct jt_funcs {#define EXPORT_FUNC(impl, res, func, ...) res(*func)(__...
log
## common/log.c 暂不分析***
main
main.c123456789101112131415161718192021/* We come here after U-Boot is initialised and ready to process commands */void main_loop(void){ const char *s; bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop"); cli_init(); s = bootdelay_process(); //获取启动延迟时间 //从FDT中获取命令行参数 if (cli_process_fdt(&s)) //设置了bootsecure执行; //不使用命令行,避免被攻击 cli_secure_boot_cmd(s); //自动启动命令 autoboot_command(s); //命令行循环 cli_loop(); panic("No CLI available");}
console
common/console.cputs 输出字符串 暂不分析***
dmalloc
dlmalloc.cdlmalloc 是 Doug Lea 实现的一种动态内存分配器,广泛用于嵌入式系统和操作系统中。它以其高效和灵活的内存管理机制而著称。以下是 dlmalloc 的工作原理和关键概念: 内存池(Memory Pool)dlmalloc 使用一个或多个内存池来管理内存。内存池是由操作系统分配的一大块连续内存区域,dlmalloc 在这个区域内进行内存分配和释放操作。 空闲块和已分配块(Free and Allocated Blocks)内存池被分割成多个块,每个块可以是空闲的或已分配的。每个块都有一个头部(header),包含块的大小和状态(空闲或已分配)。 双向链表(Doubly Linked List)空闲块通过双向链表链接在一起。每个空闲块的头部包含指向前一个和后一个空闲块的指针。这使得 dlmalloc 可以高效地插入和删除空闲块。 分割和合并(Splitting and Coalescing)分割:当请求的内存大小小于某个空闲块的大小时,dlmalloc 会将这个空闲块分割成两个块,一个满足请求大小,另一个继续作为空闲块。合并:当释放一个块时,...
event
event.c event 声明事件类型12345678910//复杂事件声明#define EVENT_SPY_FULL(_type, _func) \ __used ll_entry_declare(struct evspy_info, _type ## _3_ ## _func, \ evspy_info) = _ESPY_REC(_type, _func)//简单事件声明#define EVENT_SPY_SIMPLE(_type, _func) \ __used ll_entry_declare(struct evspy_info_simple, \ _type ## _3_ ## _func, \ evspy_info) = _ESPY_REC_SIMPLE(_type, _func) notify_static 以静态方式通知事件12345678910111213141516171819202122232425262728293031323334static int notify_static(struct event *ev){ struct ...
arm
[TOC] Kconfig中断控制器GIC (Generic Interrupt Controller) 通用中断控制器 GIC 是 ARM 处理器的一种通用中断控制器,用于管理和分发中断信号。GIC 支持多种中断类型,包括外部中断、定时器中断、软件中断等。GIC 通过中断控制器和中断分配器组件实现中断的管理和分发。 GICv2 GICV2是 ARM 提供的第二版通用中断控制器,广泛应用于 ARMv7 和部分 ARMv8 架构的处理器中。 中断管理:支持多达 1020 个中断源,包括外部中断和内部中断。提供中断优先级管理和中断屏蔽功能。 分布式架构:包括一个分配器(Distributor)和多个 CPU 接口(CPU Interface),分配器负责中断的分发,CPU 接口负责中断的处理。 中断路由:支持将中断路由到特定的 CPU 或多个 CPU,提供灵活的中断处理机制。 软件生成中断:支持软件生成中断(SGI),允许处理器之间通过中断进行通信。 GICv3 GICV3 是 ARM 提供的第三版通用中断控制器,广泛应用于 ARMv8 架构的处理器中。 扩展的中断管理:支持多达...
assembly
[TOC] 声明.globl 声明全局符号 使其在链接过程中可以被其他文件引用 .long 用于定义一个32位的整数.type 声明符号类型 .type reset, %function指令指定reset是一个函数类型的符号 段定义与操作.section 用于定义代码段 通过使用 .section 指令,开发者可以明确地指定代码和数据在内存中的布局,从而更好地控制程序的结构和行为。 pushsection 用于定义代码段并且设置段属性 pushsection 指令用于定义一个新的代码段,并且可以设置段属性。它的语法如下: 1pushsection section_name, flags section_name 是新的代码段的名称。 flags 是段属性,可以是以下值之一: awx:表示代码段,可读、可写、可执行。 a:表示代码段,可读。 w:表示代码段,可写。 x:表示代码段,可执行。 .text 指定了代码段为 .text.macro 定义宏.macro 指令用于在汇编代码中定义一个宏。宏是一段可以重复使用的代码块,可以带有参数。定义宏后,可以在代码中多...
other
Technical Documents and ResourcesThis directory contains a collection of technical documents, datasheets, and reference manuals, primarily focused on ARM architecture and embedded systems design. File IndexHere is a brief description of each file in this collection: 05_Thumb.pdf A reference document detailing the ARM Thumb instruction set, which is a 16/32-bit instruction set designed for code density. 2792846233RV043056B0.pdf The datasheet for an RFID module, likely the RV-43-C56B ...
tmc5160
grblconfig Inc\my_machine.h中取消注释进行配置开启如下配置进行学习 12345678910111213141516171819202122#define BOARD_BTT_SKR_20 // F407 based 3D Printer board#define TRINAMIC_ENABLE 5160 // Trinamic TMC5160 stepper driver support.#define N_AXIS 6#define TRINAMIC_DYNAMIC_CURRENT#define TRINAMIC_EXTENDED_SETTINGS#define TRINAMIC_POLL_STATUS// 这些选项需要自行配置,不配做使用默认值#define TMC_DRVCONF#define TMC_COOLCONF_SEMIN#define TMC_COOLCONF_SEMAX#define TMC_COOLCONF_SEDN#define TMC_COOLCONF_SEUP#define TMC_COOLCONF_SE...








