FreeRTOS学习笔记(一)

news2024/11/19 17:37:49

一、基础知识思维导图

在这里插入图片描述
vtaskdelay函数会开启中断,所以在临界区不能用vtaskdelay

二、任务的创建与删除

2.1、任务的动态创建与删除
在这里插入图片描述

........

#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );

#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );

.........

int main()
{

.......

    xTaskCreate((TaskFunction_t         )   start_task,						//任务函数名
                (char *                 )   "start_task",
                (configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,			//任务堆栈大小
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,				//任务优先级
                (TaskHandle_t *         )   &start_task_handler );			//任务句柄
	vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();               /* 进入临界区 */
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
    vTaskDelete(NULL);					//删除任务
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/* 任务一,实现LED0每500ms翻转一次 */
void task1( void * pvParameters )
{
    while(1)
    {
        printf("task1正在运行!!!\r\n");
        LED0_TOGGLE();
        vTaskDelay(500);
    }
}

在这里插入图片描述

三、任务的恢复与挂起

/* 任务三,判断按键KEY0,按下KEY0删除task1 */
void task3( void * pvParameters )
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)			//按键一按下
        {
            printf("挂起task1\r\n");
            vTaskSuspend(task1_handler);	//任务挂起函数,使用时需将宏 INCLUDE_vTaskSuspend  配置为1。
        }else if(key == KEY1_PRES)		//按键二按下
        {
            printf("在任务中恢复task1\r\n");
            vTaskResume(task1_handler);	
        }
        vTaskDelay(10);
    }
}

如果在中断中用恢复函数需要在函数后带FromISR后缀,vTaskResumeFromISR()

四、freertos中断管理

系统所管理的优先级范围:5~15,也就是说优先级在0-4以内的中断freertos不能控制它们。

五、FreeRTOS临界段代码保护及任务调度器挂起和恢复

5.1、临界代码段

什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,如:iic、spi的初始化等。

在这里插入图片描述
在这里插入图片描述

5.2、任务调度器的挂起与恢复

在这里插入图片描述
在这里插入图片描述
1、与临界区不一样的是,挂起任务调度器,未关闭中断;
2、它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
3、挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全;

六、FreeRTOS列表和列表项

6.1、列表相关API函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:函数vListInsert(),是将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中
在这里插入图片描述
总结:函数vListInsertEnd(),是将待插入的列表项插入到列表 pxIndex 指针指向的列表项前面;它是一种无序的插入方法!!
在这里插入图片描述
在这里插入图片描述

七、任务调度

7.1、启动第一个任务

prvStartFirstTask () 	/* 开启第一个任务 */
vPortSVCHandler () 	/* SVC中断服务函数 */

1、中断产生时,硬件自动将xPSR,PC(R15),LR(R14),R12,R3-R0出/入栈;而R4~R11需要手动出/入栈
2、进入中断后硬件会强制使用MSP指针 ,此时LR(R14)的值将会被自动被更新为特殊的EXC_RETURN

7.2、prvStartFirstTask ()函数
用于初始化启动第一个任务前的环境,主要是重新设置MSP 指针,并使能全局中断

什么是MSP指针?
程序在运行过程中需要一定的栈空间来保存局部变量等一些信息。当有信息保存到栈中时,MCU 会自动更新 SP 指针,ARM Cortex-M 内核提供了两个栈空间:
在这里插入图片描述
为什么是 0xE000ED08?
因为需从 0xE000ED08 获取向量表的偏移,为啥要获得向量表呢?因为向量表的第一个是 MSP 指针!取 MSP 的初始值的思路是先根据向量表的位置寄存器 VTOR (0xE000ED08) 来获取向量表存储的地址;在根据向量表存储的地址,来访问第一个元素,也就是初始的 MSP

CM3 允许向量表重定位——从其它地址处开始定位各异常向量 这个就是向量表偏移量寄存器,向量表的起始地址保存的就是主栈指针MSP 的初始值

