• 560查看
  • 0回复

[Autosar] Autosar/FreeRtos Os 任务很粗略对比

[复制链接]


该用户从未签到

发表于 17-5-2024 20:17:41 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


Autosar/FreeRtos Os 任务很粗略对比w1.jpg

Os

对比一下几家Os 的任务

想提升一下自己,之前仔细看了下Autosar Os (ETAS的)。

现在想了解一下其他的Os的实现,于是搜了一下 FreeRtos, Pxros. 觉得还挺有意思的。

奈何水平不够,无法自己写。有有兴趣的,可以一起合计合计试着写一个。

简单的对比一下这三家Os 的任务创建,和任务内是什么样的。

不评好坏,只是觉得挺有意思的,也没做详细比较。

如有侵权,请联系我删除,谢谢。

01

FreeRtos

// 免费先行

任务创建

Autosar/FreeRtos Os 任务很粗略对比w2.jpg
    /* Create LED1 app task */    app1_status = xTaskCreate(task_app1, "APP1", configMINIMAL_STACK_SIZE, NULL, 3, NULL);
    /* Create LED2 app task */    app2_status = xTaskCreate(task_app2, "APP2", configMINIMAL_STACK_SIZE, NULL, 5, NULL);
任务内实现


voidtask_app1(void){    app1_cnt++;    TickType_t xLastWakeTime;    xLastWakeTime = xTaskGetTickCount();    while(1)    {        app1_cnt++;        /* Delay 250ms */        vTaskDelayUntil(&xLastWakeTime, 1000);    }
}
代码片段:可切换语言,无法单独设置文字格式

02

Pxros

任务创建


PxTask_t LedClientA_Create(PxPrio_t prio, PxEvents_t events, PxMc_t memClass, PxOpool_t objPool){    PxTaskSpec_T task_Spec;
    /* Clear task_Spec structure before it is initialized */    PxBzero ((PxUChar_t *)&task_Spec, sizeof(task_Spec));
    /* Configure Task specification structure */    task_Spec.ts_name = (const PxChar_t *)"Task LedClientA";    task_Spec.ts_fun = LedClientA_taskFunc;
    task_Spec.ts_mc = memClass;    task_Spec.ts_opool = objPool;
    task_Spec.ts_accessrights = THISTASK_PXACCESS;    task_Spec.ts_privileges = TASK_PRIVILIGES;    task_Spec.ts_context = &task_Context;    task_Spec.ts_protect_region = taskAPRegions;
    task_Spec.ts_taskstack.stk_type = PXStackAlloc;    task_Spec.ts_taskstack.stk_size = TASK_STACKSIZE / sizeof(PxInt_t);    task_Spec.ts_taskstack.stk_src.mc = memClass;
    task_Spec.ts_inttaskstack.stk_type = PXStackAlloc;    task_Spec.ts_inttaskstack.stk_size = TASK_INTR_STACKSIZE / sizeof(PxInt_t);    task_Spec.ts_inttaskstack.stk_src.mc = memClass;
    task_Spec.ts_abortstacksize = 0;
    /* Create the Task in the PXROS-HR kernel */    return PxTaskCreate (objPool,&task_Spec,prio,events);}
任务内实现


voidLedClientA_taskFunc(PxTask_t myID, PxMbx_t myMailbox, PxEvents_t myActEvents){  PxError_t errRes;
    /* Prevent possible warning about unused parameters */  (void)(myID); (void)(myMailbox); (void)(myActEvents);
    /* Retrieve LedServer taskID from the NameServer */  PxTask_t LedServerID = PxTaskIdInvalidate();
    errRes = HtcPxNameQuery (        LedServer_MID_NAMESERVERID,        sizeof(PxTask_t),      &LedServerID,      0,      0,      LEDCLIENTA_EV_WAIT_TIMEOUT );
    if (errRes != PXERR_NOERROR)      PxPanic();
    /* Ask for Periodic object to send periodic triggers (events) to the task     * interval is given in [PxTicks] and start it     */    PxPe_t peHnd = PxPeRequest (PXOpoolTaskdefault, 250, LEDCLIENTA_EV_PERIOD);
    if (!PxPeIdIsValid(peHnd))      PxPanic();
    if (PxPeStart(peHnd) != PXERR_NOERROR)      PxPanic();
    /* TASK MAIN LOOP     * Wait for periodic event to wake-up, and send the Event to the LedServer.     * In case of unexpected event, stop.     */    while (1)    {      PxEvents_t tmrEv = PxAwaitEvents (LEDCLIENTA_EV_PERIOD);
      if (tmrEv != LEDCLIENTA_EV_PERIOD)        PxPanic();
      errRes = PxTaskSignalEvents (LedServerID, LEDSERVER_EV_TOGGLE_LED_0);      if (errRes != PXERR_NOERROR)        PxPanic();    }}

