FreeRTOS 正点原子教程学习笔记

本文深入解析FreeRTOS的任务调度、任务创建、优先级管理、临界段、信号量、队列、事件标志组和任务通知等概念。重点介绍了任务调度周期、任务状态查看、中断优先级分组、静态任务创建、动态内存管理以及各种同步原语的使用,包括任务挂起恢复、优先级翻转问题和低功耗模式。此外,还讨论了任务通知如何替代传统同步机制,如信号量和队列,提高效率。

正点原子视频教程
FreeRTOS(教程非常详细)

小知识

如果创建了任务却完全空着,没有while(1){延时}的话,整个程序会卡住,其他正常的任务无法运行。如果任务里单单有赋值之类的操作也会卡死在这个任务,一定要记得加延时vTaskDelay(10);。
任务调度周期是1ms,能改,但是别改。

FreeRTOS中的变量,函数命名规则(u.v.x.p什么意思)
前面的字母是返回值的缩写
u :代表unsigned。

s :代表short。

c :char。 所以类似uc,us类的变量就是unsigned char,unsigned
short,分别对应uint8_t,uint16_t。

x :为用户自定义的数据类型,比如结构体,队列等。
常看到ux开头的函数,就是unsigned且用户自定义的类型。需要注意的是size_t变量前缀也是ux。

e :枚举变量

p :指针变量 类似(uint16_t *)变量前缀为pus。

prv :static函数

v: void函数

1、c语言中%x的意思是16进制输出。
2、c语言中符合%#的意思是带格式输出。比如,%#x的意思是在输出前面加上0x,%#b的意思是在输出前面加上0b。
用来输出地址

各种函数

  • vTaskList()能一次性看所有任务的状态、优先级、堆栈剩余大小和编号
  • vTaskGetRunTimeStates()用来统计各任务运行时间及其占比【很有用的】如果哪个太耗时就可以拆分。不过要用的话得专门弄个定时器。正点原子官网视频第13.2讲会详细讲,我用到再学吧。
  • 调用taskYIELD(),主动让出cpu,让同优先级的其他task获得cpu
  • vTaskDelay(1000);延时一秒,可被调度

FreeRTOSConfig.h
使用“INCLUDE_”开头的宏用来表示使能或除能 FreeRTOS 中相应的 API 函数,作用就 是用来配置 FreeRTOS 中的可选 API 函数的
“config”开始的宏和“INCLUDE_”开始的宏一样,都是用来完成 FreeRTOS 的配置和裁剪的
有些宏定义有默认值,是用#ifndef实现的

中断

关闭中断函数只能关掉大于等于5【5这个值是宏定义的,下图第一行】的中断优先级的事件【优先级数值比较小的比较高】
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段。
#define taskENTER_CRITICAL() portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()
#define taskEXIT_CRITICAL() portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )
没有_FROM_ISR的是任务级的临界段代码保护,另外俩是中断级的临界段代码保护。

void start_task(void *pvParameters)
{
   
   
	taskENTER_CRITICAL(); //进入临界区
	xTaskCreate((TaskFunction_t)led0_task,
		(const char*)"led0_task",
		(uint16_t)LED0_STK_SIZE,
		(void*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值