ThreadX
文章平均质量分 88
ThreadX内核源码实现分析
arm7star
这个作者很懒,什么都没留下…
展开
-
ThreadX内核源码分析(SMP) - 线程多核映射
整个过程就是先把能占的核先占了,如果被占的核上的线程能移动到空闲核上,那么就移动到空闲核上面去,如果不能,那就递归占能占的核。原创 2022-07-14 22:23:51 · 1420 阅读 · 0 评论 -
ThreadX内核源码分析(SMP) - 核间通信(arm)
多核情况下,一个核可能改变另外一个核的执行状态,例如一个核挂起另外一个核正在执行的线程,如果没有机制通知另外一个核该线程被挂起的话,那么被挂起的线程就感知不到自己被挂起了;ThreadX内核使用SGI中断,从一个核发送一个中断信号到目的核上去,从而使另外一个核产生中断,另外一个核就会去检查状态变化,例如是否要重新调度(别的核改变了该核需要执行的线程)。 参考《ARMv8-A_Architecture_Reference_Manual_(Issue_A.a).pdf》"D8.6.28 ICC_S原创 2022-07-05 19:46:05 · 1806 阅读 · 0 评论 -
ThreadX内核源码分析(SMP) - 核间互斥(arm)
在单核的ThreadX内核中,内核的临界资源互斥通过关中断实现;在多核cpu上,关闭整个cpu的代价比较大,单核上仍然使用关中断实现(其他核的中断仍然开启),但是与其他核之间互斥通过_tx_thread_smp_protection实现: 首先,单核已经关中断,那么正在访问资源的线程不会被切换出去,在退出临界资源之前,当前核上的线程不会被中断,也就是在退出临界资源前当前核不会有其他线程执行,当前核的线程之间是互斥的; 其次,_tx_thread_smp_protection标记了原创 2022-07-04 23:44:58 · 1253 阅读 · 0 评论 -
ThreadX内核源码分析 - 消息队列
1、消息队列介绍ThreadX内核的消息可以多线程收发,每个消息的大小固定;消息队列有一定的大小,超过大小之后,发送消息的线程需要等待消息被取走才能往消息队列里面再次发送消息。2、消息的接收_tx_queue_receive消息接收主要检查有没有消息,没有消息就要等待消息或者返回消息队列为空的错误码;如果消息队列不为空,并且没有发送消息的线程等待消息队列(消息队列不为空),那么直接从消息队列最前面读消息即可;如果消息队列满了,有线程等待消息队列,那么检查等待消息队列的第一个线程是不是原创 2022-03-12 22:19:16 · 1318 阅读 · 0 评论 -
ThreadX内核源码分析 - 事件
1、ThreadX内核事件介绍ThreadX事件有点类似epoll,线程可以等待单个事件/多个事件等(epoll一个事件就绪即可返回,ThreadX可以等待多个事件都就绪才返回),从代码实现上看,ThreadX可以多个线程等待同一个事件,获取事件之后还可以不清除事件,epoll在网络编程中,似乎还没看到多个线程对一个事件监听的情况,具体能否多个线程调用epoll监听同一事件还得看linux内核代码实现;ThreadX等待多个事件就绪才返回,这个实现比较实用,在ceph中等待多个worker结束时,通原创 2022-03-12 19:22:50 · 1553 阅读 · 0 评论 -
ThreadX内核源码分析 - 计数信号量
1、计数信号量介绍计数信号量的信号量值不为0,表示信号量可获取,每次获取信号量,信号量计数器的值减1,为0是,信号量不看获取,释放信号量是每次加1;计数信号量实现与互斥锁类似,一定程度上可以把互斥锁看出计数为1的信号量,只不过互斥锁有动态优先级调整,信号量没有,互斥锁用于临界资源保护,信号量用于生产消费者这类场景(多个消费者、多个生产者)。2、信号量获取_tx_semaphore_get获取信号量的代码比较简单,主要是对计数信号量的计数进行判断,如果信号量计数器不为0,就减1然后返回(获原创 2022-03-12 14:40:22 · 696 阅读 · 0 评论 -
ThreadX内核源码分析 - 线程同步之互斥锁及动态优先级
1、ThreadX互斥锁介绍互斥锁一般用来锁多线程都需要访问的临界资源,这些资源不能并发操作,例如对某个内存的互斥读写,这个读写很快,但是不能多线程同时进行,所以需要加互斥锁;占用互斥锁的线程没能执行,可能是被高优先级线程抢占了或者临界资源里面调用了阻塞操作;高优先级线程想要访问临界资源就必须等待低优先级线程被调度然后释放互斥锁,如果低优先级线程不提高优先级不被执行的话,那么高优先级的线程就会阻塞,直到所有高优先级线程都阻塞了,才能轮到占用互斥锁的低优先级线程执行,这样高优先级线程就得不到及时处理,原创 2022-03-12 13:24:11 · 1744 阅读 · 0 评论 -
ThreadX内核源码分析 - 动态内存管理
ThreadX内核与μC/OS-II、NucleusPlus内核一样,都支持固定大小的内存块管理,也支持不固定大小的内存块管理。固定大小的内存块管理是把一片内存分割成大小相同的多个内存块,以整块内存分配和释放,例如内存块大小为1024字节,那么每次只能申请释放1024字节的内存,一般只适合大小固定的内存块申请释放场景,类似linux的2的n次方的内存页申请,mmu只能管理页,不能把页分成更小的内存管理,因此要分配小的内存前,先按页分配,再在分配的页里面按byte分配内存。原创 2022-02-19 22:45:02 · 1250 阅读 · 0 评论 -
ThreadX内核源码分析 - 优先级及抢占阈值抢占(arm)
1、抢占阈值thresholdThreadX实时系统内核除了按时间片调度外,还有优先级调度,高优先级线程抢占低优先级线程,另外与其他嵌入式实时系统一个比较明显的差异是,ThreadX支持低优先级线程抢占高优先级线程,通过抢占阈值threshold实现低优先级线程抢占高优先级线程;抢占阈值threshold只有在启用抢占线程正在执行的时候被切换出去的时候才有作用,也就是新创建的启用了抢占的线程就绪时,即使新创建线程的抢占阈值threshold高于正在运行的线程优先级,线程只会添加到同优先级就绪线程链表原创 2022-02-19 14:58:23 · 1710 阅读 · 0 评论 -
ThreadX内核源码分析 - 定时器及线程时间片调度(arm)
1、线程时间片介绍(tx_thread_time_slice)ThreadX内核同优先级线程之间是按时间片调度的,tx_thread_new_time_slice记录线程的时间片(一次调度的总的时间片),tx_thread_time_slice记录线程的剩余时间片(ThreadX内核每次调度线程时,并不是从tx_thread_new_time_slice,而是从上次换出cpu时的剩余时间片继续计时,只有当时间片用尽时,tx_thread_time_slice才会从tx_thread_new_time_s原创 2022-02-16 08:00:00 · 2014 阅读 · 0 评论 -
ThreadX内核源码分析 - ports线程上下文相关代码分析(arm)
1、ports源码介绍内核与cpu相关的关键代码基本都是用汇编语言实现的,c语言可能实现不了或者不好编写。ThreadX官网针对ARM9 gcc的移植代码在threadx-6.1.2_rel\ports\arm9\gnu\src目录下,ThreadX文件命名规则基本是以该文件包含的函数名命名的(函数名多了一个"_"前缀,文件名里面没有"_"前缀),每个源文件通常只实现一个函数;ports代码目录如下:tx_thread_context_restore.S是_tx_thread_context原创 2022-02-15 08:00:00 · 1560 阅读 · 0 评论 -
ThreadX驱动编写(基于ARM处理器)
1、参考文档及代码参考《Azure RTOS ThreadX User Guide》"Chapter 5: Device Drivers for ThreadX"ThreadX 6.1.2Versatile/PB代码参考https://github.com/arm7star/ThreadX(未添加驱动)2、驱动框架介绍ThreadX驱动框架比较简单,与linux驱动比较类似,中断服务程序进行简单的中断处理(外设硬件中断处理、清除外设及中断控制器中断,类似linux中断上半部),然后唤..原创 2021-04-14 19:34:17 · 1454 阅读 · 0 评论 -
ThreadX中断处理(基于ARM处理器)
1、s3c2440定时器初始化定时器用于内核时钟计数,一用于对当前正在运行的任务的时间片进行更新,二用于对内核timer进行计数。定时器初始化函数如下,调用s3c2440_timer_init设置时钟周期,调用unmask_irq允许定时器4中断。void SMDK2440_Timer_Initialize(void){ s3c2440_timer_init(); // initialize timer4 unmask_irq(INT_TIMER4); // unmask原创 2021-03-06 18:15:54 · 1916 阅读 · 0 评论