7.3、vPortSVCHandler ()
当使能了全局中断,并且手动触发 SVC 中断后,就会进入到 SVC 的中断服务函数中
在这里插入图片描述
在这里插入图片描述
7.4、任务切换
任务切换的本质:就是CPU寄存器的切换。

在这里插入图片描述
注意:任务切换的过程在PendSV中断服务函数里边完成
在这里插入图片描述
PendSV中断是如何触发的?
1、滴答定时器中断调用
2、执行FreeRTOS提供的相关API函数:portYIELD()
本质:通过向中断控制和状态寄存器 ICSR 的bit28 写入 1 挂起 PendSV 来启动 PendSV 中断

在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7 安装 MySQL8.0

由于centOS7中默认安装了 MariaDB , 需要先进行卸载 # 查看版本 rpm -qa | grep mariadb # 卸载 rpm -e --nodeps 文件名 # 查看是否卸载干净 rpm -qa | grep mariadb安装wget: yum -y install wget进入/usr/local/下: cd /usr/local/新建mysqlrpm文…

基于SSM的药品管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:VueHTML 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 …

LATR:3D Lane Detection from Monocular Images with Transformer

参考代码:LATR 动机与主要工作: 之前的3D车道线检测算法使用诸如IPM投影、3D anchor加NMS后处理等操作处理车道线检测,但这些操作或多或少会存在一些负面效应。IPM投影对深度估计和相机内外参数精度有要求,anchor的方式需要一些如…

嵌入式系统开发【深入浅出】 EXTI 与 NVIC

