13-1 定时器的理论介绍
- Tick中断调用timer函数的回调函数--Linux
- 在某个任务中执行--RTOS
- 把任务写入队列通知守护任务,队列要是满了需要等待
- 定时器的超时函数在守护任务中执行
13-2 定时器的一般使用
- 启动定时器实际上是把任务发给队列
- 守护任务的优先级更高会切换到守护任务,看串口打印被打断可知
- 任务的优先级其实不能取到最大值
- 定时器函数的优先级过低会被抢占
13-3 使用定时器消除抖动
- 给中断增加延时处理,如果不满足延时时间,就不会判定为按键按下
14 中断管理
- 更正,不能在中断里使用xTimerReset()
- 带FromISR的函数他不会发起调度,会唤醒任务但不会引起调度,会在变量
BaseType_t self_HigherPriorityTaskWoken
里边记住是否需要调度 portYIELD_FROM_ISR()
触发调度,但是不是即刻引起调度
15_资源管理
- 可以通过函数去屏蔽别的中断或者任务
- 任务和任务之间可以屏蔽任务调度器
- 优先级最高的三个中断不可以屏蔽
- 八位寄存器管理中断优先级
- 使能和恢复是不同的
- 使能:是开启
- 恢复:原本什么样变成什么样,开启变开启,禁止变禁止
16-1_调试
- 判断栈溢出方法
- 使用TCB结构体的栈标记判断并不准确,要切换任务才会把实际的栈位置存入结构体,因此这个只是一种判断栈溢出的方法,但是高效
- 方法2:最后16个字节不是0xA5就认为栈溢出,更准确
16-2_统计任务信息的原理
-
栈的使用情况
- 水位越大表明空闲的栈太大了,说明分配的栈太大了
- count会记录0xA5的字节数
- 一般保证每个水位有几十字节就可以了
-
每个任务的CPU运行时间
-
主要问题是时间记录的准不准?
-
Tick中断是1ms一次,会导致记录不准
-
引入更快的时间周期/定时器
- 时间记录要一个任务运行count和总的时间timer
-
任务进入和离开都会记录一个总的任务运行的时间
-
uxTaskGetSystemState:获得任务的统计信息
UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime );
参数 描述 pxTaskStatusArray 指向一个TaskStatus_t结构体数组,用来保存任务的统计信息。
有多少个任务?可以用uxTaskGetNumberOfTasks()
来获得。uxArraySize 数组大小、数组项个数,必须大于或等于 uxTaskGetNumberOfTasks()
pulTotalRunTime 用来保存当前总的运行时间(更快的定时器),可以传入NULL 返回值 传入的pxTaskStatusArray数组,被设置了几个数组项。
注意:如果传入的uxArraySize小于uxTaskGetNumberOfTasks()
,返回值就是0 -
vTaskList :获得任务的统计信息,形式为可读的字符串。注意,pcWriteBuffer必须足够大。
void vTaskList( signed char *pcWriteBuffer );
-
vTaskGetRunTimeStats:获得任务的运行信息,形式为可读的字符串。注意,pcWriteBuffer必须足够大
void vTaskGetRunTimeStats( signed char *pcWriteBuffer )
-
16-3_编写程序获取统计信息
- 多看需要
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律