![](https://img-blog.csdnimg.cn/direct/77cff4c75f3244d3b49d7623bef723bc.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
跟着野火学习FreeRTOS
文章平均质量分 95
基于野火公司的《FreeRTOS 内核实现与应用开发实战指南》(基于STM32)来学习实时操作系统FreeRTOS,这里的文章食对学习过程的一个记录,也是为了强化学习效果。
qqssss121dfd
practice,practice,practice,excellent .
展开
-
跟着野火学FreeRTOS:第二段(任务通知)
接收通知的任务如果没有接收到任务通知的话就一直处于等待状态,发送任务通知的任务检测到按键按下就发送任务通知给接收任务通知的任务。等都可以用来实现任务之间的通信,这里我们介绍的任务通知也可以用来实现任务之间的通信,任务通知和前面我们介绍过的实现任务之间的通信的方法最大的区别是,在使用任务通知之前不需要创建某个对象,但是对于。任务通知可以实现我们前面介绍过的那些实现任务之间的通信的方法实现的功能,只不过相对的是一个轻量化的版本,不能完全取代,它们各有优缺点。表示任务通知的状态,收到或者没有收到任务通知,原创 2024-03-08 20:23:54 · 959 阅读 · 0 评论 -
跟着野火学FreeRTOS:第二段(软件定时器)
软件定时器本身是不占用任何处理时间的,除非软件定时器的回调函数正在执行。其实软件定时器的创建就是初始化了软件定时器控制块,每一个创建的软件定时器都有一个软件定时器控制块和其对应,软件定时器控制块需要占用。下面的例子创建了一个一次性的软件定时器(周期为3秒)和一个周期性的软件定时器(周期为2秒),回调函数只是简单的打印出当前的。图3和图4分别是周期性的软件定时器和一次性的软件定时器的状态迁移图。软件定时器的回调函数其实是在一个特殊的任务里面执行的,这个任务叫做。,那么这个软件定时器是周期性的定时器,每过。原创 2024-03-04 15:13:50 · 928 阅读 · 0 评论 -
跟着野火学FreeRTOS:第二段(堆存储管理)
这里的存储空间的分配算法的流程是首先从空闲链表的起点开始直到找到第一个比所请求分配的存储空间大于等于的空闲块,然后把这个空闲块分配给相应的内核对象,从前面我们知道每一个空闲块的最前面存储的是这个空闲块对应于在空闲链表中的节点,但是当这个空闲块分配给内核对象的时候,这个空闲块前面存储这个空闲块对应于在空闲链表中的节点的空间内核对象是没有使用的,这一点要注意。不仅对请求的存储空间的大小有对齐操作,对每次分配的存储空间的起始地址也有对齐的操作(假设是8个字节对齐的话,如果准备从图1的数组定义的存储空间的地址。原创 2024-02-29 13:53:31 · 850 阅读 · 0 评论 -
跟着野火学FreeRTOS:第二段(事件组)
在小节里面介绍了二进制信号量,计数信号量,互斥量和递归互斥量等功能,其中二进制信号量和计数信号量(也包括队列)常用于任务和任务之间以及任务和中断之间的同步,她们具有以下属性:当等待的事件没有发生的时候可以让等待的任务进入阻塞状态当等待的事件发生之后可以将因为等待事件发生而进入阻塞状态的任务唤醒,如果有多个任务在等待同一个事件发生的话,那么此时被唤醒的是优先级最高的任务,其它任务依然还是处于阻塞状态。 &n原创 2024-02-23 17:14:29 · 987 阅读 · 0 评论 -
跟着野火学FreeRTOS:第二段(队列管理)
参数,当这个参数不为0的时候,如果任务在尝试读队列的时候,队列为空,这时任务会进入阻塞状态等待其它任务或中断服务程序往这个队列里面写入数据,如果在参数配置的时间之内有其它任务或中断服务程序往这个队列里面写入了数据,那么这个处于阻塞状态的任务会立即转换为就绪态,假设在参数配置的时间之内没有其它任务或中断服务程序往这个队列里面写入了数据,这个处于阻塞状态的任务也会自动转换为就绪态。)的优先级大于数据接收任务的优先级,因此轮到接收数据的任务接收数据的时候队列应该已经满了,所以接收任务的阻塞时间设置为0。原创 2024-01-23 16:31:33 · 1001 阅读 · 0 评论 -
跟着野火学FreeRTOS:第一段(基础介绍)
多任务相比起前后台实时性进一步提高,主要体现在事件执行的实时性提高,只要当前的事件的优先级够高的话,可以马上执行,不会像前后台那样还有可能需要等待一段时间(假设在中断响应事件2的时候已经有事件1正在执行,那么中断响应事件2之后只有等待事件1执行完之后才能开始执行事件2)。的时候,事件2和事件3的执行请求被触发,这样事件2和事件3的执行标志会被相应的中断立即置1,但是事件2和事件3并不会马上被执行,只有在执行完事件1之后才会接着执行事件2最后才是事件3。这里在插入之前的链表是一个空的表,没有实际的链表元素。原创 2023-12-15 14:22:09 · 1156 阅读 · 0 评论 -
跟着野火学FreeRTOS:第一段(空闲任务与阻塞延时的实现)
中任务1和任务2的建立基本没有区别,只是这个任务需要插入到就绪列表数组中索引为0的链表中,这是因为空闲任务在系统中的优先级是最低的,只有当前没有任务执行或任务需要延迟的时候采取执行它,就绪列表数组的索引号就代表着挂到该元素对应的链表里面的任务的优先级,索引号越大,优先级越高。资源,就算此时没有任何任务需要执行那我们就可以执行我们专门建立的一个空闲任务,这个空闲任务可以上什么都不干或者进入低功耗模式来节能,当相应任务的延时到期的时候再转去执行对应的任务,这样的话。的值为0的时候才会再次恢复执行。原创 2023-12-21 16:45:26 · 903 阅读 · 0 评论 -
跟着野火学FreeRTOS:第一段(优先级)
任务可以被调度的前提是它有被挂载在就绪列表中(还在延时中的任务应该就不会放在就绪列表了,应该会被刚在阻塞列表,这个后面会讲到),就绪列表可以说就是一个链表的数组,就绪列表的每一个元素都是一个链表的根节点,数组的索引越小,表示挂载到这个链表上的任务的优先级最低,所以空闲任务挂载到索引为0的链表中。(相对于源代码中的定义有改动,只是简单的将对应的优先级比特位置0,而不是先判断该比特位对应的优先级下是否还有就绪的任务存在,只有当该比特位对应的优先级下没有有就绪的任务存在的时候才将对应的优先级比特位置0。原创 2023-12-24 11:04:07 · 926 阅读 · 0 评论 -
跟着野火学FreeRTOS:第一段(任务延时列表)
延时列表实现延时的基本思想是,当任务需要延时的时候就将任务插入到延时列表,不让任务继续执行且将任务从就绪列表里面删除,同时记录延时结束的时刻,延时结束的时刻为当前的记录。的值更新为这个延时列表中最早延时结束的任务的延时时刻并跳出循环,否则将当前延时列表中最早延时结束的任务从延时列表删除并加入到就绪列表并继续循环。周期,任务1先调用延时操作,任务2后调用延时操作,那么此时任务1的结束时刻为5,任务2的结束时刻为10,但是这里。该接口首先记录此时的。的值总是所有任务中延时结束时刻最早的任务的结束延时的时刻值。原创 2023-12-24 17:40:41 · 1214 阅读 · 0 评论 -
跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)
在裸机系统中,系统的主体就是CPUCPUCPU按照预先设定的程序逻辑在mainmainmain函数里面顺序执行的无限循环。在多任务系统中,根据功能的不同,把整个系统分割成一个个独立的,无限循环且不能返回的的函数,这个函数我们称为任务。 在几乎所有的处理器架构中都会用到STACK,栈STACK,栈STACK,栈这种数据结构,它用来存储函数调用的参数,局部变量。当异常发生的时候它也可以用来存储原创 2023-12-20 15:41:47 · 938 阅读 · 0 评论