AUTOSAR 支持的最大任务数
Maximum number of tasks supported in AUTOSAR
AUTOSAR 兼容系统支持的最大任务数是多少?
在Linux中,我可以检查支持的最大进程ID,以获得支持的最大任务数。
但是,我找不到任何说明 AUTOSAR 支持的最大任务数的来源。
非常感谢您的帮助!
正式来说,您可以拥有无限数量的 OsTasks。根据规范。 Os 的配置可以有 0..* Os 任务。
除此之外,(OS) 软件将数据类型 TaskType 用于 Task-Index 变量。因此,如果 TaskType 是 uint16,则任务数不能超过 65535 个。
除此之外,如果你有很多任务,你可能会重新考虑你的设计。
似乎有所不同。我发现 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)
*Link 以后可能会变,但是直接在ETAS页面上搜索手册等很容易:https://www.etas.com/en/products/download_center.php
嗯,我们仍然处于嵌入式汽车世界,而不是 PC。
通常需要在您拥有的任务数量和安排任务所需的时间以及您的配置使用的 RAM/ROM 和 运行 时间资源之间进行权衡。
如前所述,如果你只需要一个简单的定时循环,中间有一些中断,一个任务可能就可以了。
这可能也足够了,例如3 个任务 运行 以 5 毫秒、10 毫秒和 20 毫秒为周期。但是您也可以在像这样的简单情况下使用单个 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 也有基本任务与扩展任务的概念,其中只有扩展任务能够对 OsEvents 做出反应。此任务可能不会 运行 循环执行,但仅在配置的 OsEvents 上执行。你会在那里有一个 OS 等待点,任务或多或少地停止了,只有在事件到达时才被 OS 唤醒。还有 OSALARM,它可以直接触发 OsTask 的激活,也可以通过 Event 间接触发,因此,您可以在来自 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();
}
}
}
这种直接的调度处理现在主要 done/generated 在 RTE 中,基于您为 SWC 配置的事件和事件到任务的映射等
任务主要按优先级安排,这就是为什么它们可以随时被更高优先级的任务打断。这里的例外是,如果您将 OS 和任务配置为非抢占式而是协作式。那么可能还需要在您的代码中使用 Schedule() 点,以放弃 CPU.
在更大的系统以及具有多核 OS 的多核系统上,会有更多的任务,因为任务绑定到一个核心,尽管不同核心上的任务 运行 是独立的,除了核心间同步。这也会对性能产生负面影响(自旋锁可以停止整个系统)
例如可能有一些用于普通 BaseSW 组件的循环任务和一个仅用于通信组件(CAN 堆栈和通信服务)的特定任务。
我们通常将通信部分分开,因为它们需要一定的周期时间,如 5..10ms,因为这个周期被 Comm-Stack 用于消息传输调度和接收超时监控。
然后可能有一个任务来处理内存堆栈(Ea/Fls、Eep/Fee、NvM)。
可能还有某种基于事件的任务来触发测量数据的某些硬件控制和处理链,因为它们可能放在不同的内核上,并且可以通过彼此的开始或完成事件进行调度。
另一方面,对于所有循环任务,您还应确保此类任务中的函数 运行 不会 运行 长于您的任务周期,否则您会得到一个OS 由于同一任务的多次激活而关闭,因为您的任务在实际完成之前再次启动。你可能有一些限制,需要一些任务在你的应用程序预期的测量周期内完成。
在安全相关系统 (ASIL-A .. ASIL-D) 中,您还将在每个安全级别上至少有一项任务以获得不受干扰的自由。在 AUTOSAR 中,您已经在任务分配给的 OSApplication 上指定了它,这也允许您配置 MemoryProtection(例如 QM、ASIL-A、ASIL 对内存分区的 WrAccess -B 应用程序和任务)。那是另一部分,OS 必须在 运行 时根据 OsApplications MemoryAccess 设置重新配置 MPU。
但是同样,您创建的任务越多,RAM、ROM 和 运行时间的使用率就越高。
- RAM - 运行时间调度结构和不同的任务堆栈
- ROM - 实际任务和事件配置
- 运行时 - 任务的上下文切换以及调度本身
AUTOSAR 兼容系统支持的最大任务数是多少?
在Linux中,我可以检查支持的最大进程ID,以获得支持的最大任务数。
但是,我找不到任何说明 AUTOSAR 支持的最大任务数的来源。
非常感谢您的帮助!
正式来说,您可以拥有无限数量的 OsTasks。根据规范。 Os 的配置可以有 0..* Os 任务。 除此之外,(OS) 软件将数据类型 TaskType 用于 Task-Index 变量。因此,如果 TaskType 是 uint16,则任务数不能超过 65535 个。 除此之外,如果你有很多任务,你可能会重新考虑你的设计。
似乎有所不同。我发现 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)
*Link 以后可能会变,但是直接在ETAS页面上搜索手册等很容易:https://www.etas.com/en/products/download_center.php
嗯,我们仍然处于嵌入式汽车世界,而不是 PC。 通常需要在您拥有的任务数量和安排任务所需的时间以及您的配置使用的 RAM/ROM 和 运行 时间资源之间进行权衡。
如前所述,如果你只需要一个简单的定时循环,中间有一些中断,一个任务可能就可以了。 这可能也足够了,例如3 个任务 运行 以 5 毫秒、10 毫秒和 20 毫秒为周期。但是您也可以在像这样的简单情况下使用单个 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 也有基本任务与扩展任务的概念,其中只有扩展任务能够对 OsEvents 做出反应。此任务可能不会 运行 循环执行,但仅在配置的 OsEvents 上执行。你会在那里有一个 OS 等待点,任务或多或少地停止了,只有在事件到达时才被 OS 唤醒。还有 OSALARM,它可以直接触发 OsTask 的激活,也可以通过 Event 间接触发,因此,您可以在来自 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();
}
}
}
这种直接的调度处理现在主要 done/generated 在 RTE 中,基于您为 SWC 配置的事件和事件到任务的映射等
任务主要按优先级安排,这就是为什么它们可以随时被更高优先级的任务打断。这里的例外是,如果您将 OS 和任务配置为非抢占式而是协作式。那么可能还需要在您的代码中使用 Schedule() 点,以放弃 CPU.
在更大的系统以及具有多核 OS 的多核系统上,会有更多的任务,因为任务绑定到一个核心,尽管不同核心上的任务 运行 是独立的,除了核心间同步。这也会对性能产生负面影响(自旋锁可以停止整个系统)
例如可能有一些用于普通 BaseSW 组件的循环任务和一个仅用于通信组件(CAN 堆栈和通信服务)的特定任务。 我们通常将通信部分分开,因为它们需要一定的周期时间,如 5..10ms,因为这个周期被 Comm-Stack 用于消息传输调度和接收超时监控。 然后可能有一个任务来处理内存堆栈(Ea/Fls、Eep/Fee、NvM)。 可能还有某种基于事件的任务来触发测量数据的某些硬件控制和处理链,因为它们可能放在不同的内核上,并且可以通过彼此的开始或完成事件进行调度。
另一方面,对于所有循环任务,您还应确保此类任务中的函数 运行 不会 运行 长于您的任务周期,否则您会得到一个OS 由于同一任务的多次激活而关闭,因为您的任务在实际完成之前再次启动。你可能有一些限制,需要一些任务在你的应用程序预期的测量周期内完成。
在安全相关系统 (ASIL-A .. ASIL-D) 中,您还将在每个安全级别上至少有一项任务以获得不受干扰的自由。在 AUTOSAR 中,您已经在任务分配给的 OSApplication 上指定了它,这也允许您配置 MemoryProtection(例如 QM、ASIL-A、ASIL 对内存分区的 WrAccess -B 应用程序和任务)。那是另一部分,OS 必须在 运行 时根据 OsApplications MemoryAccess 设置重新配置 MPU。
但是同样,您创建的任务越多,RAM、ROM 和 运行时间的使用率就越高。
- RAM - 运行时间调度结构和不同的任务堆栈
- ROM - 实际任务和事件配置
- 运行时 - 任务的上下文切换以及调度本身