首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RTOS:上下文切换-计算TCB查找与内存访问

RTOS:上下文切换-计算TCB查找与内存访问
EN

Stack Overflow用户
提问于 2022-01-05 20:08:09
回答 1查看 79关注 0票数 0

目前,我正在为带有Cortex-M4处理器的STM32F4VE编写一个轻量级的实时操作系统。在多个进程之间以循环方式进行上下文切换很好,但尽可能地优化内核机制是我的爱好。TCB被堆放在保留区域的SRAM底部的顶部。

在每个上下文开关上,我搜索下一个TCB,如下所示:((pid + 1) * TCB_Size) + TCB_BASE_ADRESS

如果pid等于任务数量,则将其重置为0。这是用if三元操作符来完成的,而不是昂贵的模操作。

例如,每8ms切换一次,CPU每次都要进行这种乘法运算。我想知道在生成每个任务时预先计算这些tcb附件并将它们直接写到内存中是否会更有效。

第二个变量是访问内存,每个上下文切换2次-获取tcb的地址,获取tcb。否则会有一个“昂贵”的乘法。

哪种变体更有效?如果没有人有一个绝对的答案,我将重写这个概念,并做一个简单的基准。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-06 01:44:56

在每个上下文开关上搜索下一个TCB,如下所示:((pid + 1) * TCB_Size) + TCB_BASE_ADRESS。

只需使用循环链接列表;例如:

代码语言:javascript
复制
    pointer_to_next_task_TCB = pointer_to_this_task_TCB->next;
    switch_to_task(pointer_to_next_task_TCB);

..。其中pointer_to_this_task_TCB是一个全局变量(仅限于单CPU )或一个特定于CPU的变量;其中switch_to_task(pointer_to_next_task_TCB);确保pointer_to_this_task_TCB = pointer_to_next_task_TCB;是作为任务切换的一部分(或紧接任务切换之后)完成的。

注意,当任务阻塞时(睡眠,等待磁盘IO,等待获取互斥,.)您需要将它们从链接列表中删除,以确保调度程序不会给它们分配CPU时间,然后尽快执行任务切换(在任务的时间片结束之前不浪费CPU时间);当任务解除阻塞时(时间延迟过期,数据从磁盘.)需要将它们插入到链接列表中,以便调度程序再次给它们CPU时间,并且需要在正确的位置(列表的当前末端)插入它们,以防止拒绝服务/ CPU占用(例如,任务故意阻塞极小的时间,以便在列表开始时不断地被重新放置,并得到一个全新的时间段,而其他任务没有CPU时间)。

不要忘记,在正常情况下,大多数任务大部分时间被阻塞(并且它们的TCB大部分时间不在调度程序的链接列表中);列表几乎从来没有按照PID的顺序排列。

例如,如果有100个任务,其中96被阻塞等待某事,那么调度程序的链接列表可能是"PID 9,PID 74,PID 31,PID 46,然后再回到PID 9“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70599024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档