FreeRTOS
文章平均质量分 87
FreeRTOS
~Old
Nothing but more and more nothingness
展开
-
FreeRTOS任务切换分析
就是CPU寄存器的切换(从NEMU学习更有体会,计算机系统基础)假设当任务A切换到任务B时,主要分为两步:第一步:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场第二步:将任务B的各个寄存器值(被存于任务堆栈中)恢复到CPU寄存器中,这个过程叫做恢复现场。上下文切换。保存当前任务的现场、找到要切换的任务,恢复这个要切换任务的现场。原创 2023-12-16 11:57:17 · 433 阅读 · 0 评论 -
FreeRTOS调度器启动过程分析
在Free RTOS中MSP是给系统栈空间使用的,而PSP是给任务栈使用的,也就是说,FreeRTOS任务的栈空间是通过PSP指向的,而在进入中断服务函数时,则是使用MSP指针。因为Cortex-M4的中断优先级有点反直觉:在Cortex-M内核中,优先级的数值越大,表明优先级越低,数值越小代表优先级越高。首先是使用了PRESERVE8,进行8字节对齐,这是因为,栈在任何时候都是需要4字节对齐的,而在调用入口得8字节对齐,在进行C编程的时候,编译器会自动完成对齐操作,而对于汇编,就需要手动进行对齐。原创 2023-12-04 20:31:29 · 557 阅读 · 0 评论 -
FreeRTOS任务创建及细节
每个任务都有自己的任务TCB。任务TCB是一个相对比较大的数据结构,这也是情理之中的,因为与任务相关的代码占到整个FreeRTOS代码量的一半左右,这些代码大都与任务TCB相关,我们先来介绍一下任务TCB数据结构的定义,任务控制块就相当于每个任务的“创建任务首先申请了任务控制块TCB和任务堆栈的内存空间,然后就是初始化堆栈空间的内容,因为,创建任务其实我个人理解就是任务创建属于任务运行时的一种特殊状态,所以创建任务的时候它的栈肯定也是一种形式,所以必须要初始化它的堆栈,然后任务才可以运行。原创 2023-11-27 22:45:23 · 453 阅读 · 0 评论 -
FreeRTOS列表和列表项
FreeRTOS内核调度使用了大量的列表(list)和列表项(listitem)数据结构。它的源码中涉及到很多列表的操作,对于FreeRTOS来说,列表就是它最基础的一部分,列表被用作FreeRTOS调度器使用,用于跟踪任务,处于就绪,挂起,延时的任务都会被挂接到各自的列表中,用户程序如果有需要,也可以使用列表,其中就连FreeRTOS的任务调度其实核心也涉及到列表。FreeRTOS列表使用指针指向列表项。一个列表(list)下面可能有很多个列表项(list item),每个列表项都有一个指针指向列表。原创 2023-11-22 22:48:30 · 819 阅读 · 0 评论 -
FreeRTOS内存管理分析
内存管理对应用程序和操作系统来说非常重要,而内存对于嵌入式系统来说是寸土寸金的资源,FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些函数的具体实现。这样做大有好处,可以增加系统的灵活性,不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理算法。比如对于安全型的嵌入式系统,通常不允许动态分配内存,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放。原创 2023-11-21 22:38:30 · 296 阅读 · 0 评论 -
FreeRTOS优先级翻转
任务优先级翻转在实时操作系统中是不允许出现的,使用互斥量的优先级继承可以解决优先级翻转的问题,但是这里只是能够降低优先级翻转带来的影响,而不能完全消除优先级翻转带来的问题,通俗的说,虽然低优先级任务优先级提高了,但是还是要等优先级低的任务执行释放操作,高优先级任务才可以得以运行,这里只是解决了介于低优先级和高优先级之间中优先级任务带来的问题。比如没有引入互斥量,高优先级需要等待L+M任务运行的时间,引入之后只有任务L运行的时间。一句话:优先级翻转可以减轻,但不能完全消除。原创 2023-02-26 15:25:34 · 757 阅读 · 0 评论 -
FreeRTOS信号量
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的是任务之间的同步,即信号量可以使得一个任务等待另一个任务完成某件事后,才继续执行;而“有序访问”指的是对被多任务或中断访问的共享资源(如全局变量)的管理,当一个任务在访问(读取或写入)一个共享资源时,信号量可以防止其他任务或中断在这期间访问(读取或写入)这个共享资源。信号量是一种特殊的队列,其中二值信号量是长度为1的队列,计数型信号量是长度大于1的队列。原创 2023-02-25 20:24:40 · 1304 阅读 · 0 评论 -
FreeRTOS的Delay函数
使用xTaskDelayUtil(&Pre,n)时,前后两次退出xTaskDelayUntil的时间至少是n个Tick中断。flag为1时表示,Task1正在运行,flag为0时表示Task2正在运行,也就是Task1处于阻塞状态。使用vTaskDelay(n)时,进入,退出vTaskDelay的时间间隔至少是n个Tick中断。个人感觉这两个延时函数就是,比如一个我等3个小时,一个是我等到下午3点的区别。vTaskDelayUntil:指定的是任务执行的间隔,周期。vTaskDelay:指定的是阻塞时间。原创 2023-02-25 17:19:10 · 1593 阅读 · 0 评论 -
FreeRTOS任务基础知识
要注意的是,多任务系统的多个任务可以“同时”运行,是从宏观的角度而言的,对于单核CPU而言,CPU在同一时刻只能处理一个任务,但是多任务系统的任务调度器可以根据相关的任务调度算法,将CPU的使用权分给任务,在任务获得CPU使用权之后的极短时间(宏观角度)后,任务调度器又会将CPU的使用权分配给其他任务,如此往复,在宏观的角度看来,就像是多个任务同时运行一样。从上图中可以看出,相较于单任务系统而言,多任务系统的任务也是具有优先级的,高优先级的任务可以像中断一样抢占,抢占低优先级任务的CPU使用权;原创 2023-02-25 16:53:25 · 2171 阅读 · 2 评论 -
FreeRTOS队列
队列是一种任务到任务,任务到中断,中断到任务数据交流得一种机制。在队列中可以存储数量有限,大小固定得多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项目的最大数量称为队列的长度,在创建队列的时候就需要指定所创建的队列的长度以及队列项目的大小。因为队列是用来在任务与任务或任务与中断之间传递消息的一种机制,因此队列也叫做消息队列。数据存储。原创 2023-02-21 17:40:34 · 1331 阅读 · 0 评论 -
同步互斥与通信
我们可以把多任务系统当作一个团队,里面的每一个任务都相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统所涉及的概念,都可以在现实生活中找到例子。各类RTOS都会涉及这些概念:任务通知(Task nofication)、队列(queue)、事件组(event group)、信号量(semaphore)、互斥量(mutex)等。原创 2023-02-18 20:32:13 · 537 阅读 · 0 评论 -
FreeRTOS系统延时函数分析
FreeRTOS提供了两个系统延时函数,相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束,绝对延时是指每隔指定的时间,执行一次调用vTaskDealyUntil()函数的任务,换句话说,就是任务以固定的频率执行。相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束。绝对延时:指将整个任务的运行周期看作一个整体,适用于需要按照一定频率运行的任务。原创 2023-02-17 22:07:18 · 4765 阅读 · 0 评论 -
FreeRTOS数据类型和编程规范
每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型。宏的名是大小,可以添加小写的前缀。前缀是用来表示:宏在哪个文件定义。函数名的前缀有两部分组成:返回值类型和在哪个文件定义。返回值类型:pointer to void。在timer.c中定义。原创 2023-02-17 21:14:03 · 807 阅读 · 0 评论 -
FreeRTOS的列表和列表项
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS的任务,列表项就是存放在列表中的项目。列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表。列表的特点:列表项间的地址是非连续的,是人为连接到一起的,列表项的数目是由后期添加的个数决定的,随时可以改变。数组的特点:数组成员地址是连续的,数组在最初确定了成员数量后期无法改变。在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适合用列表(链表)这种数据结构。原创 2023-02-16 19:53:55 · 642 阅读 · 1 评论 -
FreeRTOS的Systick和HAL时基
防止在高优先级(优先级高于Systick) 中断服务函数中调用HAL_Delay(),导致中断服务忙等待,这样任何优先级低于该中断的中断都得不到服务(低中断不能打断高中断),当然这里包括os的全部调度。原创 2023-01-10 18:50:15 · 3825 阅读 · 2 评论 -
FreeRTOS概述与体验
1.1 FreeRTOS目录结构以Keil工具下的STM32F103芯片为例,它的FreeRTOS目录如下:主要涉及2个目录:1.2 核心文件FreeRTOS的最核心的文件严格来说只有2个:广义上的 queue.c一般也是经常用到的,但不是必须要的,有的地方也会把queue.c这个文件也认为是必须的。其他文件的作用也一起列表如下:1.3 移植时涉及的文件移植FreeRTOS时涉及的文件放在FreeRTOS/Source/portable/[complier]/[architecture]目录下,比如:RVD原创 2022-06-15 11:48:30 · 1184 阅读 · 0 评论 -
RTOS概念及线程的引入
我们使用的Windows也是操作系统,被称为通用操作系统,使用Windows时,我们经常碰到程序卡死,停顿的现象,日常生活中这可以忍受。但是在电梯系统中,你按住开门键时如果没有即刻响应,即使只是慢个1秒,也会夹住人。在CPU的寄存器里,另一个线程也要用到CPU寄存器,所以CPU寄存器需要保存。局部变量保存在栈里,也是在内存里,只要避免栈不被破坏即可,局部变量无需保存。这种做法,在软件开发上就是使用操作系统,在单片机里叫做使用RTOS。运算的中间值需要保存吗?函数在Flash中,不会被破坏,无需保存。原创 2022-12-15 20:17:19 · 1642 阅读 · 0 评论