• 103查看
  • 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 */

快速发帖

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

本版积分规则

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

GMT+8, 1-6-2024 19:50 , Processed in 0.241711 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.