首页 > 其他分享 >牛客FreeRTOS刷题总结

牛客FreeRTOS刷题总结

时间:2024-07-21 22:08:25浏览次数:9  
标签:定时器 优先级 函数 FreeRTOS 牛客 任务 堆栈 刷题

1.在 FreeRTOS 中延时函数也相对模式和绝对模式,在 FreeRTOS 中不同的模式用的函数不同,其中函数 vTaskDelay()是相对模式(相对延时函数),函数 vTaskDelayUntil()是绝对模式(绝对延时函数)。两者都会阻塞任务。具体内容可以看博客这一篇:https://www.cnblogs.com/bathwind/p/18139217
2.FreeRTOS时间片的配置方法,时间片需要使用两个配置项configTICK_RATE_HZ和configCPU_CLOCK_HZ共同配合完成,系统会根据这两个配置项来完成对systick的配置。函数vPortSetupTimerInterrupt会被函数vTaskStartScheduler调用,无需手动调用函数vPortSetupTimerInterrupt
3.
这个题信息可以具体去看这个任务切换涉及到了pendsv中断:https://www.cnblogs.com/bathwind/p/18127622
4:每 个 任 务 都 可 以 分 配 一 个 从 0~(configMAX_PRIORITIES-1) 的 优 先 级 ,如configUSE_PORT_OPTIMISED_TASK_SELECTION 设 置 为 了 1 , 那 么 宏configMAX_PRIORITIES 不能超过 32!也就是优先级不能超过 32 级。其他情况下宏configMAX_PRIORITIES 可以为任意值,但是考虑到 RAM 的消耗,宏 configMAX_PRIORITIES最好设置为一个满足应用的最小值。优先级数字越低表示任务的优先级越低,0 的优先级最低,configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为 0。FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。当宏 configUSE_TIME_SLICING 定义为 1 的时候多个任务可以共用一个优先级,数量不限。
5:对于调度器开启过程的分析有助于我们了解整个系统的运行。 vTaskStartScheduler()这个函数开启任务调度器。在任务调度器中主要做以下工作。
(1)、创建空闲任务,如果使用静态内存的话使用函数 xTaskCreateStatic()来创建空闲任务,优先级为 tskIDLE_PRIORITY,宏 tskIDLE_PRIORITY 为 0,也就是说空闲任务的优先级为最低。
(2)、如果使用软件定时器的话还需要通过函数 xTimerCreateTimerTask()来创建定时器服务任务。
(3)、关闭中断,在 SVC 中断服务函数 vPortSVCHandler()中会打开中断。
(4)、变量 xSchedulerRunning 设置为 pdTRUE,表示调度器开始运行。
(5)、调用函数 xPortStartScheduler()来初始化跟调度器启动有关的硬件,比如滴答定时器、FPU 单元和 PendSV 中断等等。具体可以看任务调度器这个博客:https://www.cnblogs.com/bathwind/p/18125003
6:在FreeRTOS中,中断优先级嵌套遵循以下原则;高优先级中断可抢占低优先级中断。同级中断不可抢占。不能被立刻响应的中断会被悬挂。等待高优先级中断退出后才执行。内存是有限的,因此不能无限嵌套
7:在freertos中,如果configCHECK_FOR_STACK_OVERFLOW不为0,需要用户提供一个钩子函数,函数原型如下:
void vApplicationStackOverflowHook( TaskHandle_t xTask,char * pcTaskName );
参数 xTask 是任务句柄, pcTaskName 是任务名字,要注意的是堆栈溢出太严重的话可能会损毁这两个参数, 如果发生这种情况的话可以直接查看变量 pxCurrentTCB 来确定哪个任务发生了堆栈溢出。
configCHECK_FOR_STACK_OVERFLOW1,使用堆栈溢出检测方法 1。上下文切换的时候需要保存现场,现场是保存在堆栈中的,这个时候任务堆栈使用率很可能达到最大值,方法一就是不断的检测任务堆栈指针是否指向有效空间,如果指向了无效空间的话就会调用钩子函数。 方法一的优点就是快!但是缺点就是不能检测所有的堆栈溢出。
configCHECK_FOR_STACK_OVERFLOW
2,使用堆栈溢出检测方法 2。使用方法二的话在创建任务的时候会向任务堆栈填充一个已知的标记值,方法二会一直检测堆栈后面的几个 bytes(标记值)是否被改写,如果被改写的话就会调用堆栈溢出钩子函数,方法二也会使用方法一中的机制!方法二比方法一要慢一些,但是对用户而言还是很快的!方法二能检测到几乎所有的堆栈溢出, 但是也有一些情况检测不到,比如溢出值和标记值相同的时候。
8:时间片钩子函数是使用中最常用的钩子函数之一,在使用时我们需要把configUSE_IDLE_HOOK配置成1,时间片钩子函数需要由用户来实现,FreeRTOS规定了函数的名字和参数:void vApplicationTickHook(void ) 。时间片中断可以周期性的调用该函数,该函数必须非常短小,不能大量使用堆栈,不能调用以”FromISR" 或 "FROM_ISR”结尾的API函数。
9:函数 xTaskCreate()创建一个任务的话那么这个任务的堆栈 是自动 从 FreeRTOS的堆 (ucHeap)中分配的 ,堆栈的大小是由函数xTaskCreate()的 参数 usStackDepth来决定的。
10:xTimerReset()使用定时器命令队列将“重置”命令发送到守护程序任务。xTicksToWait指定在队列已满的情况下,调用任务应保持在阻塞状态以等待计时器命令队列上的空间可用的最长时间。如果xTicksToWait为零并且计时器命令队列已满,则xTimerReset()将立即返回。如果在FreeRTOSConfig.h中将INCLUDE_vTaskSuspend设置为1,则将xTicksToWait设置为portMAX_DELAY将导致调用任务无限期地保持在阻塞状态(无超时),以等待 定时器命令队列中的可用空间。该函数有两个可能的返回值来表示成功和失败:pdPASS和pdFALSE。
11:下面是各种配置项及其含义描述

