etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: image/svg+xml etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: CanFestival Scheduling etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: Alarm A value etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: Alarm Bvalue etisserant@0: Alarm Bperiod etisserant@0: etisserant@0: Alarm Bperiod etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: Alarm Bperiod etisserant@0: Alarm Bperiod etisserant@0: etisserant@0: etisserant@0: Clock range etisserant@0: t0 etisserant@0: t1 etisserant@0: t2 etisserant@0: t3 etisserant@0: t4 etisserant@0: t5 etisserant@0: t6 etisserant@0: t7 etisserant@0: t8 etisserant@0: Clock value etisserant@0: Time etisserant@0: etisserant@0: A CanOpen must be able to take delayed actions. As exemples, periodic sync emission, heartbeat production or SDO timeout need to set some alarms that will be called later and do the job.µC generaly do not have many anough free timers to handle all the CanOpen needs directly. Moreover, CanFestival internal data may be corrupt by reentrant calls. CanFestival implement a mini-scheduler (timer.c). It uses only one timer to mimic many timers. It manage an alarm table, and call alarms at time.Scheduler can handle short clock value ranges limitation found on some µC. As an example, value range for a 16bit clock counter with 4µs tick is crossed within 0.26 seconds... Long alarms must be segmented.Chronogram illustrate a long alarm (A) and a short periodic alarm (B), with a A value > clock range > B value. Values t0...t8 are successive setTimer values. t1 illustrates an intermediate call to TimeDispatch, caused by a delay longer than clock range. At the end of t1, TimeDispatch call will not trig any alarm callback. etisserant@0: etisserant@0: etisserant@0: HW interfaces etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: SCHEDULINGtimer.cSetAlarmDelAlarmTimeDispatch etisserant@0: etisserant@0: etisserant@0: etisserant@0: SYSTEM TIMERSINTERFACE(timers_xxx.c)setTimergetElapsedTime etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: CanFestival Library etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: Application etisserant@0: etisserant@0: etisserant@0: Callbacks etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: etisserant@0: