RT-Thread 学习笔记
RT-Thread 学习笔记 其他资料 1.1. fatfs 1.1.1. fatfs.md 2. ARM指针寄存器.md 3. CAN驱动.md 4. completion.md 5. condvar.md 6. dataqueue.md 7. DFS.md 8. fal.md 9. fatfs.md 10. FINSH模块.md 11. I2C驱动.md 12. IDLE线程.md 13. IPC.md 14. littlefs.md 15. map文件分析.md 16. pipe.md 17. PM电源管理.md 18. readme.md 19. ringblock.md 20. ringbuffer.md 21. romfs.md 22. RTC.md 23. RT-LINK.md 24. RTT系统初始化.md 25. SDMMC.md 26. SIGNAL.md 27. SPI驱动.md 28. tmpfs.md 29. ULOG.md 30. USB.md 31. waitqueue.md 32. 串口驱动.md 33. 调度.md 34. 工作队列...
ringbuffer
ringbuffer buffer_ptr 是指向缓冲区的指针,buffer_size 是缓冲区的大小,read_index 是读索引,write_index 是写索引,而 read_mirror 和 write_mirror 可以理解为一种镜像值,每次向缓冲区写入数据,碰到缓冲区末尾时,切换到另一个镜像的缓冲区头部写入剩余数据。这种镜像操作可用于判断缓冲区内数据是满还是空。 等于是把缓冲区回绕了看做为另一个缓冲区,通过镜像值来判断缓冲区的状态,当前读写指针是否进入到另一个缓冲区中; 当 write_index == read_index 且 read_mirror == write_mirror 时,缓冲区内数据为空。 当 write_index == read_index 且 read_mirror != write_mirror 时,缓冲区内数据已满。 若是没有上述镜像值,我们就没有办法区分缓冲区空和缓冲区满这两种情况。 注意:RT-Thread 的 ringbuffer 组件并未提供线程阻塞的功...
romfs
romfsRomFS 是在嵌入式设备上常用的一种文件系统,具备体积小,可靠性高,读取速度快等优点,常用来作为系统初始文件系统。但也具有其局限性,RomFS 是一种只读文件系统。 不同的数据存储方式对文件系统占用空间,读写效率,查找速度等主要性能影响极大。RomFS 使用顺序存储方式,所有数据都是顺序存放的。因此 RomFS 中的数据一旦确定就无法修改,这是 RomFS 是一种只读文件系统的原因。也由于这种顺序存放策略,RomFS 中每个文件的数据都能连续存放,读取过程中只需要一次寻址操作,就可以读入整块数据,因此 RomFS 中读取数据效率很高。 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id=%e4%bd%bf%e7%94%a8-romfs 文件系统操作mount 挂载123dfs_mount(RT_NULL, "/", "rom"...
ringblock
环形缓冲块 ringblock环形块状缓冲区简称为:rbb。与传统的环形缓冲区不同的是,rbb 是一个由很多不定长度的块组成的环形缓冲区,而传统的环形缓冲区是由很多个单字节的 char 组成。rbb 支持 零字节拷贝 。所以 rbb 非常适合用于生产者顺序 put 数据块,消费者顺序 get 数据块的场景,例如:DMA 传输,通信帧的接收与发送等等 ringblk: 是由 多个不同长度 的 block 组成的,ringbuff : 是由单字节的数据组成的。ringblk 每一个 block 有多少个字节可以由用户自己设定。 ringblk 支持零字节拷贝(不需要额外的 memcpy 操作)。所以 rbb 非常适合用于生产者顺序 put 数据块,消费者顺序 get 数据块的场景,例如:DMA 传输,通信帧的接收与发送等等。 初始化 初始化块链表和释放链表 对每一个块链表进行初始化,并插入到释放链表中 PUT & GET 块 put 123block->status = RT_RBB_BLK_PUT; get 判断块链表为空,则返回NULL 遍历链表,找到具...
tmpfs
tmpfs 它不能格式化,可以同时创建多个,在创建时可以指定其最大能使用的内存大小。其优点是读写速度很快,但存在掉电丢失的风险。如果一个进程的性能瓶颈是硬盘的读写,那么可以考虑在tmpfs 上进行大文件的读写操作。 比如在linux中,有个叫sysfs也是属于ramfs类型得,通过文件得形式来实时反映系统驱动、设备等状态,甚至可以直接对其进行操作。而这些驱动、设备运行状态只有在运行的时候看才有意义.并且以文件的形式来查看,使得交互方式很方便。所以在linux中,有“一切皆文件”的说法。 临时文件系统,不存储在硬盘上,存储在内存中;掉电后数据丢失 文件结构和DFS相同;用文件方式统一目录和文件对象; 文件具有同级链表和子节点链表进行关联文件结构 文件系统操作mount 挂载1234567891011121314151617/* romfs 挂载在 / 下 *//* fatfs 挂载在 /mnt 下 *//* tmpfs 挂载在 /mnt/tmp 下 */if (dfs_mount(RT_NULL, "/mnt/tmp", "tmp", 0,...
waitqueue
waitqueue初始化12345678910111213rt_inline voidrt_wqueue_init(rt_wqueue_t *queue){ RT_ASSERT(queue != RT_NULL); queue->flag = RT_WQ_FLAG_CLEAN; // 将队列设置为可插入状态 rt_list_init(&(queue->waiting_list)); // 初始化链表节点} 加入队列线程加入队列有两种方式: 阻塞式加入:这种方式类似于信号量的用法,当参数condition为 0 时,线程会被阻塞,并将含有线程信息的等待节点加入到等待队列中。 123intrt_wqueue_wait(rt_wqueue_t *queue, intcondition, intmsec) 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484...
串口驱动
串口驱动1.rt_hw_usart_init中调用 rt_hw_serial_register注册串口设备 123456789101112131415161718192021222324252627282930313233343536intrt_hw_usart_init(void)for (rt_size_t i = 0; i < sizeof(uart_obj) / sizeof(struct stm32_uart); i++){ /* init UART object */ uart_obj[i].config = &uart_config[i]; uart_obj[i].serial.ops = &stm32_uart_ops; uart_obj[i].serial.config = config; /* register UART device */ result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config...
宏
宏编译警告宏1234/* compile time assertion */#define RT_STATIC_ASSERT(name, expn) typedef char _static_assert_##name[(expn)?1:-1]expn:判断条件;当条件不满足时;数组的长度初始化为-1,即编译报错; 用#waring 编译判断更为合理 宏过载123456789101112131415#define __MSH_GET_MACRO(_1, _2, _3, _FUN, ...) _FUN/** * @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, which will show in help list. * @param opt This is an option, enter any conten...
工作队列
工作队列工作队列内部有一个工作链表(worklist),链表上有多个工作项(work item)节点,我们可以将工作项简单理解为函数,因此工作链表上就存储着一系列待执行的函数。而且工作队列内有个线程一直在轮询工作链表,每次都从工作链表中取出一个工作项,并执行其相关联的函数。当工作队列为空时,线程会被挂起。 1234567891011121314151617181920212223242526272829303132333435363738394041424344/* workqueue implementation */struct rt_workqueue{ rt_list_t work_list; rt_list_t delayed_list; struct rt_work *work_current; /* current work */ struct rt_semaphore sem; rt_thread_t work_thread; struct rt_spinlock spinlock;}...
数据结构
数据结构 二叉搜索树、B树、B+树、AVL树、红黑树 树堆(Treap)和红黑树(RB-Tree)各有哪些优劣?








