AUTOSAR 兼容系统支持的最大任务数是多少?
在 Linux 中,我可以检查支持的最大进程 ID 以获得支持的最大任务数。
但是,我找不到任何说明 AUTOSAR 支持的最大任务数的来源。
非常感谢您的帮助!
AUTOSAR 兼容系统支持的最大任务数是多少?
在 Linux 中,我可以检查支持的最大进程 ID 以获得支持的最大任务数。
但是,我找不到任何说明 AUTOSAR 支持的最大任务数的来源。
非常感谢您的帮助!
好吧,我们仍然处于嵌入式汽车世界,而不是 PC。通常在您拥有的任务数量、调度它们所需的资源以及您的配置使用的 RAM/ROM 和运行时资源之间进行权衡。
如前所述,如果您只需要一个简单的定时循环,中间有一些中断,那么一项任务可能就可以了。例如,以 5ms、10ms 和 20ms 的周期运行 3 个任务可能也足够了。但是你也可以在像这样的简单情况下用一个 5ms 的任务来安排这个:
TASK(TASK_5ms)
{
static uint8 cnt = 0;
cnt++;
// XXX and YYY Mainfunctions shall only be called every 10ms
// but do a load balancing, that does not run 3 functions every 10ms
// and 1 every 5ms, but only two every 5ms
if (cnt & 1)
{
XXX_Mainfunction_10ms();
}
else
{
YYY_Mainfunction_10ms();
}
ZZZ_Mainfunction_5ms();
}
因此,如果您需要每 5、10 或 20 毫秒运行一次,请将这些可运行对象放入相应的任务中。
旧的 OSEK 也有 BASIC vs EXTENDED Tasks 的概念,其中只有扩展任务才能对 OsEvents 做出反应。此任务可能不会循环运行,而只能在配置的 OsEvents 上运行。您将在那里有一个操作系统等待点,其中任务或多或少地停止并且仅在事件到达时由操作系统唤醒。还有 OSALARM,它可以直接触发 OsTask 的激活,也可以间接触发事件,因此,您可以例如在来自 OsAlarm 的循环事件或由其他东西设置的 OsEvent 上等待相同的等待点,例如由另一个任务或来自 ISR。
TASK(TASK_EXT)
{
EventMaskType evt;
for(;;)
{
WaitEvent(EVT_XXX_START | EVT_YYY_START | EVT_YYY_FINISHED);
GetEvent(TASK_EXT, &evt);
// Start XXX if triggered, but YYY has reported to be finished
if ((evt & (EVT_XXX_START | EVT_YYY_FINISHED) == (EVT_XXX_START | EVT_YYY_FINISHED))
{
ClearEvent(EVT_XXX_START);
XXX_Start();
}
// Start YYY if triggered, will report later to start XXX
if (evt & EVT_YYY_START)
{
ClearEvent(EVT_YYY_START);
YYY_Start();
}
}
}
这种对调度的直接处理现在主要在 RTE 内完成/生成,基于您为 SWC 配置的事件和事件到任务映射等。
任务主要是根据它们的优先级来安排的,这就是为什么它们可以随时被更高优先级的任务中断。例外情况是,如果您将操作系统和任务配置为不是抢占式的而是协作式的。然后可能还需要在代码中使用 Schedule() 点来放弃 CPU。
在更大的系统上以及具有多核操作系统的多核系统上,会有更多的任务,因为任务绑定到一个核心,尽管不同核心上的任务独立运行,可能除了核心间同步。这也会对性能产生负面影响(自旋锁可以停止整个系统)
例如,对于普通 BaseSW 组件可能有一些循环任务,而一个特定于通信组件(CAN 堆栈和通信服务)。我们通常将通信部分分开,因为它们需要一定的周期时间,比如 5..10ms,因为这个周期被 Comm-Stack 用于消息传输调度和接收超时监控。然后可能会有一个任务来处理内存堆栈(Ea/Fls、Eep/Fee、NvM)。可能还有某种基于事件的任务来触发某些硬件控制和处理测量数据的链,因为它们可能放在不同的核心上,并且可以通过彼此的开始或完成事件进行调度。
另一方面,对于所有循环任务,您还应确保在此类任务中运行的功能不会比您的任务周期运行时间更长,否则您会因多次激活同一任务而导致操作系统关闭,因为您的任务在实际完成之前再次启动。而且您可能有一些限制,需要在您的应用程序预期的测量周期中完成一些任务。
在安全相关系统 (ASIL-A .. ASIL-D) 中,您还将在每个安全级别至少完成一项任务,以免受干扰。在 AUTOSAR 中,您已经在 OSApplication 上指定了任务分配到的那个,这也允许您配置 MemoryProtection(例如,WrAccess 对内存分区的 QM、ASIL-A、ASIL-B 应用程序和任务)。那是另一部分,操作系统必须在运行时根据 OsApplications MemoryAccess 设置重新配置 MPU。
但同样,您创建的任务越多,RAM、ROM 和运行时的使用率就越高。
形式上,您可以拥有无限数量的 OsTask。根据规范。Os的配置可以有0..* OsTask。除此之外,(OS)软件对任务索引变量使用数据类型 TaskType。因此,如果 TaskType 为 uint16,则任务数不能超过 65535。除此之外,如果你有很多任务,你可能会重新考虑你的设计。
似乎有所不同。我发现ETAS RTA 提供 1024 个任务*,而 Vector 的 MICROSAR OS 有 65535 个。
对于任务处理,OSEK/ASR 提供以下功能:
StatusType ActivateTask (TaskType TaskID)
StatusType TerminateTask (void)
StatusType Schedule (void)
StatusType GetTaskID (TaskRefType TaskID)
StatusType GetTaskState (TaskType TaskID, TaskStateRefType State)
*链接将来可能会改变,但很容易直接在 ETAS 页面搜索手册等:https ://www.etas.com/en/products/download_center.php