首页 > 编程知识 正文

freertos任务切换(traceroute结果详解)

时间:2023-05-06 18:31:37 阅读:75140 作者:1965

系统视图记录跟踪通过事件记录事件。 举个简单的例子 在prvAddCurrentTaskToDelayedList函数中 跟踪移动_ task _ to _ delayed _ list (; Freertos内核代码中有许多traceXXX函数,系统视图重新定义这些函数。 SEGGER_SYSVIEW_FreeRTOS.h # definetracemoved _ task _ to _ delayed _ list (se gger _ sys view _ ontaskstopready ) (u32 ) pxCurrentTCB, (1u 2) definetracemoved _ task _ to _ overflow _ delayed _ list ) segger_sysview_ontaskstopready () u32 ) PE (PExxxxx

执行x函数时,将执行SEGGER_SYSVIEW中定义的跟踪函数。 将相应的事件写入指定的事件缓冲区区域。 所以我们可以人为地增加trace的部位。 调试器读取内存区域的数据并传输到PC,完成图形界面的更改。

trace的大致结构是这样的。

记录了tracexxxx,所有没有trace函数的位置都没有trace

2 .虽然事发时间非常不准确,但在一定程度上已经足够了。

代码如下。 在此处创建两个任务LED0_Task、LED1_Task

单击此处查看系统视图记录文档

xtaskcreate(led0_task,' LED0_Blink ',128,) void * (NULL,4,null ); xtaskcreate(leD1_task,' LED1_Blink ',128,) void * (NULL,5,null ); LED0_Task优先级4LED1_Task优先级5voiddo_things(intI ) { int k,n; for(n=0; 倪; n () k=0; while(k655 ) k; } } staticvoidled0_ task (void * args ) while )1) xsemaphoretake (mutex _ 1,0x ffff ); do_things(10; xemaphoregive(mutex_1; 任务延迟(4; (; }staticvoidleD1_task(void*args ) while) vtaskdelay); xemaphoretake (mutex _ 1,0x ffff ); do_things(10; xemaphoregive(mutex_1; (; }运行并记录程序

sysTick是ARM cortex-M3内核专门用于提供操作系统tick的计时器,Freertos在调度程序初始化中设置了间隔。 从上图中可以看到,每个systick 1ms运行一次,每次运行时中断用户函数的运行,systick handler处理函数的运行也需要一些时间。

这里需要花23微秒的时间运行。

首先,Event在此时获取对应于LED1任务接收队列且大代码是line85的排他量。 然后执行do_things。

信号通过多个systick LED1任务被释放,返回到while(1)的开头的taskdelay(2) 2。 也就是说,为了使任务处于块状态,调度器进行任务的切换。 可以看出,运行调度程序也需要时间

在下一个事件中,LED0任务获取独占量并开始执行dothings。

Dothings(10 )还没有完成。 通过systick计数器1、LED1的Delay2超时解除阻止状态。 调度程序执行上下文切换LED1任务。

在箭头的时间点,LED1尝试获取排他量,此时如果排他量具有对LED0的继承优先级,则优先执行LED0。

led0do_things(10 )直到下一个时刻; 排他量的释放已完成。 此时优先顺序恢复到原来的优先顺序。 LED1为最高优先级,立即切换运行,获取排他量。

在下一个时间,当LED1释放独占量并进入任务延迟(4(2) )时,将运行任务LED0并执行延迟(4)。 此时,所有用户任务都被阻止,因此将执行空闲任务Idea task。

下一个时刻LED1的任务延迟(2)完成LED1运行的切换。

上面的过程可以理解以下内容

1 .任务切换需要CPU执行调度器的任务一定时间

2.systick周期性醒来,暂时中断正在执行的任务

3.systick,简化调度程序设计,缩短时间

4 .任务延迟计数取决于systick计数误差1 tick

5 .互斥量的优先顺序继承机制

6 .自由RTOS的API可以直接启动PendSV,进行上下文切换,无需由以下systick触发

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。