自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 收藏
  • 关注

原创 freertos学习

在malloc时会寻找空闲内存块中满足申请大小的最小内存块,并将多余的那部分再分割出来作为新的空闲块,并且不会合并相邻空闲块。比如现在有5字节、25字节、50字节三个空闲块,申请20字节大小时,会自动匹配25字节的空闲块,并将多余的5字节分割出来,作为新的空闲块等待分配。:又创建一个task,如果这个task的stack和之前删除的task一样,那么这个task就会使用删除掉的task使用的空间。heap顶部仍然是一大块空闲空间,同时删除的task之前所占的TCB、Stack空间也变为空闲。

2023-02-08 10:41:53 105

原创 寄存器

1.ARM共有37个32位(=4字节=1字)寄存器。其中,31个为通用寄存器,6个为状态寄存器。2.ARM状态下的寄存器3.寄存器介绍Sys和Usr共用一套寄存器 (1) 通用寄存器(31/37) 1) R0 - R7所有工作模式下,R0 - R7都分别指向同一个物理寄存器(8/8),未被系统用作特殊的用途。在中断或异常处理进行工作模式转换时,由于不同工作模式均...

2021-09-15 09:46:23 980

原创 中断响应

发生异常后处理器硬件执行:1.保存CPSR到新模式的SPSR中2.修改CPSR (1) 修改模式位,切换到新模式(2) 清除Thumb位,中断必须在32位模式处理 (3) 若异常是IRQ,则置I位,禁止IRQ中断 (4) 若异常是FIQ,则置F位和I位,禁止IRQ和FIQ中断 (5) 保存PC值到新模式的R143.把对应异常中断向量地址保存到PC,后续软件从PC地址开始执行...

2021-09-15 09:38:26 501

原创 中断分类、优先级

1.分类2.优先级

2021-09-15 09:36:23 511

原创 中断的概念

CPU在正在执行程序过程中,遇到外部/内部紧急事件需要处理,暂时中止当前程序执行转而去为事件服务,待服务完毕,再返回到暂停处(断点)继续执行原来的程序中断分为:(1) 硬中断 1) 内部中断(不可屏蔽)因硬件出错(突然掉电等)或运算出错(除数为零等)引起的中断 2) 外部中断(可屏蔽)由计算机外设发出的中断请...

2021-09-15 09:35:05 138

原创 异常与中断

1.异常中断处理 (1) ARM 1) 初始化 a) 设置中断源,让它可以产生中断 b) 设置中断控制器(可屏蔽某个中断,优先级) c) 设置CPU总开关(使能中断) 2) 执行正常程序,CPU每执行完一条指令都会检查有无中断/异常产生 ...

2021-09-15 09:32:20 72

原创 7种工作模式

1.工作模式介绍 (1) 用户模式(Usr)用户程序的工作模式,运行在操作系统的用户态。没有权限操作其他硬件资源,只能执行自己的数据,也不能切换到其他模式下。要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。 (2) 系统模式(Sys)运行操作系统的特权任务。与用户模式共用一套寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),...

2021-09-15 09:28:43 3798

原创 2种工作状态

1.ARM状态处理器执行32位的字对齐的ARM指令2.Thumb状态处理器执行16位、半字对齐的Thumb指令3.状态切换 (1) Bx Rn状态切换指令Bx是跳转指令,Rn是寄存器(一个字,32位)。若Rn的位0位1,则进入Thumb状态;若Rn的位0为0,则进入ARM状态。 (2) 处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容...

2021-09-15 09:24:35 123

原创 ARM目录

|--|--|--| |--| |--| |--|--

2021-09-15 09:23:01 84

原创 threadx目录

