IPC
IPC共用函数_ipc_object_init 初始化挂起链表 rt_susp_list_enqueue RT_IPC_FLAG_FIFO 将线程插入到链表尾部 RT_IPC_FLAG_PRIO 将线程插入到链表中,按照优先级排序 信号量 用于同步,资源计数;一对一场合,一对多使用事件同步 获取&&阻塞 信号值>0,信号量减1,返回OK 信号值=0,线程挂起,等待信号量变为非0 若有超时时间,则设置超时时间,否则一直等待 超时时间将启动线程定时器,超时后,线程从挂起链表中移除,插入就绪链表中 不可在中断中阻塞 释放&&唤醒 挂起链表中有线程,将第一个线程从挂起链表中出队;线程需要调度 无线程挂起,信号量加1 可以在中断中释放信号量 互斥量 使用信号量会导致的另一个潜在问题是线程优先级翻转问题。所谓优先级翻转,即当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻...
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...
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() 发送软中断信号。 收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类: 第一种是类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。 第二种方法是,忽略某个信号,对该信号不做任何处...
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 卡默认只...
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的配置只有...
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))...
dataqueue
dataqueue消息队列:消息队列能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息队列是一种异步的通信方式。(摘自 RT-Thread文档中心). 数据队列:没有找到官方详细的说明,只是在 RT-Thread API参考手册,有介绍。数据队列能够接收来自线程中不固定长度的数据,数据 不会 缓存在自己的内存空间中,自己的内存空间只有一个指向这包数据的指针。其他线程也能够从数据队列获取数据,当数据队列为空的时候,可以挂起线程。当有新的数据到达时,挂起的线程将被唤醒以接收并处理消息。数据队列是一种异步的通信方式。 消息队列 是用于线程消息传递的,属于线程间同步异步 IPC;消息队列在 recv 数据之后,这组数据就没了。 数据队列 更多的使用在流式数据传递,属于线程间通信 IPC;数据队列可以使用 peak 的方式 舔一下 这组数据不会丢失。自带高、低水位,可以对锯齿速度(压入数据的间隔不一致,时快时慢的)情...
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 ...