03

ETAS

任务创建


FUNC(void, OS_CODE_CORE0_LOCAL) Os_Dispatch0(void) {
... (较长,没有完全截下来)    Os_RunningTask = (&Os_const_tasks0[OS_FSB(Os_ControlledCoreInfo[0U].ReadyTasks.p0)]); /*lint !e931 !e9034 !e747 */... (较长,没有完全截下来)    }
任务内实现


TASK(OsTask_Core1){   EventMaskType event;
   for ( ; ; )   {      WaitEvent(Rte_Ev_10000000_0|Rte_Ev_CPT_Core1_SWC_test1_dre_re_fn_operateMyInterfaceCore1);      GetEvent(OsTask_Core1, &event);      ClearEvent(event);      /* Box: Implicit Buffer Initialization begin */      /* Box: Implicit Buffer Initialization end */      /* Box: Implicit Buffer Fill begin */      /* Box: Implicit Buffer Fill end */      /* Box: CPT_Core1_SWC_test1 begin */      if ( 0U != ( event & Rte_Ev_CPT_Core1_SWC_test1_dre_re_fn_operateMyInterfaceCore1 ) )      {         fn_operateMyInterfaceCore1();      }      /* Box: CPT_Core1_SWC_test1 end */      /* Box: CPT_Core1_SWC_test1 begin */      if ( 0U != ( event & Rte_Ev_10000000_0 ) )      {         fn_core1SwcTest1();      }      /* Box: CPT_Core1_SWC_test1 end */      /* Box: Implicit Buffer Flush begin */      /* Box: Implicit Buffer Flush end */   }} /* OsTask_Core1 */


该用户从未签到

发表于 11-3-2025 08:48:00 | 显示全部楼层
作为一名汽车工程师,对于操作系统(OS)的任务创建及管理机制有着深入的了解。对于Autosar OS、FreeRtos以及Pxros三种操作系统,他们的任务创建机制各有特点。

Autosar OS的任务创建遵循严格的标准和流程,具有高度的可靠性和稳定性。FreeRtos的任务创建则以其灵活性和实时性著称,其API简洁易用,易于集成到各种系统中。Pxros可能在汽车领域应用相对较少,但其任务管理机制同样具有高效和可靠的特点。

关于任务内部机制,这三种OS的差异主要在于任务调度、资源管理和异常处理等方面。具体的对比需要深入研究其源代码和文档,进行详细的测试和验证。

如果对这三个OS的任务创建和任务内机制感兴趣,我们可以进一步探讨和研究。若您有具体的代码片段或疑问,也可以提供出来一起讨论。希望共同提高,共同进步。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 08:48:00 | 显示全部楼层
作为一名汽车工程师,对于操作系统(OS)的任务管理有一定的了解。针对您提到的Autosar、FreeRtos和Pxros三种OS的任务管理进行粗略对比:

1. Autosar OS:在汽车行业广泛应用,其任务管理严格遵循标准,注重实时性和安全性。任务创建过程规范,配置灵活。
2. FreeRtos:开源、免费,应用广泛。任务创建相对简单快速,实时性强,易于裁剪和移植。
3. Pxros:具体细节不十分明确,但通常嵌入式OS的任务管理包括任务创建、调度、通信等。

任务创建方面,三者都有相应的API或函数实现。具体实现细节不同,但目的都是为了实现任务的创建、调度和管理。内部实现涉及任务控制块、调度器、优先级等。

以上对比基于一般了解,不涉及详细技术细节。若要深入了解,建议查阅各自OS的官方文档和资料。如您需要更详细的内容或者有其他相关问题,欢迎继续交流。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 02:25 , Processed in 0.374604 second(s), 36 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.