|--基本概念| |--内核类| |--线程类|--线程| |--线程同步| | |--消息队列| | |--统计信号量| | |--Mutexes互斥| | |--事件标志| |--线程调度| | |--优先级抢占| | |--时间片(tim...

2021-09-13 19:41:00 138

原创 释放信号量 tx_sp.c

UINT_tx_semaphore_put(TX_SEMAPHORE*semaphore_ptr)局部变量:1.如果tx_semaphore_suspension_list挂起队列为空,那么直接把tx_semaphore_count计数器加一2.如果suspension list不为空,那么suspension list最前面线程获取释放的信号量,并恢复线程。_tx_semaphore_put函数在释放信号量时并没有检查当前释放信号量的线程...

2021-09-13 17:19:59 224

原创 申请信号量 tx_sg.c

UINT_tx_semaphore_get(TX_SEMAPHORE*semaphore_ptr,ULONGwait_option);局部变量:1.如果信号量计数器tx_semaphore_count不为0,就减一,返回申请成功。2.如果信号量计数器tx_semaphore_count为0,说明资源都被占用,挂起当前线程到suspension list的尾部,后续恢复时按FIFO流程:1.禁止中断2.若cou...

2021-09-13 17:17:51 217

原创 创建信号量 tx_sc.c

UINT_tx_semaphore_create(TX_SEMAPHORE*semaphore_ptr,CHAR*name_ptr,ULONGinitial_count);局部变量:流程:1.设置初始化值2.禁止中断3.设置id4.将该信号量加入created list5.created_count++6.恢复中断7.返回success...

2021-09-13 17:15:24 190

原创 信号量控制块 TX_SEMAPHORE_STRUCT

信号量(semaphore)用来保护共享资源,临界区访问,同步;可以用于生产者-消费者模式中提供事件通知。如果信号量计数器最大为1,其值可能为0或1,成为二进制信号量。二进制信号量作用类似互斥量,但信号量不支持所有权,不支持优先级继承。 tx_semaphore_id 信号量ID tx_semaphore_name 信号量名字指针 tx_semaphore_count 信号量计数器

2021-09-13 17:13:55 156

原创 计时器timer

1.单次计时器、定期计时器借助 ThreadX 应用程序计时器,应用程序能够按特定的时间间隔执行应用程序 C 函数。 应用程序计时器也可能只过期一次。 这种类型的计时器称为单次计时器,而重复间隔计时器称为定期计时器 。2.计时器间隔在threadx中,时间间隔通过定期计时器中断来测量。每个计时器中断称为计时器时钟周期。 计时器时钟周期之间的实际时间由应用程序指定,但 10 毫秒是大多数实现的标准时间。3.计时器准确性计时器过期时间根据时钟周...

2021-09-10 09:52:31 633

原创 内存字节池(memory byte pools)

1.可包含多个内存字节池。每个内存字节池都是一个公用资源。 除了不能从 ISR 调用内存字节服务之外,没有任何限制。2.内存字节池的分配与malloc类似,其中包含所需的内存量(字节)。 内存采用“首次适应”的方式从池中分配。例如,使用满足请求的第一个可用内存块。 此块中多余的内存会转换为新块,并放回可用内存列表中。 此过程称为碎片。相邻的可用内存块在后续的分配搜索过程中合并为一个足够大的可用内存块。 此过程称为碎片整理。3.创建内存字节池...

2021-09-10 09:51:04 409

原创 内存块池(memory block pools)

1.内存块池由固定大小的块组成,不会出现任何碎片问题。每个内存块池都是一个公用资源。2.分配和释放固定大小内存块所需的时间与简单的链接列表操作所需的时间相当。可以在可用列表的开头完成内存块分配和取消分配3.缺点:缺乏灵活性。池的块大小必须足够大,才能处理其用户最坏情况下的内存需求。如果对同一个池发出了许多大小不同的内存请求,则可能会浪费内存。解决方案:创建多个不同的内存块池,这些池包含不同大小的内存块。4.创建内存块池线程在初始化期间或运行时创建。 应...

2021-09-10 09:49:16 375

原创 时间片(time-slicing)轮循调度(round-robin scheduling)

1.轮循调度通过tx_thread_relinquish实现。通过其处理具有相同优先级的多个线程,为相同优先级的所有其他就绪线程提供了在 relinquish 调用方再次执行之前执行的机会。2.时间片轮循调度的另一种形式。1 ≤time_slice≤ 0xFFFFFFFF。在优先级相同的其他就绪线程有机会运行之前,允许该线程运行的计时器时钟周期数。使用抢占阈值将禁用时间片。值为TX_...

2021-09-10 09:47:41 1041

原创 优先级抢占

1.线程优先级ThreadX 具有 32 个优先级,范围从优先级 0 到优先级 31(TX_MAX_PRIORITIES-1)。 数值越小,优先级越高。通过协作调度或时间切片,多个线程可以具有相同的优先级。 此外,线程优先级还可以在运行时更改。2.线程调度优先级最高的就绪线程最先执行。 如果有多个具有相同优先级的线程准备就绪,则按照先进先出 (FIFO) 的方式执行。3.抢占抢占是为了支持优先级更高的线程而暂时中断正在执...

2021-09-10 09:46:35 1880

原创 事件标志event flag

1.每个事件标志由一个位表示。事件标志按照 32 个一组的形式排列。线程可以同时对组中的所有 32 个事件标记执行操作。 每个事件标志组都是一个公用资源。2.事件由 tx_event_flags_set 设置,由 tx_event_flags_get 检索。可通过在当前事件标志和新事件标志之间执行逻辑 AND/OR 运算来设置事件标志。逻辑运算的类型(AND或OR)在 tx_event_flags_set 调用中指定。可使用类似的逻辑选项来检索事件标志。 获取请求...

2021-09-10 09:44:49 975

原创 Mutexes 互斥

1.互斥实质上是二进制信号灯,每次只有一个线程可以拥有一个互斥。 此外,同一线程可能会对已拥有的互斥多次执行成功的互斥获取操作。每个互斥都是一个公用资源。2.两个操作tx_mutex_get 和 tx_mutex_put。获取操作获得不归另一个线程所有的互斥,而放置操作释放以前获得的互斥。 对于要释放互斥的线程,放置操作数必须等于先前的获取操作数。3.互斥仅用于互相排斥。 与计数信号灯不同,互斥不能作为事件通知的方法。4.互斥体互相排斥互相排斥用于控制线程...

2021-09-10 09:41:49 236

原创 统计信号量

1.ThreadX 提供 32 位计数信号灯,其值范围在 0 到 4,294,967,295 之间。每个计数信号灯都是一个公用资源。2.两个操作:tx_semaphore_get 和 tx_semaphore_put 。 执行获取操作会将信号灯数量减一。 如果信号灯为 0,获取操作不会成功; 获取操作的逆操作是放置操作。 该操作会将信号灯数量加一。3.互相排斥互相排斥用于控制线程对某些应用程序区域(也称为关键部分或应用程序资源)的访问 。将...

2021-09-10 09:29:38 199

原创 消息队列queue

1.线程通信的主要方式。消息队列中可以驻留一个或多个消息。 保留单个消息的消息队列称为邮箱(mailbox)。每个消息队列都是一个公用资源。2.消息通过 tx_queue_send 复制到队列尾部(可通过tx_queue_front_send发送消息到队列头部),然后通过 tx_queue_receive 从队列中复制。唯一的例外是在等待空队列中的消息时线程会挂起,发送到队列的下一条消息将直接放入该线程的目标区域。3.创建消息队列线程在初始化期间或运行时创建。 应用程序中的消息队...

2021-09-10 09:22:00 630

原创 线程相关的

1.线程通常定义为具有专用用途的半独立程序段,所有线程的组合构成了应用程序。2.线程在初始化或线程执行期间通过tx_thread_create来动态创建。创建的线程处于“就绪”或“已挂起”状态。3.线程状态ThreadX有五个不同的线程状态:就绪(Ready)、已挂起(Suspended)、正在执行(Executing)、已终止(Terminated)、已完成(Completed)。 (1) 就绪线程准备...

2021-09-09 20:36:38 255

原创 线程类概念

1.线程线程是RTOS调度的基本单元,通过设定各个线程的运行规则,交给RTOS管理,这就是基于RTOS编程的基本思想。在面向对象编程的过程中,线程就是一个个独立、相互作用的功能清晰的小程序模块。2.线程和进程的区别对于操作系统来说,一个任务就是一个进程,比如打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检...

2021-09-09 20:32:04 228

原创 内核类概念

1.调度(scheduling)安排执行哪个线程。每个线程都可赋予不同的优先级(数值越小,优先级越高)。优先级数值不应过大,会影响线程管理列表所占的资源和管理的时效性。常用基于优先级的调度算法,总是让就绪的、优先级最高的线程先运行。2.不可抢占型内核、可抢占型内核 (1) 不可抢占型内核(Non-Preemptive Kernel)高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占C...

2021-09-09 20:29:24 202

原创 基本的概念

1.操作系统向用户提供了两种接口:用户接口、程序接口。 (1) 用户接口用户向 OS 请求提供特定的服务,系统把服务的结果返回给用户。 (2) 程序接口(Application Programming Interface,API)为程序员在编程时使用的,系统和应用程序通过这个接口,可在执行中访问系统中的资源和取得 OS 的服务,它也是程序能取得操作系统服务的唯一途径。...

2021-09-09 20:24:51 58

原创 清除内存字节池 tx_bytcl.c

VOID_tx_byte_pool_cleanup(TX_THREAD*thread_ptr,ULONGsuspension_sequence)局部变量:流程:1.pool_ptr指向suspend控制块2.禁止中断 //为了将挂起线程从内存字节池中移除3.若需要cleanup且有挂起线程 (1) 清空cleanup flag (2) 将线程从suspension list中删去...

2021-09-09 20:22:57 84

原创 改变优先级 tx_bytpp.c

UINT_tx_byte_pool_prioritize(TX_BYTE_POOL*pool_ptr);局部变量:流程:1.禁止中断2.如果只有两个挂起线程,交换位置即可3.若挂起线程数量>2 (1) 先将priority_thread_ptr设为第一个线程 (2) thread_ptr(搜寻指针)指向下一个线程(即后面的当前线程) (3) 循环操作 //遍历suspension ...

2021-09-09 20:20:37 113

原创 删除内存字节池 tx_bytd.c

UINT_tx_byte_pool_delete(TX_BYTE_POOL*pool_ptr);局部变量:流程:1.禁止中断2.created count--3.标记内存字节池为无效 //id=04.从created list中删除内存字节池5.禁用抢占6.恢复中断7.遍历suspension list (1) thread_ptr指向suspension list挂起的第一个线程 (2) ...

2021-09-09 20:18:53 55

原创 释放内存字节池 tx_bytr.c

UINT_tx_byte_release(VOID*memory_ptr);局部变量:流程:1.禁止中断2.work_ptr记录要释放的内存起始地址3.若work_ptr为有效值 (1) 后退sizeof(CHAR_PTR) + sizeof(ULONG)字节是所在块的控制字段首地址 (2) 检查控制字段(第4-8字节),若不为TX_BYTE_BLOCK_FREE(说明不是空闲内存) ...

2021-09-09 20:16:20 117

原创 分配内存字节池 tx_byta.c

UINT_tx_byte_allocate(//指向之前创建的内存块池的指针TX_BYTE_POOL*pool_ptr,//指向目标内存指针的指针。 成功分配时,已分配内存区域的地址位于此参数所指向的位置VOID**memory_ptr,//请求的字节数ULONGmemory_size,//定义此服务在没有足够内存可用时的行为方式U...

2021-09-09 20:03:59 145

原创 搜索内存 tx_byts.c

UCHAR*_tx_byte_pool_search(//指向内存池控制块的指针TX_BYTE_POOL*pool_ptr,//需要的内存大小ULONGmemory_size)局部变量:使用first-fit算法,从上次操作的空闲内存开始搜索,搜索过程中找到第一块合适大小内存,就返回成功。内存块链表是一个循环链表,最后一块为固定块,不用内存分配,只为了适配搜索算法。如果把一块大内存分...

2021-09-09 20:00:51 167

原创 创建内存字节池 tx_bytc.c

UINT_tx_byte_pool_create(//指向内存池控制块的指针TX_BYTE_POOL*pool_ptr,//指向内存池名称的指针CHAR*name_ptr,//内存池的起始地址。 起始地址必须与 ULONG 数据类型的大小一致VOID*pool_start,//内存池可用的总字节数ULONGpool_size);...

2021-09-09 19:52:42 240

原创 内存字节池控制块 TX_BYTE_POOL

tx_byte_pool_id 内存字节池id tx_byte_pool_name 内存字节池名字 tx_byte_pool_available 内存字节池可分配字节 tx_byte_pool_fragments 内存字节池块个数 tx_byte_pool_list 内存字节池头list指针 ...

2021-09-09 19:45:59 311

原创 清除内存块池 tx_bpcle.c

VOID_tx_block_pool_cleanup(TX_THREAD*thread_ptr);局部变量: 流程:1.pool_ptr指向suspend控制块2.禁止中断 //为了将挂起线程从内存块池中移除3.若需要cleanup且有挂起线程 (1) 清空cleanup flag (2) 将线程从suspension list中删去 (3) suspended count--...

2021-09-09 19:41:26 51

原创 删除内存块池 tx_bpd.c

UINT_tx_block_pool_delete(TX_BLOCK_POOL*pool_ptr);局部变量:将内存块池从created list中删除,并且恢复挂起在suspension list中的线程流程:1.禁止中断 //为了进行删除内存块池的操作2.标记内存块池为无效 //id=03.从created list中删除内存块池4.禁止抢占5.恢复中断6.遍历suspension list (1) t...

2021-09-09 19:38:25 66

原创 释放内存块池 tx_br.c

UINT_tx_block_release(VOID*block_ptr);局部变量:如果suspension_list 有线程挂起,把释放的块给挂起线程,并恢复线程。如果没有挂起线程等待内存释放,那么释放的内存块,直接插入空闲内存块头部,这样操作简单,不需要遍历链表,开销少。修改内存块控制字段,指向下一个块首地址流程:1.禁止中断2.将要释放的内存块的首地址(释放内存首地址(block_ptr)后退sizeof(CHAR_PTR)是释放...

2021-09-09 19:35:55 212

原创 改变优先级 tx_bpp.c

UINT_tx_block_pool_prioritize( ·TX_BLOCK_POOL*pool_ptr);局部变量:把挂起链表中最高优先级线程移动到最前面,保证最高优先级线程先恢复流程:1.禁止中断2.如果只有两个挂起线程,交换位置即可3.若挂起线程数量>2 (1) 先将priority_thread_ptr设为第一个线程 (2) thread_ptr(搜寻指针)指向下一个线程(即后面的...

2021-09-09 19:30:23 94

原创 分配内存块池 tx_ba.c

UINT_tx_block_allocate(//指向内存池指针TX_BLOCK_POOL*pool_ptr,//指向指针的指针,用于存储申请的内存起始地址VOID**block_ptr,//等待选项ULONGwait_option);如果有空闲内存,直接返回tx_block_pool_available_list指向的内存块;如果内存不够,可以挂起到suspensi...

2021-09-09 19:27:46 83

t32 practice脚本(.cmm) training

t32 practice脚本training

2022-02-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除