FreeRTOS
文章平均质量分 82
小乌鱼
java信创jrt coder
展开
-
FreeRTOS任务调度最后篇
“FreeRTOS开启任务调度”一篇说到启动任务调度最后启动Systick定时器,通过SVC中断引导第一个任务执行。然后系统就在Systick的定时中断下调度任务执行,这次介绍最后的部分,Systick和PendSV。SysTick时钟是STM32的一个定时器,使能之后设置中断频率就会按频率触发SysTick中断。这样就可以用SysTick中断给OS切换任务提供时机。因为硬件是中断来了就会把CPU当前任务压栈,会执行中断处理函数,中断处理完成后会出栈之前数据。继续执行之前被中断的任务。在没OS情况下都是在原创 2022-05-28 20:14:03 · 1231 阅读 · 0 评论 -
FreeRTOS开启任务调度
前面的系列介绍里List、TCB、创建任务流程及调度的重要变量等。现在从vTaskStartScheduler看看任务是怎么被调度的。要启动调度之前先要初始化硬件信息,要先设置硬件时钟和中断优先级,和逻辑差不多。#include "InitOS.h"//初始化硬件void InitHardware(void){ //从处于预期状态的时钟开始 RCC_DeInit(); //启动HSE高速时钟 RCC_HSEConfig(RCC_HSE_ON); //等待时钟就绪 while (RCC原创 2022-05-21 20:12:20 · 1157 阅读 · 0 评论 -
FreeRTOSMini挂起和恢复任务
FreeRTOSMini作为FreeRTOS的学习练习。之前实现了OS内核最小调度的创建任务和任务调度及延迟函数。没有实现任务挂起和恢复功能。今天下雨,在家继续给Mini加功能,要加入的就是挂起和恢复任务功能。为了挂起找到任务的TCB,提供按任务名称得到TCB句柄的方法。源码地址测试程序开启3个LED任务闪动LED0,LED1,LED2,同时开启一个蜂鸣器任务5秒一响,再开启一个检测按键任务监测Key0,Key1,Key2,KeyUP按键事件。按下Key0就挂起或者恢复LED0的任务。按Key1就是挂起原创 2022-05-15 15:23:50 · 271 阅读 · 0 评论 -
FreeRTOS创建任务
CPU有这些寄存器。R0-R12为通用寄存器。R13为栈顶指针,在OS时候中断函数的R13使用MSP的指针(内核态)。非中断里面使用PSP指针(用户态)。正是有双堆栈指针可以保证OS切换任务不会盖用户程序的堆栈状态。对于OS和任务都是C语言编译的逻辑。OS可不知道任务在要切换时候运行的指令,对于OS来说也不需要关心任务执行的指令。只要确保以下就可以保证任务切换出去后再切换回来时候保持不变。1.剥夺任务CPU后运行其他指令不会覆盖任务用的内存空间。TCB、栈空间等。2.任务切换回来的时候能把任务切换前原创 2022-05-14 16:59:42 · 1326 阅读 · 0 评论 -
FreeRTOS任务调度主要变量
之前介绍的和FreeRTOS任务调度相关的数据结构即内存分配实现。xLIST、heap_4、TCB结构体。任务调度就是基于这些结构体实现。这次介绍调度相关的主要变量。代码在FreeRTOSMini.c文件签名部分。//当前的任务序号,生成任务唯一号PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = (UBaseType_t)0U;//当前执行任务的tcbPRIVILEGED_DATA TCB_t* volati原创 2022-05-11 21:01:30 · 546 阅读 · 0 评论 -
FreeRTOS之TCB
FreeRTOSMini实现了最小任务调度。现在分开介绍进程调度重要部分。进程调度的基础首先是定义任务调度的数据结构,来保存任务堆栈结构和任务状态所在状态列表,然后就是任务的优先级唯一号等。最小Mini内核参照“FreeRTOSMini”篇,包含源码下载地址。TCB重要信息有:1.栈顶指针(pxTopOfStack并且告诉编译器不要优化,随时会变化),和芯片位数一致的整形指针指向任务栈顶。任务让出CPU时候要把寄存器R0-R15、程序计数器、程序状态寄存器等CPU执行上下文压到任务栈。任务被执行时候要原创 2022-05-07 20:12:33 · 1633 阅读 · 0 评论 -
FreeRTOSMini
最近在研究实时操作系统FreeRTOS。FreeRTOS作为开源的RTOS,源码规模不大,可以供操作系统学习,加上我的STM32 Nano开发板正好可以学习OS。借着五一放假宅家里学习。实现的FreeRTOSMini源码FreeRTOS有很强的可配置性和硬件适配性。代码里面有大量的宏定义和宏代码分支,看着比较费解,还有一些汇编和关键操作比较费解。然后融合了其他功能增加开始学习难度。读和跟了源码很久才搞头,为了验证是否理解到位,阉割出一个Mini版的系统,只包含基本的任务调度。本次开发基于FreeRTO原创 2022-05-03 16:43:40 · 925 阅读 · 0 评论 -
FreeRTOS之heap4
操作系统离不开内存管理。FreeRTOS提供了5种内存管理方法。实现在portable\MemMang里heap1到heap5。每种管理方案策略不同。我采用的是比较有代表性的heap4管理方案。该模式定义了ucHeap全局数组充当堆内存池。然后通过链表管理未分配的内存块空间。首先所有的堆和栈内存空间申请都来着ucHeap的数组。然后没分配一块内存就到可用链表里找到第一个合适的自由块分配给使用者。如果该块大于申请大小。分配后就有一个剩余空间,如果剩余空间小于管理用的结构体占用空间,那么剩余空间不用再构建新的空原创 2022-05-01 08:09:28 · 2260 阅读 · 1 评论 -
FreeRTOS之xLIST
基础结构决定上层建筑。FreeRTOS作为实时操作系统,首先作为操作系统肯定重要任务就是任务调度。那么任务调度就涉及到多种任务状态的管理。比如:挂起的任务、就绪的任务、正在执行的任务。那么这些任务的管理就需要数据结构。可以采用数组来管理,但是任务是频繁在挂起、就绪、运行状态切换。因此数组需要来回移动元素,太低效了。同时每个任务列表的大小也不好定,定义大了浪费空间,定义小了空间不够还得拷贝数组。要理解FreeRTOS的任务调度就必须先理解FreeRTOS的列表实现。下图为空List初始化状态,和插入第一个列原创 2022-05-01 07:49:50 · 1394 阅读 · 0 评论