哈士奇上蔚
这个作者很懒,什么都没留下…
展开
-
FreeRTOS基础六:中断管理2
我们可以把这一些需要受内核管理的中断,优先级设置的低一些,把另一些不允许关闭的中断优先级设置的高一些,然后通过BASEPRI这个寄存器把优先级低于某个值的(优先级寄存器的值大于等于某个值的)中断一口气全屏蔽掉,这样我们在进入临界段前,只保存BASEPRI的值就好了。如下图所示,向一个STM32F103单片机的中断A的优先级寄存器中写入数据0101_1111,向中断B的优先级寄存器中写入数据0111_1111,由于只有高4位有效,因此中断A的数值优先级是5,中断B的数值优先级是7,且B的优先级高于A。原创 2023-08-19 22:09:54 · 1199 阅读 · 0 评论 -
FreeRTOS基础一:源码结构和移植
初步认识FreeRTOS的源码包结构注:croutine.c实现了FreeRTOS的协程(co-routine)功能。协程通常被用在低端,RAM很小的微处理器上,如今并不常用,FreeRTOS也不会再对此功能进行更新。FreeRTOS |────Source 目录,存放FreeRTOS源代码文件 | ├─include 目录,内核通用头文件 | ├─portable 目录,编译器+处理器适配文件 |原创 2022-04-08 19:32:53 · 2485 阅读 · 0 评论 -
FreeRTOS基础二:堆内存管理之heap_4方案
简介heap_4方案也是要定义一个全局数组ucHeap,用于当做堆内存池,其大小在FreeRTOSConfig.h中使用configTOTAL_HEAP_SIZE 来定义。heap_4方案在绝大多数情况下都优于标准库中的malloc()和free()函数。/* Allocate the memory for the heap. */#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) /* The application writer has already原创 2022-04-07 16:25:21 · 5649 阅读 · 0 评论 -
FreeRTOS基础七:资源管理
实现多个任务对同一个资源的互斥访问,以确保资源在使用过程中的状态的一致性,确保安全使用。FreeRTOS使用了PendSV和SysTick中断。要将configKERNEL_INTERRUPT_PRIORITY 设置为系统中优先级最低的值。这个优先级是用来设置PendSV和SysTick中断的优先级。在port.c文件中的xPortStartScheduler函数中,内核配置了PendSV和SysTick中断的优先级。临界区临界区的底层原理是非常简单而粗暴的。互斥体互斥体原创 2023-09-24 17:02:09 · 716 阅读 · 0 评论 -
FreeRTOS基础九:任务通知
简介总体上来说,FreeRTOS应用由多个任务和中断函数构成。任务与任务,任务与中断函数之间可能需要通信(或者是同步,广义上来说同步也属于通信)。前面我们已经介绍了使用一些通信媒介对象,如队列,事件组以及信号量来完成通信或者同步。通过队列,事件组以及信号量来完成通信,都需要创建一个通信媒介对象,通信的内容会经过这个通信媒介对象来传递,例如任务A向队列中放数据,然后队列B从队列中读取数据。这种通信方式属于间接通信。本章介绍的任务通知(Task Notifications)技术,属于直接通信技术原创 2021-11-14 17:07:24 · 299 阅读 · 0 评论 -
FreeRTOS基础五:软件定时器
软件定时器的作用:在指定的时间到来时执行指定的函数,或者以某个频率周期性地执行某个函数。被执行的函数叫做软件定时器回调函数。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在调用定时器回调函数时才需要占用CPU时间。在FreeRTOS应用程序中使用软件定时器,则需要:将软件定时器的源码(FreeRTOS/Source/timers.c)添加到项目中 在FreeRTOSConfig.h中定义configUSE_TIMERS为1软件定时器回调函数软件定时器回调函数的原型如原创 2022-04-08 16:44:18 · 11920 阅读 · 3 评论 -
FreeRTOS基础四:特殊的队列之邮箱
邮箱(Mailbox)FreeRTOS中的队列有一种特殊的用法,我们把它叫做邮箱。邮箱不是另一种组件,它还是队列,只是用法比较特殊而已。邮箱是长度为1的队列原创 2022-04-11 16:38:49 · 11119 阅读 · 0 评论 -
FreeRTOS基础四:队列
FreeRTOS中的队列组件提供了任务到任务,任务到中断以及中断到任务的通信机制。当队列创建的时候,队列的长度和元素的大小都设定好了。队列的基本特性备份入队策略Queue by copy vsersus Queue by reference队列的创建和使用使用xQueueCreate()内核函数来创建一个队列。队列的存储空间从FreeRTOS heap中分配。在使用xQueueCreate()创建队列时,如果FreeRTOS heap中没有足够的存储空间分配给当前队列,则函数原创 2022-04-11 15:33:57 · 7597 阅读 · 1 评论 -
FreeRTOS基础六:中断管理1
嵌入式实时系统需要对外界的某个事件做出及时的响应动作。例如串口外设收到了一帧数据后,需要通知数据解析任务,同时还要将数据传递给解析任务,完成数据的处理。设计出一种好的策略来完成这个过程时需要考虑以下几个问题:如何检测事件?中断是主要的事件检测手段,但是也可以使用轮询法。 当中断发生后,应该将多少处理工作放在中断服务函数(ISR)中,将另外的多少处理工作放在中断函数外(也就是main函数)?通常的经验是,在中断服务函数中尽可能做最少的工作,保证中断服务函数能迅速执行完成。 当中断检测到事件发生时,中断原创 2021-11-15 16:00:09 · 7243 阅读 · 0 评论 -
FreeRTOS基础三:任务管理2
时间片和tick中断时间片轮转机制并不保证优先级相同的任务会均分CPU时间,它只保证处于就绪态且优先级相同的多个任务会轮流从就绪态转为运行态。Idel任务带有时间片轮转机制且基于优先级的抢占式调度器算法这种调度算法是FreeRTOS应用使用最多的算法策略。为了使用这种调度算法,需要在FreeRTOSConfig.h中将下面两个宏定义为1。#define configUSE_PREEMPTION 1 //使用抢占式调度算法#define configUSE_TI...原创 2021-11-01 20:07:20 · 3739 阅读 · 1 评论 -
FreeRTOS基础三:任务管理1
任务函数每一个任务在创建时都需要绑定一个任务函数,作为任务执行的逻辑,通俗说就是告诉这个任务该做些什么工作。在FreeRTOS中,任务函数需要满足以下要求:函数原型固定为:void TaskFunction(void* pvParameters) 函数的主体流程必须是一个无限循环,不能像普通的函数一样执行完就退出,它应该永不退出,直到任务被删除void TaskFunction(void* pvParameters){ uint32_t a = 0; uint原创 2021-10-31 15:09:04 · 1877 阅读 · 0 评论