
RTOS
文章平均质量分 72
HHHHHHCS
小白一枚,学习中,有问题请指出
展开
-
RT-Thread源码-9-内存堆剖析
前言本次主要介绍RT-Thread中另一种内存管理方式,内存堆。相对于内存池来说,内存池是一种静态内存管理方法,内存堆则是一种动态的管理方式。基本数据结构struct rt_memheap_item{ rt_uint32_t magic; /**< magic number for memheap */ struct rt_memheap *pool_ptr; /原创 2022-05-14 17:50:47 · 877 阅读 · 0 评论 -
RT-Thread源码-8-内存池剖析
前言在C中,可以通过malloc、calloc、realloc进行动态的、任意大小的内存块申请,以及通过free进行内存块释放;在C++中,能够通过new及delete执行上述操作。这样的优点非常明显,它们使内存块的申请分配变得非常灵活方便。但是,由于它的灵活性,将会有如下缺点:由于内存本身是连续的,在任意申请又释放达到一定次数后,在没有内存管理的情况下,它难免会出现内存碎片;在内存操作过程中,若非原子操作,在多线程环境下将容易出现线程安全问题;RT-Thread中提供了内存池的管理方法。它原创 2022-05-12 00:35:54 · 393 阅读 · 0 评论 -
RT-Thread源码-7-IPC相关剖析
IPCIPC(Inter Process Communication),进程间通信,用于在不同进程间传递或同步信息。在RT-Thread中主要提供的方式有消息队列、互斥锁、信号量、事件、邮箱及信号()。几个公用函数IPC对象的基础数据结构struct rt_ipc_object{ struct rt_object parent; /**< 父对象节点 */ rt_list_t suspend_thr原创 2022-05-08 21:01:52 · 859 阅读 · 0 评论 -
RT-Thread源码-6-定时器功能剖析
RT-Thread中,除了处理器提供硬件定时器外设,也提供了软件定时器。这里,软件定时器分为了软定时器及硬定时器,二者的区别在于对超时事件的处理时机的不同。软定时器于系统timer线程中执行超时事件处理函数,而硬定时器于系统时钟中断中处理。软定时器线程只有在使能软定时器(宏RT_USING_TIMER_SOFT)才能开启此线程。初始化在系统启动时,首先初始化了软定时器列表,定时器列表结构仍为rt_list,定时器数量即定时器列表大小由宏RT_TIMER_SKIP_LIST_LEVEL决定,.原创 2022-05-07 01:28:07 · 1080 阅读 · 0 评论 -
RT-Thread源码-核心数据结构rt_list及rt_slist
在RT-Thread中,基本上所有内核对象的实现都离不开,rt_list及rt_slist,这两个数据结构实际上就是普通的链表数据结构。rt_list表示的是双向链表结构,而rt_slist表示的是单向链表结构,以下为这两个数据结构的实现:struct rt_list_node{ struct rt_list_node *next; /**< point to next node. */ struct rt_list_node.原创 2022-05-05 01:19:01 · 1256 阅读 · 0 评论 -
RT-Thread源码-5-空闲线程分析
前言空闲线程是系统中优先级最低的线程,且永远不会被挂起,当系统无其他线程轮转调度时,调度器将调度到空闲线程。初始化空闲线程初始化于函数rtthread_startup函数中,在调度器启动前执行,具体看RT-Thread西东启动流程分析。函数名为rt_thread_idle_init,具体实现为:/** * @ingroup SystemInit * * This function will initialize idle thread, then start it. * * @no原创 2022-05-05 00:21:36 · 828 阅读 · 2 评论 -
RT-Thread源码-4-线程函数剖析
前言TCB 线程控制块RT-Thread中每个线程的信息用线程控制块(Thread Control-Block,缩写为TCB)表示,它是定义在rtdef.h中的struct结构体,用来描述一个线程所有必要信息;线程的优先级别用非负整数(即无符号整数)表示。数值越小,优先级越高;系统的线程优先级的数目固定,最多支持256级;系统中的线程数目不做任何限制,线程的数目仅受限于系统RAM的大小。线程控制块存储的数据结构为链表;线程创建在RT-Thread中分为静态创建和动态创建,二者实现原创 2022-05-04 16:03:02 · 1014 阅读 · 0 评论 -
RT-Thread源码-__rt_ffs函数剖析
在RT-Thread中,获取已就绪最高优先级线程索引会使用此函数。而此函数所包含的算法为bitmap算法。为什么使用此函数获取已就绪最高优先级线程索引?为什么使用bitmap算法?目的在于提升索引值获取的执行效率,以及保证系统的稳定执行。通常,为了获取已就绪最高优先级线程,最简单的方法就是遍历当前线程列表中的每一个线程状态及优先级,通过比较最后获取。而这种方法会随着最大支持线程数的增加而增加时间复杂度,且执行时间非恒定,影响系统的稳定。此函数在RT-Thread中实现如下,const rt_ui.原创 2022-05-02 19:01:44 · 813 阅读 · 0 评论 -
RT-Thread源码-3-线程调度函数剖析
初始在RT-Thread的启动流程中,rtthread_startup的最后一步,调用了rt_system_scheduler_start开启了线程调度器,此函数源码如下:void rt_system_scheduler_start(void){ register struct rt_thread *to_thread; register rt_ubase_t highest_ready_priority;#if RT_THREAD_PRIORITY_MAX > 32原创 2022-05-02 17:17:10 · 1246 阅读 · 2 评论 -
RT-Thread源码-2-上下文切换函数剖析
PendSV_Handler/* r0 --> switch from thread stack * r1 --> switch to thread stack * psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stack */.global PendSV_Handler.type PendSV_Handler, %functionPendSV_Handler: /* 失能中断进行上下文切换 */ .原创 2022-05-01 01:25:09 · 823 阅读 · 0 评论 -
RT-Thread源码-1-启动流程剖析
本文参考代码为 RT-Thread Nano 3.1.3版本代码。在初始篇中仅针对此操作系统的初始化及启动流程进行分析。不同的处理器系列及版本,以及使用的编译器之间会存在一些差别,但基本流程不变。以Cortex-M4、GCC版本为例初始化从上电启动或复位重启,从栈顶初始化中断向量表后跳转到ResetHandler函数的栈地址,开始执行。ResetHandler函数中:跳转执行系统初始化SystemInit跳转执行main函数,对RTOS进行初始化启动从main函数进入RT.原创 2022-04-30 23:35:42 · 555 阅读 · 0 评论