1-wire. Fixed possible deadlock situation.
In old code thread could be suspended *after* the callback was called. New code protected with more wide critical section.
This commit is contained in:
parent
53684030c9
commit
c0e6748a9f
|
@ -664,11 +664,11 @@ bool onewireReset(onewireDriver *owp) {
|
||||||
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
||||||
|
|
||||||
ow_bus_active(owp);
|
ow_bus_active(owp);
|
||||||
pwmEnableChannel(pwmd, mch, ONEWIRE_RESET_LOW_WIDTH);
|
|
||||||
pwmEnableChannel(pwmd, sch, ONEWIRE_RESET_SAMPLE_WIDTH);
|
|
||||||
pwmEnableChannelNotification(pwmd, sch);
|
|
||||||
|
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
|
pwmEnableChannelI(pwmd, mch, ONEWIRE_RESET_LOW_WIDTH);
|
||||||
|
pwmEnableChannelI(pwmd, sch, ONEWIRE_RESET_SAMPLE_WIDTH);
|
||||||
|
pwmEnableChannelNotificationI(pwmd, sch);
|
||||||
osalThreadSuspendS(&owp->thread);
|
osalThreadSuspendS(&owp->thread);
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
|
|
||||||
|
@ -717,11 +717,10 @@ void onewireRead(onewireDriver *owp, uint8_t *rxbuf, size_t rxbytes) {
|
||||||
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
||||||
|
|
||||||
ow_bus_active(owp);
|
ow_bus_active(owp);
|
||||||
pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH);
|
|
||||||
pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
|
|
||||||
pwmEnableChannelNotification(pwmd, sch);
|
|
||||||
|
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
|
pwmEnableChannelI(pwmd, mch, ONEWIRE_ONE_WIDTH);
|
||||||
|
pwmEnableChannelI(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
|
||||||
|
pwmEnableChannelNotificationI(pwmd, sch);
|
||||||
osalThreadSuspendS(&owp->thread);
|
osalThreadSuspendS(&owp->thread);
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
|
|
||||||
|
@ -776,9 +775,8 @@ void onewireWrite(onewireDriver *owp, uint8_t *txbuf,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ow_bus_active(owp);
|
ow_bus_active(owp);
|
||||||
pwmEnablePeriodicNotification(pwmd);
|
|
||||||
|
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
|
pwmEnablePeriodicNotificationI(pwmd);
|
||||||
osalThreadSuspendS(&owp->thread);
|
osalThreadSuspendS(&owp->thread);
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
|
|
||||||
|
@ -853,11 +851,10 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
|
||||||
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
pwmcfg->channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
|
||||||
|
|
||||||
ow_bus_active(owp);
|
ow_bus_active(owp);
|
||||||
pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH);
|
|
||||||
pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
|
|
||||||
pwmEnableChannelNotification(pwmd, sch);
|
|
||||||
|
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
|
pwmEnableChannelI(pwmd, mch, ONEWIRE_ONE_WIDTH);
|
||||||
|
pwmEnableChannelI(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
|
||||||
|
pwmEnableChannelNotificationI(pwmd, sch);
|
||||||
osalThreadSuspendS(&owp->thread);
|
osalThreadSuspendS(&owp->thread);
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue