freertos笔记-内核函数配置

本文详细介绍了FreeRTOS任务调度器的启动流程,包括任务创建、软件定时器的开启和中断设置。重点讲解了任务的建立,如分配堆栈空间、初始化任务参数,以及如何将任务添加到就绪列表。此外,还提到了任务管理的相关函数,如任务删除、任务切换和中断管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红叶何时落水

开启任务调度器
流程
1.建立空闲任务
2.开启软件定时器
3.调用xPortStartScheduler()设置pendsv和滴答定时器中断,并开启第一个任务

具体流程
1.建立空闲任务 xTaskCreate();
 (1). 创建一个pxStack指针,分配相应大小的空间,堆栈空间*4字节
 (2). pxNewTCB, 给任务结构体分配空间,与堆栈空间挨着,但不重叠
 (3). 结构体与堆栈连接起来, pxNewTCB->pxStack = pxStack;//以上是空间分配
 (4). 初始化任务 prvInitialiseNewTask();//以下是任务参数的初始化
    1). 初始化任务的堆栈栈顶指针pxTopOfStack == 栈顶(pxStack + size)
    2). 把任务名字存储起来
    3). 检测优先级是否超过最大值,超过的话,设置为最大值,并且赋值给结构体pxNewTCB->uxPriority = uxPriority;
    4). 是否开启互斥,开启的话,保存原始优先级
    5). 初始化任务结构体中的两个链表项,
        将列表项中的任务指向指针指向自己,
        并将xEventListItem项值初始化 == configMAX_PRIORITIES - uxPriority
        //???这样的话,优先级越高,在列表中越靠前,就越先执行(当然只限于第一次执行)
    6). 各种特殊功能初始化 
    7). 初始化线程本地存储指针pxPortInitialiseStack();
            pxPortInitialiseStack_1. pxTopOfStack--;xPSR入栈
            pxPortInitialiseStack_2. pxTopOfStack--;PC = 任务函数指针 入栈
            保存各种寄存器以及函数参数啥的
            最后返回栈顶指针
            以上就是保存任务的运行环境
    8). 返回句柄 *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
 (5). 将任务添加到就绪列表中 prvAddNewTaskToReadyList();
    具体操作看列表运行原理
 (6). return xReturn;
2.开启软件定时器

3.调用xPortStartScheduler()设置pendsv和滴答定时器中断
 (1). 配置两个中断的优先级为15
 (2). vPortSetupTimerInterrupt();设置滴答定时器计时间隔
 (3). prvStartFirstTask();开启第一个任务
    1). VTOR 寄存器的地址 0XE000ED08 赋值给R0, 获取向量表的起始地址0X08000000
    2). 从向量表中获取MSP的值,并将MSP复位,即不再使用MSP
    3). 打开中断,调用SVC服务例程 vPortSVCHandler();
        SVC_1. 获取当前任务的任务栈顶指针
        SVC_2. 将任务里的运行环境出栈,设置PSP
        SVC_3. 设置线程模式,退出中断,开始运行第一个任务


删除任务 vTaskDelete 句柄不会被置空 确实不会


taskYIELD() 任务切换。
taskENTER_CRITICAL() 进入临界区,用于任务中。
taskEXIT_CRITICAL() 退出临界区,用于任务中。
taskENTER_CRITICAL_FROM_ISR() 进入临界区,用于中断服务函数中。
taskEXIT_CRITICAL_FROM_ISR() 退出临界区,用于中断服务函数中。
taskDISABLE_INTERRUPTS() 关闭中断。
taskENABLE_INTERRUPTS() 打开中断。
vTaskStartScheduler() 开启任务调度器。
vTaskEndScheduler() 关闭任务调度器。
vTaskSuspendAll() 挂起任务调度器。
xTaskResumeAll() 恢复任务调度器。
vTaskStepTick() 设置系统节拍值。


vTaskSuspendAll() 挂起任务调度器。
调度器挂起是支持嵌套的。使用函数 xTaskResumeAll()可以恢复任务调度器,
调用了几次 vTaskSuspendAll()挂起调度器,同样的也得调用几次 xTaskResumeAll()才会最终恢复任务调度器。

uxTaskPriorityGet() 查询某个任务的优先级。
vTaskPrioritySet() 改变某个任务的任务优先级。
uxTaskGetSystemState() 获取系统中任务状态。
vTaskGetInfo() 获取某个任务信息。
xTaskGetApplicationTaskTag() 获取某个任务的标签(Tag)值。
xTaskGetCurrentTaskHandle() 获取当前正在运行的任务的任务句柄。
xTaskGetHandle() 根据任务名字查找某个任务的句柄
xTaskGetIdleTaskHandle() 获取空闲任务的任务句柄。
uxTaskGetStackHighWaterMark()获取任务的堆栈的历史剩余最小值,FreeRTOS 中叫做“高水位线”
eTaskGetState() 获取某个任务的壮态,这个壮态是 eTaskState 类型。
pcTaskGetName() 获取某个任务的任务名字。
xTaskGetTickCount() 获取系统时间计数器值。
xTaskGetTickCountFromISR() 在中断服务函数中获取时间计数器值
xTaskGetSchedulerState() 获取任务调度器的壮态,开启或未开启。
uxTaskGetNumberOfTasks() 获取当前系统中存在的任务数量。
vTaskList()以一种表格的形式输出当前系统中所有任务的详细信息。
vTaskGetRunTimeStats() 获取每个任务的运行时间。
vTaskSetApplicationTaskTag() 设置任务标签(Tag)值。
SetThreadLocalStoragePointer() 设置线程本地存储指针
GetThreadLocalStoragePointer() 获取线程本地存储指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红叶落水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值