condvar
condvar条件变量是一种线程间同步的机制,它可以让一个线程等待另一个线程满足某个条件。条件变量是与互斥量配合使用的,互斥量用于保护共享数据,条件变量用于等待某个条件的发生。 初始化123456789//初始化等待队列rt_wqueue_init(&cv->event);rt_atomic_store(&cv->waiters_cnt, 0);rt_atomic_store(&cv->waiting_mtx, 0); 等待12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182intrt_condvar_timedwait(rt_condvar_tcv, rt_mutex_tmtx, intsuspend_flag, rt_tick_tt...
fal
fal flash抽象层-FAL_FLASH_DEV_TABLE设备表挂载不同flash设备 -FAL_PART_TABLE分区表对同一个flash挂载不同分区 -blocks 对不同颗粒度的flash进行分块 初始化 执行 fal_init -FAL_FLASH_DEV_TABLE注册flash设备 fal_flash_init 遍历注册表信息,执行flash初始化,与block分割 fal_partition_init 使用ROM保存分区表,每次查询并挂钩 FAL_PART_TABLE分区表 使用FLASH保存分区表,仅需读取 加载分区表,读取分区信息 检查flash设备是否都存在 注册设备 注册块设备, 或字符串设备,或MTD nor设备 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162struct rt_mtd_nor_device{ struct rt_d...
USB
USBUSB2.0枚举与配置 设备被连接到 USB 端口上,并得到检测。 集线器通过监控端口的电压来检测设备。集线器的 D+线和 D-线上带有下拉电阻,根据设备的速度,D+或 D-线上会带有上拉电阻。通过监控这些线上的电压变换,集线器检测设备是否得到连接。 这部分具体IAD描述符的参考<<iadclasscode_r10.pdf>> 2节 IAD Use Model Example 具体枚举配置过程,wireshark抓包不够准确,可以通过打印日志查看 方向分为设备到主机和主机到设备;意思是收到请求后执行的方向 请求类型:Standard Device Request 方向:设备到主机 请求:GET_DESCRIPTOR wValue 描述符类型 :1 (设备描述符) 描述符索引: 0 (第一个描述符) wIndex字段为字符串描述符指定语言ID 12[80 06 00 01 00 00 12 00][23:29:12 571]Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0...
fatfs
fatfs 因此应用程序应尽可能以大块的形式写入数据。理想的写入块大小和对齐方式是扇区大小,簇大小最好。当然,应用程序和存储设备之间的所有层都必须考虑多扇区写入,但大多数开源存储卡驱动程序都缺乏这一点。不要将多扇区写入请求拆分为单扇区写入事务,否则写入吞吐量会变差。 努力实现扇区对齐的读/写访问可以消除缓冲数据传输,从而提高读/写性能。除此之外,在 tiny 配置下,缓存的 FAT 数据不会被文件数据传输刷新,因此它可以以较小的内存占用实现与非 tiny 配置相同的性能。 如果由于意外故障(例如突然断电、错误移除介质和不可恢复的磁盘错误)而中断对 FAT 卷的写入操作,则卷上的 FAT 结构可能会被破坏。为了最大限度地降低数据丢失的风险,可以通过最小化以写入模式打开文件的时间或使用f_sync函数来最小化临界区 FatFs 模块不支持对文件的重复打开的读写冲突控制。仅当对文件的每种打开方式都是读取模式时才允许重复打开。始终禁止对文件进行一次或多次写入模式的重复打开,并且打开的文件不得重命名或删除。违反这些规则可能会导致数据冲突。 文件系统操作mkfs 格式化...
FINSH模块
FINSH模块MSH初始化 根据链接脚本指明FINSH使用内存空间 _syscall_table_begin _syscall_table_end的地址 FSymtab段1234. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .; __fsymtab_start和 __fsymtab_end用于指明finsh使用内存 FSymTab用于存放所有注册命令的结构体 struct finsh_syscall,包括命令名称,命令选项,命令描述,命令函数执行地址信息 宏12345678910111213141516171819202122232425262728293031/** * @ingroup msh * * This macro exports a command to module shell. * * @param command is the name of the command. * @param desc is the description of the command, wh...
构建
[toc] art-pi构建命令123456789101112131415export CROSS_COMPILE=arm-none-eabi- ARCH=armmake stm32h750-art-pi_defconfigmake menuconfig > Boot options (console=ttySTM0,115200 root=/dev/ram loglevel=8) Boot arguments > Device Drivers > Serial drivers (115200) Default baudrateu-boot-v2021.07\arch\arm\dts\stm32h750i-art-pi.dts chosen { bootargs = "root=/dev/ram"; stdout-path = "serial0:2000000n8"; }; chosen { b...
Bison_Flex
[TOC] Flex(Fast Lexical Analyzer Generator) 于生成词法分析器的工具 词法分析器用于将输入文本分解成标记(tokens),这些标记是语法分析器(如由 Bison 生成的解析器)所使用的基本单位。Flex 是 Lex 的一个改进版本,广泛用于编译器和解释器的开发中。 Flex 的作用 生成词法分析器 : Flex 从一个词法规则文件(通常以 .l 为扩展名)生成一个 C 语言的词法分析器源代码文件(通常是 lex.yy.c)。 词法分析器读取输入文本,并根据定义的词法规则将其分解成标记。 处理输入文本 : 词法分析器扫描输入文本,识别出符合词法规则的模式,并将其转换为标记。 每个标记可以包含类型和语义值,供语法分析器使用。 Flex 文件的格式 Flex 文件通常以 .l 为扩展名,包含词法规则和动作代码。以下是一个典型的 Flex 文件的结构: Bison 是一个广泛使用的解析器生成器工具,用于从上下文无关文法(Context-Free Grammar,CFG)生成语法解析器。它通常用于编译器和解释器的开发中,用来解析编...
GNU_C
[TOC] 编译器特性 && 选项__va_arg_pack 用于处理可变参数函数__va_arg_pack_len 用于获取可变参数的数量__fortify_function 用于启用额外的安全检查,以防止常见的编程错误,如缓冲区溢出__LEAF 告诉编译器,该函数是一个叶函数(leaf function),即它不会调用其他函数 叶函数的属性允许编译器进行进一步的优化,例如减少函数调用的开销和栈空间的使用。 __error__ 属性告诉编译器,如果该函数被调用,则会触发编译错误,并输出指定的错误消息 msg12# define __errordecl(name, msg) \ extern void name (void) __attribute__((__error__ (msg))) __builtin_constant_p 检查 参数 是否为编译时常量__attribute_malloc__ 用于标记函数返回一个新分配的内存块 这有助于编译器进行优化,例如避免不必要的内存检查。 __attribute_alloc_size__ 用于指定分配的内存大...
Makefile
[TOC] 执行 输入make命令,执行Makefile文件中的第一个目标。如果没有指定目标,则执行Makefile文件中的第一个目标。 在 Makefile 中,如果你运行 make 而不带任何参数,make 将默认执行第一个目标。如果第一个目标是 __build,那么运行 make 将等同于执行 make __build.在 Makefile 中,第一个出现的目标通常被视为默认目标。如果你运行 make 而不带任何参数,make 将执行这个默认目标。 $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;这条语句定义了一个目标,它包含两个文件:$(KCONFIG_CONFIG) 和 auto.conf.cmd。当这两个文件被调用时,执行一个空命令;这意味着这两个文件是一起作为一个目标的,只有在这两个文件都存在时,才会执行空命令 语法ifeq && ifneq 条件语句 ifeq 比较两个条件(条件1 和 条件2)。 如果两个条件相等,则执行 ifeq 块中的代码。 如果两个条件不相等,并且存在 else 块,则...
scripts
[TOC] scripts 用于构建脚本的工具 参考UBOOT全部目标的编译过程详解 scripts_basic 用于构建基本脚本的工具参考 uboot 和 Linux kernel 的主 Makefile 里面,都有下面这段话: 1234PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) $(build)=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount 展开后就是: 1make -f ./scripts/Makefile.build obj=scripts/basic $(build)的展开主 Makefile 里面,有一个非常重要的 include: 1include scripts/Kbuild.include 这是一个头文件,相当于把 Kbuild.include 的内容直接写到主 Makefile 里。Kbuild.include 代码片段: 12345#### Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj...