
RTOS
osnet
这个作者很懒,什么都没留下…
展开
-
Threadx 中断处理-ARM
文章目录ARM寄存器ARM两种状态ARM 工作模式工作模式切换ARM 异常ARM异常处理基于arm v7分析Threadx操作系统的中断处理。ARM寄存器ARM V7体系结构共有37个32位寄存器,其中r0-r12为通用寄存器;r13(sp)为栈寄存器,指向栈顶,向下(低地址)增长;r14(LR)是连接寄存器,用来函数调用时存储返回地址,或者中断异常点;r15(pc)为程序计数器,存储当前执...原创 2020-02-23 22:50:15 · 2001 阅读 · 0 评论 -
Threadx 块内存释放tx_block_release
tx_block_release应用程序调用tx_block_release释放分配的内存。如果tx_block_pool_suspension_list 链表有线程挂起,把释放的块给挂起线程,并恢复线程。如果没有挂起线程等待内存释放,那么释放的内存块,直接插入空闲内存块头部,这样操作简单,不需要遍历链表,开销少。修改内存块控制字段,指向下一个块首地址UINT _tx_block_r...原创 2020-02-12 17:55:55 · 442 阅读 · 0 评论 -
Threadx 块内存分配tx_block_allocate
tx_block_allocate应用程序调用tx_block_allocate申请分配内存。pool_ptr指向内存池指针block_ptr指向指针的指针,用于存储申请的内存起始地址wait_option等待选项,如果没有足够内存,wait_option为0,直接返回;wait_option为TX_WAIT_FOREVER,永久挂起;wait_option不为0,也不是TX_WAIT...原创 2020-02-12 17:12:40 · 810 阅读 · 1 评论 -
Threadx内存管理 块内存池 block pool
块内存池由固定大小的内存块构成,空闲内存块通过单向链表连接。块内存池只会分配固定大小内存块,所以不会出现字节内存池的内存碎片问题。块内存分配和释放只需操作链表头部,所以查找效率高。应用程序可以根据业务数据构成定义多个不同大小内存池,根据需求申请不同大小内存,提供内存管理性能。块内存池控制块块内存池控制块(BCB)是用来保持运行时块内存池状态的数据结构。/* Define the block...原创 2020-02-12 15:15:29 · 1564 阅读 · 0 评论 -
Thread 字节内存管理 内存搜索_tx_byte_pool_search
_tx_byte_pool_search_tx_byte_pool_search由于搜索可用内存,在_tx_byte_allocate和 _tx_byte_release函数中调用。使用first-fit算法,从第一块空闲内存开始搜索,搜索过程中找到第一块合适大小内存,就返回成功。如果把一块大内存分成了两块,一块返回给应用程序,另一块需要插入链表。搜索过程中,发现两块连续内存都是空闲内存,...原创 2020-02-11 12:11:57 · 613 阅读 · 0 评论 -
Threadx 字节内存池内存释放_tx_byte_release
_tx_byte_release_tx_byte_release用于内存释放,原理参考上篇博文:Threadx 内存管理-内存字节池UINT _tx_byte_release(VOID *memory_ptr){ TX_INTERRUPT_SAVE_AREA REG_1 TX_BYTE_POOL *pool_ptr; /* Pool po...原创 2020-02-11 11:17:06 · 528 阅读 · 0 评论 -
Threadx 字节内存池内存分配_tx_byte_allocate
_tx_byte_allocate_tx_byte_allocate用于内存分配,内存分配原理参考上篇博文:Threadx 内存管理-内存字节池UINT _tx_byte_allocate(TX_BYTE_POOL *pool_ptr, VOID **memory_ptr, ULONG memory_size, ULONG wait_...原创 2020-02-11 10:36:01 · 1281 阅读 · 0 评论 -
Threadx 内存管理-内存字节池
文章目录内存池控制块内存池链表内存池初始化内存分配内存释放内存整理字节池内存APIThreadx 提供内存字节池进行内存管理,内存字节池是一块连续字节块,可以以字节为单位申请内存。字节池内存中连续内存初始时有两个字节块,这两块通过单向链表连接。随着内存申请或释放整个大的连续内存分为更多的字节块,这些字节块通过双向链表连接。内存分配使用首次适应(fisrt-fit)算法。内存池控制块TX_B...原创 2020-02-10 21:38:26 · 3709 阅读 · 0 评论 -
Threadx 系统定时器线程_tx_timer_thread_entry
“System Timer Thread” 系统定时器线程用于判断定时器超时,并调用定时器超时处理函数。_tx_timer_initialize先来看看定时器线程创建初始化。_tx_timer_initialize初始化系统一系列与时间,定时器相关全局变量,链表,线程等。VOID _tx_timer_initialize(VOID){ REG_1 UINT ...原创 2020-02-09 21:51:44 · 1684 阅读 · 0 评论 -
Threadx 激活定时器和去激活定时器tx_timer_activate
文章目录tx_timer_activatetx_timer_deactivate_tx_timer_deactivate分析激活定时器和去激活定时器函数。tx_timer_activate_tx_timer_activate_api(TX_TIMER *timer_ptr) 用来激活已经创建的定时器。UINT _tx_timer_activate_api(TX_TIMER *time...原创 2020-02-09 16:46:35 · 1094 阅读 · 0 评论 -
Threadx 定时器timer
Threadx 操作系统定时器提供单次定时和周期性定时功能。定时器由周期性定时中断驱动,每一个定时中断称为一个时钟节拍(tick)。时钟节拍值有系统平台决定,比如5ms一个时钟节拍,需要综合硬件条件和应用需求设置。定时时间长度用时钟节拍个数衡量,比如时钟节拍为5ms,应用程序设置定时时间为1.5s,那么1.5s/5ms=300,调用_tx_timer_create创建定时器时,定时器值设置为30...原创 2020-02-08 23:02:58 · 3255 阅读 · 1 评论 -
Threadx 消息队列-接收消息_tx_queue_receive
消息队列-接收消息_tx_queue_receive1,如果消息队列有消息,从队列头部取出消息(1)并且tx_queue_suspension_list有挂起线程,说明发送线程由于消息队列已满而挂起,挂起时把发送的消息存放到了发送线程的tx_additional_suspend_info域,需要把这个消息移动到消息队列尾部,并且恢复发送线程2,如果消息队列为空,挂起接收线程到tx_queu...原创 2020-02-07 21:55:01 · 1922 阅读 · 0 评论 -
Threadx 消息队列-发送消息_tx_queue_send
消息队列-发送消息_tx_queue_send1,发送消息会插入到队列尾部。2,如果消息队列有挂起的接收线程,发送消息时,可以直接把消息放到接收线程的缓冲中,这可以降低消息传递延时。TX_THREAD线程控制块中tx_additional_suspend_info域用于存储接收线程缓冲区地址。3,如果消息队列已满,发送线程调用_tx_queue_send(wait_option不为0)发送...原创 2020-02-07 20:59:42 · 2369 阅读 · 0 评论 -
Threadx 消息队列 queue
Threadx提供了消息队列进行线程间通信。消息队列中消息通常按照先进先出规则传递,同时提供了把消息直接存储到队列头部的API。每个线程可以创建多个消息队列,并且可以使用多个消息队列和多个线程通信。消息队列不支持拥有者属性,也就是任何线程可以向消息队列发送或接收消息。应用开发者保证消息队列使用的合理性。消息传递规则1,任何线程可以向一个消息队列发送或接收消息,消息队列不支持拥有者属性。2...原创 2020-02-07 17:15:47 · 3051 阅读 · 0 评论 -
Threadx 释放信号量_tx_semaphore_put
释放信号量_tx_semaphore_put1,如果tx_semaphore_suspension_list挂起队列为空,那么直接把tx_semaphore_count计数器加一2,如果tx_semaphore_suspension_list挂起队列不为空,那么tx_semaphore_suspension_list最前面线程获取释放的信号量,并恢复线程。这里采用的FIFO,并没有按照优先级...原创 2020-02-06 21:09:57 · 845 阅读 · 0 评论 -
Threadx 申请信号量_tx_semaphore_get
申请信号量_tx_semaphore_get1,如果信号量计数器tx_semaphore_count不为0,就减一,返回申请成功。2,如果信号量计数器tx_semaphore_count为0,说明资源都被占用,挂起当前线程到tx_semaphore_suspension_list队列,挂入队列的尾部,FIFO, 后续恢复时按住FIFO,而不是按照线程优先级UINT _tx_semaph...原创 2020-02-06 20:38:28 · 1105 阅读 · 0 评论 -
Threadx 信号量semaphore
文章目录信号量控制块信号量队列信号量API优先级翻转信号量创建_tx_semaphore_create删除信号量_tx_semaphore_delete信号量(semaphore)用来保护共享资源,临界区访问,同步;可以用于生产者-消费者模式中提供事件通知。如果信号量计数器最大为1,其值可能为0或1,成为二进制信号量。二进制信号量作用类似互斥量,但信号量不支持所有权,不支持优先级继承。信号量...原创 2020-02-06 18:31:11 · 1114 阅读 · 0 评论 -
Threadx 释放互斥量_tx_mutex_put
释放互斥量_tx_mutex_put1,只有拥有互斥量的线程才能够释放互斥量2,计数器减1后,值不是0,说明本线程多次申请了互斥量,那么本线程继续占有互斥量,函数返回3,挂起队列中有线程等待互斥量资源,那么需要恢复挂起线程4,挂起队列中线程优先级一定比拥有互斥量线程优先级高,因为低优先级获取了互斥量后,只有高优先级线程能够打断低优先级线程,并尝试获取互斥量,并挂在挂起队列中。 如果是高优...原创 2020-02-06 14:04:19 · 695 阅读 · 0 评论 -
Threadx 申请互斥量 _tx_mutex_get
申请互斥量 _tx_mutex_get_tx_mutex_get用于申请互斥量:1,如果是系统中第一个申请互斥量线程,tx_mutex_ownership_count 设置为1,申请成功。2,如果是拥有互斥量的线程再次申请,那么只需tx_mutex_ownership_count 计数器加一,申请成功。3,如果申请互斥量的当前线程不是拥有互斥量的线程,需要把当前线程挂入tx_mutex_s...原创 2020-02-05 23:45:29 · 1119 阅读 · 0 评论 -
Threadx 互斥量mutex
互斥量用来保证对共享资源或临界区的访问唯一性,保证在指定范围内,只能有一个线程访问该共享资源。Threadx中同一个线程可以多次申请同一互斥量,并且释放互斥量必须释放相同次数。互斥量控制块Threadx中互斥量控制块(MCB)是用来保持运行时互斥量状态的数据结构。/* Define the mutex structure utilized by the application. */...原创 2020-02-05 22:55:50 · 1190 阅读 · 0 评论 -
Threadx 优先级翻转-优先级继承
优先级翻转优先级翻转是指较低优先级已经获得临界资源,这时较高优先级线程也需要获得的这个临界资源时,较高优先级线程会被挂起,等待资源释放。如果这时中等优先级任务抢占了低优先级任务,就出现了低优先级任务先执行,高优先级任务在等待,而且时间也变得不确定。实时系统最大特点就是高优先级任务能够在确定时间进行响应,并且能够抢占低优先级任务。优先级翻转现象打破了这种规则,使系统变得不稳定。举例:1,线程...原创 2020-02-05 20:48:38 · 989 阅读 · 0 评论 -
Threadx 线程调度
Threadx os 线程调度方法:1,基于优先级的调度,高优先级线程抢占低优先级线程2,同一优先级线程可以采用基于时间片轮转调度方式3,线程主动挂起,其他线程获得调度执行几种方式同时采用,联合进行线程调度。通过创建线程时设置时间片为0,可以禁止基于时间片轮转调度。基于优先级抢占调度通过中断或消息驱动进行调度。1,高优先级线程抢占低优先级线程2,只要有高优先级线程执行,低优先级线...原创 2020-02-05 13:56:47 · 2512 阅读 · 0 评论 -
Threadx _tx_thread_suspend线程挂起
执行线程可以调用_tx_thread_suspend自我挂起,或者调用_tx_thread_suspend挂起某个线程线程挂起前,先设置tx_state 或tx_suspending /* Set the suspending flag. */ thread_ptr -> tx_suspending = TX_TRUE;如果挂起线程是当前执行线程(自我挂起),需要...原创 2020-02-04 18:41:27 · 1192 阅读 · 0 评论 -
Threadx 线程
基本概念程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。进程是由程序、数据和进程控制块三部分组成的。进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己...原创 2020-02-04 16:01:51 · 3084 阅读 · 0 评论 -
Threadx _tx_thread_resume线程恢复
新创建线程时或其他线程主动让某个线程执行,会调用_tx_thread_resume,把新的线程加入调度list,并选择出下一个需要执行的线程。基本原理:选出系统中最高优先级线程为执行线程1,恢复线程正在挂起过程中,只需要修改线程状态为就绪2,线程已经挂起或新创建的线程,那么加入到就绪list中3,就绪list为基于优先级的数组列表4,先根据优先级找到_tx_thread_priority_...原创 2020-02-03 23:13:08 · 1004 阅读 · 0 评论 -
Threadx tx_thread_create创建线程
文章目录线程控制块(TCB)_tx_thread_create线程控制块(TCB)typedef struct TX_THREAD_STRUCT{ /* The first section of the control block contains critical information that is referenced by the port-specific...原创 2020-02-03 21:54:22 · 3749 阅读 · 0 评论