目录 CPU 感知外部事件变化的三种方式 中断分三个级别 中断控制器 STM32 的中断和异常 NVIC 中断控制器 NVIC 结构体成员 抢占优先级和响应优先级 简单配置NVIC中断控制器 EXTI 外部中断【中断源级】​ STM32系列微控制器实际上最多有23根外部中断线(EXT…

【数据结构C/C++】顺序与链式二叉树创建与前中后、层序遍历

文章目录 顺序存储结构二叉树链式存储结构二叉树刷题推荐408考研各数据结构C/C代码(Continually updating) 顺序存储结构二叉树 顺序存储结构的二叉树的特点在于,其使用数组存放二叉树中的每一个节点。 我们设定根节点的数组索引下标为n&…

忘记压缩包密码?解决方法一键找回,省时又便捷!

使用在线rar/zip解密工具,找回rar/zip密码并解密压缩包的方法非常简单。具体步骤如下:首先,在百度上搜索“密码帝官网”,这是一个专业的解密服务网站。然后,点击搜索结果中的链接,进入官网首页。在页面上方…

节能环保的选择:OLED透明拼接屏在葫芦岛市市场的成功应用

葫芦岛市位于中国辽宁省东北部,是一个拥有悠久历史和丰富自然景观的城市。 近年来,OLED透明拼接屏在葫芦岛市的市场表现备受瞩目,成为该市展示技术的重要代表。 OLED透明拼接屏以其出色的显示效果和高清清晰度而闻名,能够提供出…

大模型部署手记(9)LLaMa2+Chinese-LLaMA-Plus-7B+Windows+llama.cpp+中文文本补齐

1.简介: 组织机构:Meta(Facebook) 代码仓:GitHub - facebookresearch/llama: Inference code for LLaMA models 模型:llama-2-7b、Chinese-LLaMA-Plus-7B(chinese_llama_plus_lora_7b&#x…

使用/deep/覆盖element中的样式

我们在开发Vue项目的时候一般都会在组件中的style标签上面添加scoped属性&#xff0c;从而避免父组件影响子组件的样式&#xff0c;达到只修改当前组件样式的目的。 <style scoped lang"scss">... </style> 其原理是——在打包的时候会给每个选择器都添…

什么是存储服务器?

随着互联网的发展&#xff0c;越来越多的信息会在网络上暴露&#xff0c;所以企业就会更加重视数据&#xff0c;因此更加安全可靠的数据存储服务器受到了大多数人的信赖&#xff0c;今天就让小编带大家了解一下什么是存储服务器吧&#xff01; 存储服务器的含义。存储服务器是…

基于乌燕鸥优化的BP神经网络(分类应用) - 附代码

基于乌燕鸥优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于乌燕鸥优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.乌燕鸥优化BP神经网络3.1 BP神经网络参数设置3.2 乌燕鸥算法应用 4.测试结果&#x…

常见的Web安全漏洞(2021年9月的OWASP TOP 10)

聊Web安全漏洞&#xff0c;就不得不提到OWASP TOP10。开放式Web应用程序安全项目&#xff08;OpenWeb Application Security Project&#xff0c;OWASP&#xff09;是一个开源的、非营利的组织&#xff0c;主要提供有关Web应用程序的实际可行、公正透明、有社会效益的信息&…

每日一题 2731. 移动机器人(中等,模拟)

思路: 机器人是完全相同的且移动速度一样&#xff0c;所以对于碰撞后转向的机器人&#xff0c;可以看作是不碰撞继续运动。可以这么理解&#xff0c;如果没有碰撞&#xff0c;在移动后坐标 i 处有一个机器人&#xff0c;那么存在碰撞的情况下&#xff0c;坐标 i 处任有一个机器…

全志R128芯片应用开发案例——驱动 WS2812 流水灯

驱动 WS2812 流水灯 本文案例代码下载地址驱动 WS2812 流水灯案例代码https://www.aw-ol.com/downloads?cat24 R128-DevKit 拥有4颗 WS2812 LED&#xff0c;本文将详细叙述如何点亮他们。 LEDC 模块简介 LEDC 硬件方框图如上图所示&#xff0c;CPU 通过 APB 总线操作 LEDC 寄…

使用“Apple 诊断”测试你的 Mac(查看电池是否到达更换标准)

使用“Apple 诊断”测试你的 Mac “Apple 诊断”&#xff08;以前称为“Apple Hardware Test”&#xff09;可以检查你的 Mac 是不是存在硬件问题。 如果你认为你的 Mac 可能存在硬件问题&#xff0c;可以使用“Apple 诊断”来帮助确定可能存在故障的硬件组件。“Apple 诊断”…

2023P企业管理系统提供商,助力大中型企业一体化管理,免费更新

大中型企业通常业务流程更为复杂&#xff0c;工作数据更庞大&#xff0c;数据迁移的过程中可能会遇到数据不一致、数据丢失等问题。因此大中型企业实施ERP系统是一项复杂的任务&#xff0c;需要企业投入大量的资源和精力&#xff0c;克服各种困难和挑战。 在过往为广西省大中型…

淘宝API官方商品、交易、订单、物流、插旗接口如下:

以下是一些淘宝官方商品、交易、订单、物流、插旗接口的参考&#xff1a; 获取一个产品的信息(taobao.product.get)&#xff1a;该接口可以获取一个产品的信息&#xff0c;包括商品ID、标题、价格、销量等。搜索产品信息(taobao.products.search)&#xff1a;该接口可以搜索产…

“UTONMOS”掀起元宇宙游戏热潮,全球发展前景广阔

我们都知道&#xff0c;市面上无论是PC端的网游还是移动端手游&#xff0c;它如果要做到源源不断的内容输出&#xff0c;不仅取决于游戏公司产品质量和业绩&#xff0c;也与公司的决策和市场沟通密不可分。 元宇宙游戏市场受到关注 近年来&#xff0c;元宇宙游戏市场逐渐升温…

算法题:柠檬水找零(典型的贪心算法问题)

这道题就是纯贪心算法题&#xff0c;遍历每个顾客&#xff0c;先把钱收了&#xff0c;如果是10块钱就判断手里头有没有5元用于找零&#xff1b;如果是20块钱&#xff0c;先判断是不是有10元5元&#xff0c;如果没有就再判断是否有3个5元。没有的话就直接返回 False。(完整题目附…