点击查看代码
#define configUSE_TIMERS                                                     1                                          //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY                     (configMAX_PRIORITIES-1)             //软件定时器优先级
#define configTIMER_QUEUE_LENGTH                                 5                                           //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH            (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
#define configGENERATE_RUN_TIME_STATS                       0                                           //为1时启用运行时间统计功能
#define configTIMER_TASK_PRIORITY                     (configMAX_PRIORITIES-1)             //软件定时器优先级
#define configTIMER_QUEUE_LENGTH                                 5                                           //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH            (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
#define configGENERATE_RUN_TIME_STATS                       0                                           //为1时启用运行时间统计功能

等继续整理继续更新

标签:定时器,优先级,函数,FreeRTOS,牛客,任务,堆栈,刷题
From: https://www.cnblogs.com/bathwind/p/18315033

相关文章

  • A Bit More Common (2024牛客多校1 B)
    进入博客阅读体验更佳:ABitMoreCommon(2024牛客多校1B)|付诺の小站(funuo0728.github.io)ABitMoreCommon题目大意给定两个整数n和m(1\len,m\le5000),在所有长度为n且元素取值范围为[0,2^m)的序列中,计算存在两个合法子序列的序列个数。其中,合法子序列是指......
  • 2024牛客多校1
    2024牛客多校12024年第一场多校赛,打的很一般,多校之前vp的几场多校成绩还不错,一场比赛直接打回原形。赛时队友做的签到题C、H,吃了两发罚时,我自己推的A,出的很快,可惜没注意取模,吃了发罚时,长个记性吧。A给定n,m,p,问长度为n,并且都由小于\(2^m\)的数组成,存在一个子序列的按位且等......
  • 2024牛客2I Red Playing Cards
    本文同步于我的博客。ProblemThereare\(2\cdotn\)cardsarrangedinarow,witheachcardnumberedfrom\(1\)to\(n\)havingexactly2copies.Eachtime,Redcanchooseasubarrayofconsecutivecards(atleast\(2\)cards)toremovefromthedeck.The......
  • FreeRTOS操作系统(详细速通篇)——— 第六章
        本专栏将对FreeRTOS进行快速讲解,带你了解并使用FreeRTOS的各部分内容。适用于快速了解FreeRTOS并进行开发、突击面试、对新手小白非常友好。期待您的后续关注和订阅!目录系统中断管理1什么是中断?1.1中断定义1.2中断执行机制​2中断优先级如何分组 2.1优先级......
  • 2024牛客暑期多校训练营2 解题报告
    B-MST对于整个序列进行一次kruskal对于序列中如果需要访问的点数小于300那么将所有的点的边存入序列中进行kruskal如果大于300那么直接对于所有的点进行kruskal点击查看代码#include<bits/stdc++.h>#defineintlonglong#defineall(x)x.begin(),x.end()#defineral......
  • 2024牛客暑期多校训练营2 HI
    2024牛客暑期多校训练营2H.InstructionsSubstring题意:有一个字符串序列,有WSAD四种操作,可以上下左右移动。可以选取一段连续的子序列,从(0,0)出发,经过连续子序列操作后可以经过点(x,y),问这样的子序列有多少个思路:若一个子序列能够实现到达点(x,y),那么在这个子序列后面加任意字符都......
  • 2024牛客暑期多校训练营2
    H.InstructionsSubstring题目大意:给出一段长为\(n\)的字符串,其中WASD分别代表向上下左右走,给出目的地\((x,y)\),选择一段连续子序列使得从\((0,0)\)出发可以经过目的地,求这样的子序列的总数。思路:用前缀和记录到\(i\)为止到达的位置,从前往后遍历右端点\(r\),找到恰好到......
  • 【组合总和】python刷题记录
    目录思路:回溯法框架:本题中(元素不可重复可复选)如果不重复使用重复使用代码:​拓展1:元素无重复不可复选子集问题:组合问题:全排列问题:拓展2:元素可重复不可复选再--子集问题:PS:润到递归了。下面是超级回溯大法!!!!!思路:使用回溯法解决问题----能够穷举所有解回溯法框架:......
  • 牛客小白月赛98补题
    D一道很典型的区间DP//区间DP典题#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=520;lln,L,R;strings;llsum0[N],sum1[N];llf[N][N];voidsolve(){cin>>n>>L>>R>>s;s='......
  • 2024牛客暑期多校训练营1
    A:ABitCommon题目大意:建立一个长度为n且每个数严格小于\(2^m\)的非空序列A使其存在一个非空子序列B,B中所有元素的与运算结果为1,输出合法A序列的个数。思路:存在子序列合法即该序列合法,其他元素无要求。即可以枚举合法子序列的长度,其他元素均为必定非合法整数。又因为需要结果为......