FreeRTOS学习笔记(一)

一、基础知识思维导图

在这里插入图片描述
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.hqwc.cn/news/130365.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:190. 颠倒二进制位

一、题目: 函数原型: uint32_t reverseBits(uint32_t n) 解释:uint32是无符号int或short的别称,传入的参数是一个32位二进制串,返回值是该32位二进制串逆序后的十进制值 二、思路: 实际上并不需要真的去逆…

秒验:可以自定义UI的一键登录服务

一键登录如今成为越来越多移动应用的首选,但千篇一律的登陆界面在引发用户担忧其安全性的同时,也容易让用户在不同APP切换时产生误解。因此,由国内知名移动应用开发服务商MobTech打造的一键登录工具——秒验,通过允许开发者自定义…

【Linux】 vi / vim 使用

天天用vim 或者vi 。看着大佬用的很6 。我们却用的很少。今天咱们一起系统学习一下。 vi / vim 发展史 vi 是一款由加州大学伯克利分校,Bill Joy研究开发的文本编辑器。 vim Vim是一个类似于Vi的高度可定制的文本编辑器,在Vi的基础上改进和增加了很多…

ThinkPHP团购拼购商城源码/带分销团购商城网站源码/完美版

ThinkPHP团购拼购商城源码,带分销团购商城网站源码,很完美的一套基于ThinkPHP开发的团购分销商城源码,界面也很大气,站长亲测。有需要的可以借鉴一下。 下载地址:https://bbs.csdn.net/topics/613231434

JDBC-day03(BLOB类型字段,批量插入)

四:操作BLOB类型字段 1.MySQL BLOB类型 在MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。可以用来存储图片,视频等 插入BLOB类型的数据必须使用PreparedStatement&#x…

IDEA的使用(三)Debug(断点调试)(IntelliJ IDEA 2022.1.3版本)

编程过程中如果出现错误,需要查找和定位错误时,借助程序调试可以快速查找错误。 编写好程序后,可能出现的情况: 1.没有bug。 使用Debug的情况: 2.运行后,出现错误或者异常信息,但是通过日志文件…

Hadoop----Azkaban的使用与一些报错问题的解决

1.因为官方只放出源码,并没有放出其tar包,所以需要我们自己编译,通过查阅资料我们可以使用gradlew对其进行编译,还是比较简单,然后将里面需要用到的服务文件夹进行拷贝,完善其文件夹结构,通常会…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)

一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式,手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录,HarmonyOS…

【【萌新的SOC学习之AXI接口简介】】

萌新的SOC学习之AXI接口简介 AXI总线的初步介绍 AXI 总线是 ARM AMBA 一部分 (高级可扩展接口) AMBA(高级微控制器总线架构) :开放的片内互联的总线标准,能再多主机设计中实现多个控制器和外围设备之间的连接和管理。…

PL2303驱动程序不支持WINDOWS 11及后续版本

到网上下载PL2303的驱动程序, 双击安装这个驱动程序,安装完成后双击这个端口, 这个端口的驱动程序是我们刚才安装的,选中 点击下一步,问题解决。如下图已经没有之前的提示了

服务器数据恢复-VMWARE ESX SERVER虚拟机数据恢复案例

服务器数据恢复环境: 几台VMware ESX SERVER共享一台某品牌存储,共有几十组虚拟机。 服务器故障: 虚拟机在工作过程中突然被发现不可用,管理员将设备进行了重启,重启后虚拟机依然不可用,虚拟磁盘丢失&#…

加密市场波动:地缘政治与美股走弱引发不确定性!

伴随着国庆假期的结束,多日波动率维持低位的加密市场也似乎开始苏醒。近期多次突破28000美元未果的比特币,于9日15:00开始从27800美元附近下跌,最低跌至27260美元,同期以太坊也至1550美元左右,创近半个月来新低。 Coin…