RTOS
文章平均质量分 81
本专栏主要介绍FreeRTOS 内核源码解析,手把手教学移植应用。
Bazinga bingo
自律的顶端是孤独,孤独的顶端是自由
展开
-
[FreeRTOS 功能应用] 任务通知 功能应用
从串口可以看出,由于发送的数据使用覆盖的方式,所以代码中循环调用xTaskNotify函数发送时,会将数据进行覆盖。因此task2接收时只会接收都最后一个数值量。使用xTaskNotify()向指定task2任务发送通知,发送的数据使用覆盖的模式进行。使用xTaskNotifyWait()等待接收通知,接收数据成功后打印接收到的数值。原创 2024-07-13 09:24:06 · 411 阅读 · 0 评论 -
[FreeRTOS 内部实现] 任务通知
xTaskNotifyWait(): 允许任务等待接收通知,并可以设置在进入和退出时要清零的通知比特位。uint32_t *pulPreviousNotificationValue:更改前的通知值。xTaskNotify(): 向指定任务发送通知,并可选择如何更新接收任务的通知值。taskNOT_WAITING_NOTIFICATION:任务没有在等待通知。taskNOTIFICATION_RECEIVED:任务已经接收到通知。taskWAITING_NOTIFICATION:任务正在等待通知。原创 2024-07-13 07:21:36 · 589 阅读 · 0 评论 -
[FreeRTOS 基础知识] 任务通知 概念
实时操作系统(RTOS)的任务通知机制是一种用于任务间通信和同步的机制。在FreeRTOS中,任务通知允许一个任务向另一个任务发送通知,表明某个事件已经发生或者某些条件已经满足。这种机制特别适用于轻量级的同步需求,因为它不需要使用更重的互斥锁或信号量。任务通知包括一个32位的通知值,这个值可以是整数或者位掩码,具体含义由应用程序定义。任务可以等待特定的通知值或位掩码,以便在通知发生时采取相应的行动。每个任务都会自己的任务结构体TCB,任务C的TCB结构体中有两个成员,一个是val值,一个是state状态。原创 2024-07-08 21:34:27 · 391 阅读 · 0 评论 -
[FreeRTOS 功能应用] 事件组 功能应用
函数中通过osThreadDef 宏构建osThreadDef_t 结构体,名称os_thread_def_##name(## 表示字符拼接),结构体成员包括 :#name 任务名称;thread 任务处理函数;通过xEventGroupSetBits函数,设置 g_EventGroup 结构体中的事件状态标志位,表示task1执行完成。通过xEventGroupSetBits函数,设置 g_EventGroup 结构体中的事件状态标志位,表示task2执行完成。任务实现:task1完成后执行task2;原创 2024-07-06 21:22:17 · 772 阅读 · 0 评论 -
[FreeRTOS 内部实现] 事件组
考虑到第一种情况,多任务之间操作队列会相互影响,可以采取关闭调度器来解决,但是不能屏蔽掉中断中对队列的读写操作。如果只关闭调度器的话,中断对队列的操作同样会对正在的任务有影响。因此任务在对队列进行操作时,第一步一定是要关闭中断。第四参数 const BaseType_t xWaitForAllBits:等待的位是同时满足还是只要一个成立就满足(等待位是 与的关系 还是 或的关系 )第三参数 const BaseType_t xClearOnExit :在退出的时候是否对等待的位进行清除。原创 2024-07-06 20:28:08 · 591 阅读 · 0 评论 -
[FreeRTOS 基础知识] 事件组 概念
在实时操作系统(RTOS)中,事件组是一种用于任务间通信和同步的机制。事件组允许多个任务等待一个或多个事件的组合,当这些事件的组合满足特定条件时,任务可以被唤醒。原创 2024-07-06 17:40:31 · 213 阅读 · 0 评论 -
[FreeRTOS 功能应用] 互斥量 功能应用
函数中通过osThreadDef 宏构建osThreadDef_t 结构体,名称os_thread_def_##name(## 表示字符拼接),结构体成员包括 :#name 任务名称;thread 任务处理函数;priority 任务优先级;若低优先级获取到互斥锁没有释放之前,高优先级任务获取互斥锁失败后会提高低优先级的任务,等低优先级释放锁之后,高优先级才能获取到锁运行。将构建的osThreadDef_t 结构体传入osThreadCreate函数中,实际调用xTaskCreate函数创建任务。原创 2024-07-06 13:25:20 · 911 阅读 · 0 评论 -
[FreeRTOS 内部实现] 互斥量
根据上面的定义,可知创建互斥量本质就是创建队列。长度(第一个参数)为1,大小(第二个参数)为0。通过队列获取互斥量 函数与获取信号量 的方式是一样的。原创 2024-07-06 10:25:48 · 442 阅读 · 0 评论 -
[FreeRTOS 基础知识] 互斥量 概念
若此时中优先级任务B一直占用CPU资源运行,则低优先级任务C永远得不到机会释放信号量,从而高优先级任务A也永远获得信号量运行。此时低优先级任务C获得执行权限,运行并释放信号量sem,同时唤醒高优先级任务执行并恢复之前的优先级。3、在高优先级任务A运行过程中,由于低优先级任务C占用信号量资源,则获取信号量失败,会将任务挂起。2、在中优先级任务B运行过程中,高优先级任务A抢占CPU资源运行,中优先级任务B停止运行。4、高优先级任务A挂起后,中优先级任务B优先获取CPU使用权运行。互斥量比信号量多了个。原创 2024-07-06 09:08:28 · 275 阅读 · 0 评论 -
[FreeRTOS 功能应用] 信号量 功能应用
函数中通过osThreadDef 宏构建osThreadDef_t 结构体,名称os_thread_def_##name(## 表示字符拼接),结构体成员包括 :#name 任务名称;由于是二进制信号量,在释放send信号量后,空间中就存在一个信号量。这个信号量没有被取走之前,继续释放(发送)信号量就会失败。直到信号量被取走,触发等待的释放信号量任务。当连续发送时,数字大于1就会显示发送失败,这个任务放入队列中等候。两个任务Sender1负责释放信号量,一个任务Seceiver接收信号量。原创 2024-06-24 21:51:30 · 676 阅读 · 0 评论 -
[FreeRTOS 内部实现] 信号量
根据上面的定义,可知创建信号量本质就是创建队列。长度(第一个参数)为1,大小(第二个参数)为0。原创 2024-06-24 21:03:51 · 463 阅读 · 0 评论 -
[FreeRTOS 基础知识] 信号量 概念
信号量是一个抽象的数据类型,通常包含一个整数值以及一个等待该值变为正数的任务列表(也称为等待队列)。信号量的整数值代表了系统中某种资源的可用数量。在操作系统中信号量用于控制对共享资源访问的同步机制。它最初由荷兰计算机科学家Edsger Dijkstra提出,用于解决并发系统中的互斥和同步问题。简而言之,信号量是用来表示资源的个数。信号量核心就是个计数值。假如银行能办理业务的窗口只有5个,这里资源数count 指的就是窗口个数5。当窗口没有人办理业务时,count =5 空闲资源;原创 2024-06-24 20:52:35 · 856 阅读 · 0 评论 -
[FreeRTOS 功能应用] 互斥访问与回环队列 功能应用
thread 任务处理函数;:每个任务在创建时都会返回一个任务句柄( TaskHandle_t ),这个句柄可以用来唯一标识一个任务。可以在任务函数中使用 xTaskGetCurrentTaskHandle() 函数获取当前任务的句柄,然后与已知的任务句柄进行比较。在这个示例中, 使用 xTaskGetCurrentTaskHandle() 来获取当前任务的句柄,然后调用 pcTaskGetTaskName() 来获取任务名称,并将其打印出来。这样,每次任务执行时,都会打印出当前是哪个任务在运行。原创 2024-06-23 08:19:41 · 969 阅读 · 0 评论 -
[FreeRTOS 内部实现] 互斥访问与回环队列
等待发布到此队列的阻塞任务列表。按优先级顺序存储。阻塞等待从此队列读取的任务列表。按优先级顺序存储。指向存储区的下一个空闲位置。指向将该结构用作队列时最后从其中读取队列项的位置。原创 2024-06-23 06:58:38 · 415 阅读 · 0 评论 -
[FreeRTOS 基础知识] 互斥访问与回环队列 概念
缓冲区本质上就是数组,假设这个缓冲区的长度为8,写缓冲区指针w刚开始在0的位置,每写一个val,指针w位置+(1%8),以此类推,最后的w+(8%8)。,假设有两个函数(func_A, func_B)都要修改a的值(a++),那么将a定义为全局变量a=0,main函数调用func_A();当有多个任务操作变a时,为了确保每个任务操作a期间不被其他任务所影响,就调用队列来做隔离,任务B要去读a的值时直接调用队列处理好的数据即可。第二个时间片段:任务B运行,读队列,没有得到a的值,将任务B休眠;原创 2024-06-23 06:40:30 · 656 阅读 · 0 评论 -
[FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析
(16)STR r0, [sp, #0x190]: 将r0寄存器的值再次存储到栈指针sp地址偏移0x190的位置。(12)STR r0, [sp, #0x190]: 将r0寄存器的值存储到栈指针sp地址偏移0x190的位置。(10)STR r0, [sp, #0x00]: 将r0寄存器的值存储到栈指针sp地址偏移0的位置。(17)STR r0, [r4, #0x00]: 将r0寄存器的值存储到r4寄存器指向的地址。(11)LDR r0, [r4, #0x00]: 从r4寄存器指向的地址加载数据到r0。原创 2024-06-23 06:21:07 · 1057 阅读 · 0 评论 -
[FreeRTOS 基础知识] 保存现场与恢复现场
在[FreeRTOS 基础知识] 栈 与 汇编语言文章中解析了fun_c汇编函数,假设在执行fun_c函数的过程中产生高优先级的中断。如下图所示。此时刚从RAM的SP栈中获取到值保存到R0,发生中断。此时需要保存R0的值,这样当中断处理函数执行完之后回到此函数还知道R0的值是多少。这就是保存环境。通过RAM架构可知,在SOC上有R0~R15寄存器。汇编语言中可以看出,CPU当前所运行的环境就是这些寄存器构成的。当CPU发生中断、跳转、任务切换的时候,只要将这些寄存器的值保存下来。原创 2024-06-10 18:06:16 · 557 阅读 · 0 评论 -
[FreeRTOS 基础知识] 任务调度 与 链表
此时,当Tick中断到来时遍历优先级为4里的任务,取出task1运行完,将task1移动至task10后面。若要使任务并行运行,可以将吃饭和手机回复信息两个任务的时间打碎并且穿插在一起运行(时间:a1、b1、a2、b2、a3、b3、a4、b4、a5、b5、a6、b6)在RTOS中存在多个任务(假如 task1~ task10),为了实现多任务同时调度运行,内部维护三类任务链表。同样在一个时间段中只能处理手机回复信息任务,这时会循环执行手机回复信息任务(时间:b1 ~ b6)。优先级值越小,任务优先级越高。原创 2024-06-10 18:00:17 · 497 阅读 · 0 评论 -
[FreeRTOS 基础知识] 栈 与 汇编语言
在上面的过程中发现lr的值会被覆盖,若被覆盖就会导致找不到之前函数返回的地方。因此在每个函数的第一条反汇编会把lr值保存到栈中(使用push命令),当函数结束的时候使用pop命令回到之前的位置。所谓的栈就是一块空间的内存,CPU的SP寄存器指向它,它可以用于函数调用,局部变量,多任务系统里保存现场。其中的xxx.axf文件在linker中获取。原创 2024-06-03 21:24:40 · 307 阅读 · 0 评论 -
[FreeRTOS 基础知识] 堆
会先判断g_heap.next_free所指向的头部中size的大小,若大于申请的空间就会划分出两块,一块为分配的空间,另一块为空闲空间。会根据传入的地址(实际可操作的堆空间的起始地址)减去固定的头部大小,找到头部中这块申请的堆空间大小。定义出一块堆的空间heap_buf,可以在这块堆空间上任意申请,使用和释放空间。根据单步调试情况可以看出:buf分配的起始地址就是heap_buf 堆空间起始地址,并且完成对堆空间的写入。,在分配实际内存前有一段头部空间,其中存放分配这段内存的相关信息包括分配的空间大小。原创 2024-06-03 21:16:12 · 790 阅读 · 0 评论 -
[ FreeRTOS 基础知识] RTOS 背景介绍
(1)实时操作系统,本用于追求实时性的嵌入式系统。典型:ucos、uclinux、vxworks(实时性的指当事件产生的时候,需要花多久的时间做出响应。(2)特点:中断响应快、一般可嵌套中断、使用实地址、多任务当发生一个中断,正在处理中断处理程序的时候,又发生一个中断(这个中断的优先级高于正常处理的中断)。系统会从刚刚处理一半的中断处理程序中跳出来,再次中断处理刚发生的这个高优先级中断的处理函数。当执行完这个中断处理函数后,会接着处理之前没有处理完的中断处理函数中执行。原创 2024-05-26 16:55:35 · 334 阅读 · 0 评论