map文件分析
map文件分析1234567891011121314151617181920212223242526272829303132333435363738394041424344454647Image$$ER_IROM1$$Base 0x90000000 Number 0 anon$$obj.o ABSOLUTE__Vectors 0x90000000 Data 4 startup_stm32h750xx.o(RESET)__Vectors_End 0x90000298 Data 0 startup_stm32h750xx.o(RESET)__main 0x90000299 Thumb Code 0 entry.o(.ARM.Collect$$$$00000000)_main_st...
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. 工作队列...
pipe
pipepipe: 匿名管道。pipe 是一种 IPC 机制,他的作用是用作有血缘进程间完成数据传递,只能从一端写入,从另外一端读出。为了解决 pipe 的弊端,linux 又引入了 mkfifo(实名管道)。 创建管道12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455rt_pipe_t *rt_pipe_create(constchar *name, intbufsz){ //分配管道内存,初始化锁,初始化等待队列,初始化条件变量 rt_mutex_init(&pipe->lock, name, RT_IPC_FLAG_FIFO); rt_wqueue_init(&pipe->reader_queue); rt_wqueue_init(&pipe->writer_queue); rt_condvar_init(&pipe->waitf...
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 遍历链表,找到具...
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"...
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...
内存管理
内存管理https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/memory/memory 初始化1.rt_system_heap_init 对堆开始地址与结束地址进行内存对齐 在ART-PI中将所有剩余ROM划分给堆使用 断言堆设置是否正常 根据配置的内存策略 使用 _MEM_INIT 初始化多线程争用锁 小内存管理算法 小内存算法在分配内存的时候,随着内存碎片的增多,分配速度会越来越慢,当总的内存太大的时候,内存碎片的数量可能会更多,此时这种算法就会变得不再适用。 小内存管理算法主要针对系统资源比较少,一般用于小于 2MB 内存空间的系统 每个内存对象的起始12字节不可使用,设置为堆系统的配置 1234567891011121314151617//这是一个掩码,用于将内存地址的最低位清零。在 RTT 的内存管理中,内存块的地址的最低位被用作标记该内存块是否被使用。#define MEM_MASK 0xffff...






