小知识
如果创建了任务却完全空着,没有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*

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

被折叠的 条评论
为什么被折叠?



