AUTOSAR中支持的最大任务数

时间:2017-07-03 20:31:24

标签: autosar

符合AUTOSAR标准的系统支持的最大任务数是多少?

在Linux中,我可以检查支持的最大进程ID,以获得支持的最大任务数。

但是,我找不到任何说明AUTOSAR支持的最大任务数的来源。

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:5)

嗯,我们仍处于嵌入式汽车世界,而不是PC。 通常需要在您拥有的任务数量和安排它们所需的任务之间以及您的配置使用的RAM / ROM和运行时资源之间进行权衡。

如上所述,如果您只需要一个简单的定时循环,其间有一些中断,那么一个任务可能没问题。 例如,也可能就足够了。 3个任务以5ms,10ms和20ms周期运行。但是你也可以通过一个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做出反应的扩展任务。此任务可能不会循环运行,而只能在已配置的OsEvent上运行。你会在那里有一个操作系统等待点,其中任务或多或少地停止,并且只在事件到达时被操作系统唤醒。还有OSALARM,可以直接触发OsTask的激活,也可以间接触发事件,因此,您可以例如在来自OsAlarm的循环事件或由其他东西设置的OsEvent上等待同一个Waitpoint,例如通过另一项任务或从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();
        }
    }
}

此调度的直接处理现在主要基于您为SWC配置的事件和事件到任务映射等在RTE中完成/生成。

任务的安排主要取决于他们的优先级,这就是为什么他们可以通过更高优先级的设施随时中断的原因。例外情况是,如果您将操作系统和任务配置为不抢先但合作。然后可能还需要在代码中使用Schedule()点来放弃CPU。

在更大的系统上以及具有MultiCore OS的MultiCore系统上,会有更高的任务数量,因为任务被绑定到核心,尽管不同核心上的任务独立运行,除了核心间同步。这也会对性能产生负面影响(Spinlocks可以阻止整个系统)

e.g。对于普通的BaseSW组件,可能存在一些循环任务,而一个仅针对通信组件(CAN Stack和Comm-Services)。 我们通常将通信部分分开,因为它们需要一个特定的周期时间,如5..10ms,因为这个周期被Comm-Stack用于消息传输调度和接收超时监视。 然后可能有一个任务来处理内存堆栈(Ea / Fls,Eep / Fee,NvM)。 可能还有某种基于事件的任务来触发某些硬件控制和处理测量数据链,因为它们可能被放在不同的核心上,并且可以通过彼此的开始或结束事件来安排。

另一方面,对于所有循环任务,您还应确保在此类任务中运行的函数运行时间不超过任务周期,否则由于多次激活同一任务而导致操作系统关闭,因为您的任务在实际完成之前再次启动。您可能会遇到一些限制,需要在应用程序预期的测量周期内完成一些任务。

在安全相关系统(ASIL-A .. ASIL-D)中,您还将至少有一个任务fpr,每个安全级别都可以获得免于干扰的自由。在AUTOSAR中,您已在OSApplication上指定了分配任务的内容,这也允许您配置MemoryProtection(例如,通过QM,ASIL-A,ASIL-B应用程序和任务对内存分区进行WrAccess)。那是OS的另一部分,操作系统必须在运行时根据OsApplications MemoryAccess设置重新配置MPU。

但同样,您创建的任务越多,RAM,ROM和运行时的使用率就越高。

  • RAM - 运行时调度结构和不同的任务堆栈
  • ROM - 实际任务和事件配置
  • 运行时 - 任务的上下文切换以及调度本身

答案 1 :(得分:3)

似乎有所不同。我发现ETAS RTA offers 1024 tasks *,而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

答案 2 :(得分:2)

正式地,您可以拥有无​​限数量的OsTasks。根据规格。 Os的配置可以有0 .. * OsTask。 除此之外,(OS)软件使用任务索引变量的数据类型TaskType。因此,如果TaskType是uint16,则任务不能超过65535。 除此之外,如果你有很多任务,你可能会重新考虑你的设计。