I2C驱动
I2C驱动 https://www.i2c-bus.org/i2c-primer/termination-versus-capacitance/ 硬件电路 I2C 总线使用 SDA 和 SCL 传输数据和时钟。首先要意识到:SDA 和 SCL 是开漏(在 TTL 世界中也称为开集),也就是说 I2C 主设备和从设备只能将这些线路驱动为低电平或保持开路。如果没有 I2C 设备将其拉低,终端电阻Rp 会将线路拉高至 Vcc。这允许同时操作多个 I2C 主设备(如果它们具有**多主设备功能)或拉伸(从设备可以通过按住 SCL 来减慢通信速度)等功能。 终端电阻 Rp 与线路电容 Cp 一起影响 SDA 和 SCL 上信号的时间行为。虽然 I2C 设备使用开漏驱动器或 FET 拉低线路(通常可以驱动至少约 10mA 或更多),但上拉电阻 Rp 负责将信号恢复到高电平。Rp 通常在 1 kΩ 至 10 kΩ 之间,导致典型的上拉电流约为 1 mA 或更小。这就是 I2C 信号具有锯齿状外观的原因。事实上,每个“齿”在上升沿显示线路的充电特性,在下降沿显示放电特性。 SDA(上)和 SC...
IDLE线程
IDLE线程 cleanup 会在线程退出时,被空闲线程回调一次以执行用户设置的清理现场等工作。 defunct流程 rt_thread_defunct_enqueue 将退出线程和分离线程插入到defunct链表中 IDLE线程会在空闲时,执行defunct链表中的线程,将线程节点从链表中移除 从对象容器中移除线程对象 执行线程清除函数,释放线程控制块
IPC
IPC共用函数_ipc_object_init 初始化挂起链表 rt_susp_list_enqueue RT_IPC_FLAG_FIFO 将线程插入到链表尾部 RT_IPC_FLAG_PRIO 将线程插入到链表中,按照优先级排序 信号量 用于同步,资源计数;一对一场合,一对多使用事件同步 获取&&阻塞 信号值>0,信号量减1,返回OK 信号值=0,线程挂起,等待信号量变为非0 若有超时时间,则设置超时时间,否则一直等待 超时时间将启动线程定时器,超时后,线程从挂起链表中移除,插入就绪链表中 不可在中断中阻塞 释放&&唤醒 挂起链表中有线程,将第一个线程从挂起链表中出队;线程需要调度 无线程挂起,信号量加1 可以在中断中释放信号量 互斥量 使用信号量会导致的另一个潜在问题是线程优先级翻转问题。所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻...
PM电源管理
PM电源管理初始化drv_pm_hw_init -> rt_system_pm_init 1234567891011121314/* initialize timer mask */timer_mask = 1UL << PM_SLEEP_MODE_DEEP;/* when system power on, set default sleep modes */pm->modes[pm->sleep_mode] = 1;pm->module_status[PM_POWER_ID].req_status = 1;pm->run_mode = RT_PM_DEFAULT_RUN_MODE; pm设备注册12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182/** * Register a...
RT-LINK
RT-LINKservice attach&detach1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283struct rt_link_service{ rt_int32_t timeout_tx; void (*send_cb)(struct rt_link_service *service, void *buffer); void (*recv_cb)(struct rt_link_service *service, void *data, rt_size_t size); void *user_data; rt_uint8_t flag; /* Whether to use the CRC and ACK */ rt_link_servic...
RTC
RTCRTC驱动1.rt_hw_rtc_register注册RTC设备 实现RTC设备的操作函数 提供控制命令 12345678910111213141516171819202122232425262728293031323334353637case RT_DEVICE_CTRL_RTC_GET_TIME: ret = TRY_DO_RTC_FUNC(rtc_device, get_secs, args); break;case RT_DEVICE_CTRL_RTC_SET_TIME: ret = TRY_DO_RTC_FUNC(rtc_device, set_secs, args); break;case RT_DEVICE_CTRL_RTC_GET_TIMEVAL: ret = TRY_DO_RTC_FUNC(rtc_device, get_timeval, args); break;case RT_DEVICE_CTRL_RTC_SET_TIMEVAL: ret = TRY_DO_RTC_FUNC(rtc_device, set...
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() 发送软中断信号。 收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类: 第一种是类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。 第二种方法是,忽略某个信号,对该信号不做任何处...
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的配置只有...







