RTT系统初始化
RTT系统初始化rtthread_startup 中断禁用 板级初始化 rt_hw_board_init I/D cache初始化 时钟初始化 外设时钟初始化 堆初始化 rt_system_heap_init 组件初始化 rt_components_board_init,初始化板级驱动 INIT_EXPORT1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/* * Components Initialization will initialize some driver and components as following * order: * rti_start --> 0 * BOARD_EXPORT --> 1 * rti_board_end --> 1.end * * DEVICE_EXPORT --> 2 * COMPONENT_EXPORT --> 3 * F...
SDMMC
SDMMC SD 协议 SD 卡系统定义了三种通信协议:SD , SPI 和 UHS-II。主机系统可以选择任意一种。当收到 reset 命令的时候,SD 卡通过主机的信息来决定 使用何种模式,并且之后的通讯都会使用相同的模式。不推荐多卡槽用共同的总线信号。一个单独的 SD 总线应该连接一个单独的 可移除的 SD 卡。UHS-II 支持多个器件通过环形(Ring)或 Hub 拓扑连接 在默认速度下,SD 卡总线有一个主(应用),多个从(卡),同步的星型拓扑结构(图 3-1)。时钟,电源和 地信号是所有卡都有的。在高速模式和 UHS-I 模式下,SD 卡总线有一个主机(应用)一个从(卡),同步的点对点拓扑。命令(CMD)和数据(DAT0-3)信号是根据每张卡的,提供连续地点对点连接到所有卡。 在初始化时,处理命令会单独发送到每个卡,允许应用程序检测卡以及分配逻辑地址给物理卡槽。数据总是单独发送(接收)到(从)每张卡。但是,为了简化卡的堆栈操作,在初始 化过 程结束后,所有的命令都是同时发送到所有卡。地址信息包含在命令包中。 SD 总线允许数据线的动态配置。上电后,SD 卡默认只...
SIGNAL
信号 SIGNAL 信号(又称为软中断信号),在软件层次上是对中断机制的一种模拟,在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在 RT-Thread 中用作异步通信,POSIX 标准定义了 sigset_t 类型来定义一个信号集,然而 sigset_t 类型在不同的系统可能有不同的定义方式,在 RT-Thread 中,将 sigset_t 定义成了 unsigned long 型,并命名为 rt_sigset_t,应用程序能够使用的信号为 SIGUSR1(10)和 SIGUSR2(12)。 信号本质是软中断,用来通知线程发生了异步事件,用做线程之间的异常通知、应急处理。一个线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到达,线程之间可以互相通过调用 rt_thread_kill() 发送软中断信号。 收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类: 第一种是类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。 第二种方法是,忽略某个信号,对该信号不做任何处...
ULOG
ULOG 标准输出 过滤功能 异步输出 颜色功能 后端支持 标准输出初始化12345678910111213intulog_init(void){ rt_mutex_init(&ulog.output_locker, "ulog", RT_IPC_FLAG_PRIO); ulog.output_lock_enabled = RT_TRUE; return0;} ulog_output 根据当前是否在中断中,判断使用的缓冲区 上锁(线程环境互斥量,中断环境关闭中断,未初始化互斥量时使用 ulog_voutput_recursion) 3.ulog_voutput_recursion递归输出 1234567891011121314151617181920212223/* If there is a recursion, we use a simple way */if ((ulog_voutput_recursion == RT_TRUE) && (hex_buf == RT_NULL))...
SPI驱动
SPI驱动SPI原理 https://www.circuitbasics.com/basics-of-the-spi-communication-protocol/ https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all SPI设备驱动初始化1.rt_spi_bus_register注册 SPI BUS设备,并且初始化互斥量 1.rt_spi_bus_attach_device_cspin 调用 rt_spidev_device_init注册 SPI DEV设备 初始化CS引脚 配置SPI设备,互斥量加锁保护 rt_spi_transfer_message 传输任意消息 互斥量加锁保护 总线设备不是当前设备,则切换设备,并且重新配置SPI总线 SPI需要明确当前操作的设备是什么,并且需要重新配置SPI总线,因为SPI一次只能操作一个设备,所以设备可以是不同的配置信息;SPI的配置可以有相位和极性,速率等 I2C总线不需要重新配置,因为I2C总线是共享的;I2C的配置只有...
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...
completion
completion completion 可以称之为完成量,是一种轻量级的线程间(IPC)同步机制 完成量和信号量对比 信号量是一种非常灵活的同步方式,可以运用在多种场合中。形成锁、同步、资源计数等关系,也能方便的用于线程与线程、中断与线程间的同步中。 完成量,是一种更加轻型的线程间同步的一种实现,可以理解为轻量级的二值信号,可以用于线程和线程间同步,也可以用于线程和中断之间的同步。 完成量不支持在某个线程中调用 rt_completion_wait,还未唤醒退出时,在另一个线程中调用该函数。 注意:当完成量应用于线程和中断之间的同步时,中断函数中只能调用 rt_completion_done 接口,而不能调用 rt_completion_wait 接口,因为 wait 接口是阻塞型接口,不可以在中断函数中调用 12345678910111213141516171819202122232425262728/** * Completion - A tiny & rapid IPC primitive for resource-constrained scenarios ...
dataqueue
dataqueue消息队列:消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。(摘自 RT-Thread文档中心). 数据队列:没有找到官方详细的说明,只是在 RT-Thread API参考手册,有介绍。数据队列能够接收来自线程中不固定长度的数据,数据 不会 缓存在自己的内存空间中,自己的内存空间只有一个指向这包数据的指针。其他线程也能够从数据队列获取数据,当数据队列为空的时候,可以挂起线程。当有新的数据到达时,挂起的线程将被唤醒以接收并处理消息。数据队列是一种异步的通信方式。 消息队列 是用于线程消息传递的,属于线程间同步异步 IPC;消息队列在 recv 数据之后,这组数据就没了。 数据队列 更多的使用在流式数据传递,属于线程间通信 IPC;数据队列可以使用 peak 的方式 舔一下 这组数据不会丢失。自带高、低水位,可以对锯齿速度(压入数据的间隔不一致,时快时慢的)情...
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...
fatfs
fatfs 因此应用程序应尽可能以大块的形式写入数据。理想的写入块大小和对齐方式是扇区大小,簇大小最好。当然,应用程序和存储设备之间的所有层都必须考虑多扇区写入,但大多数开源存储卡驱动程序都缺乏这一点。不要将多扇区写入请求拆分为单扇区写入事务,否则写入吞吐量会变差。 努力实现扇区对齐的读/写访问可以消除缓冲数据传输,从而提高读/写性能。除此之外,在 tiny 配置下,缓存的 FAT 数据不会被文件数据传输刷新,因此它可以以较小的内存占用实现与非 tiny 配置相同的性能。 如果由于意外故障(例如突然断电、错误移除介质和不可恢复的磁盘错误)而中断对 FAT 卷的写入操作,则卷上的 FAT 结构可能会被破坏。为了最大限度地降低数据丢失的风险,可以通过最小化以写入模式打开文件的时间或使用f_sync函数来最小化临界区 FatFs 模块不支持对文件的重复打开的读写冲突控制。仅当对文件的每种打开方式都是读取模式时才允许重复打开。始终禁止对文件进行一次或多次写入模式的重复打开,并且打开的文件不得重命名或删除。违反这些规则可能会导致数据冲突。 文件系统操作mkfs 格式化...








