|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
Os
对比一下几家Os 的任务
想提升一下自己,之前仔细看了下Autosar Os (ETAS的)。
现在想了解一下其他的Os的实现,于是搜了一下 FreeRtos, Pxros. 觉得还挺有意思的。
奈何水平不够,无法自己写。有有兴趣的,可以一起合计合计试着写一个。
简单的对比一下这三家Os 的任务创建,和任务内是什么样的。
不评好坏,只是觉得挺有意思的,也没做详细比较。
如有侵权,请联系我删除,谢谢。
01
FreeRtos
// 免费先行
任务创建
/* 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 */ |
|