mirror of https://github.com/ArduPilot/ardupilot
AP_HAL_ChibiOS: order PWM timers by DMA UP stream id to prevent deadlocks in dshot
This commit is contained in:
parent
2e9c11fbdf
commit
d0e4d510cf
|
@ -1362,14 +1362,15 @@ def parse_timer(str):
|
||||||
error("Bad timer definition %s" % str)
|
error("Bad timer definition %s" % str)
|
||||||
|
|
||||||
|
|
||||||
def write_PWM_config(f):
|
def write_PWM_config(f, ordered_timers):
|
||||||
'''write PWM config defines'''
|
'''write PWM config defines'''
|
||||||
rc_in = None
|
rc_in = None
|
||||||
rc_in_int = None
|
rc_in_int = None
|
||||||
alarm = None
|
alarm = None
|
||||||
bidir = None
|
bidir = None
|
||||||
pwm_out = []
|
pwm_out = []
|
||||||
pwm_timers = []
|
# start with the ordered list from the dma resolver
|
||||||
|
pwm_timers = ordered_timers
|
||||||
has_bidir = False
|
has_bidir = False
|
||||||
for l in bylabel.keys():
|
for l in bylabel.keys():
|
||||||
p = bylabel[l]
|
p = bylabel[l]
|
||||||
|
@ -1388,6 +1389,7 @@ def write_PWM_config(f):
|
||||||
if p.type not in pwm_timers:
|
if p.type not in pwm_timers:
|
||||||
pwm_timers.append(p.type)
|
pwm_timers.append(p.type)
|
||||||
|
|
||||||
|
|
||||||
f.write('#define HAL_PWM_COUNT %u\n' % len(pwm_out))
|
f.write('#define HAL_PWM_COUNT %u\n' % len(pwm_out))
|
||||||
if not pwm_out and not alarm:
|
if not pwm_out and not alarm:
|
||||||
print("No PWM output defined")
|
print("No PWM output defined")
|
||||||
|
@ -1471,7 +1473,7 @@ def write_PWM_config(f):
|
||||||
f.write('// PWM timer config\n')
|
f.write('// PWM timer config\n')
|
||||||
if bidir is not None:
|
if bidir is not None:
|
||||||
f.write('#define HAL_WITH_BIDIR_DSHOT\n')
|
f.write('#define HAL_WITH_BIDIR_DSHOT\n')
|
||||||
for t in sorted(pwm_timers):
|
for t in pwm_timers:
|
||||||
n = int(t[3:])
|
n = int(t[3:])
|
||||||
f.write('#define STM32_PWM_USE_TIM%u TRUE\n' % n)
|
f.write('#define STM32_PWM_USE_TIM%u TRUE\n' % n)
|
||||||
f.write('#define STM32_TIM%u_SUPPRESS_ISR\n' % n)
|
f.write('#define STM32_TIM%u_SUPPRESS_ISR\n' % n)
|
||||||
|
@ -1479,7 +1481,8 @@ def write_PWM_config(f):
|
||||||
f.write('// PWM output config\n')
|
f.write('// PWM output config\n')
|
||||||
groups = []
|
groups = []
|
||||||
have_complementary = False
|
have_complementary = False
|
||||||
for t in sorted(pwm_timers):
|
|
||||||
|
for t in pwm_timers:
|
||||||
group = len(groups) + 1
|
group = len(groups) + 1
|
||||||
n = int(t[3:])
|
n = int(t[3:])
|
||||||
chan_list = [255, 255, 255, 255]
|
chan_list = [255, 255, 255, 255]
|
||||||
|
@ -1761,13 +1764,13 @@ def write_hwdef_header(outfilename):
|
||||||
|
|
||||||
write_peripheral_enable(f)
|
write_peripheral_enable(f)
|
||||||
|
|
||||||
dma_unassigned = dma_resolver.write_dma_header(f, periph_list, mcu_type,
|
dma_unassigned, ordered_timers = dma_resolver.write_dma_header(f, periph_list, mcu_type,
|
||||||
dma_exclude=get_dma_exclude(periph_list),
|
dma_exclude=get_dma_exclude(periph_list),
|
||||||
dma_priority=get_config('DMA_PRIORITY', default='TIM* SPI*', spaces=True),
|
dma_priority=get_config('DMA_PRIORITY', default='TIM* SPI*', spaces=True),
|
||||||
dma_noshare=get_config('DMA_NOSHARE', default='', spaces=True))
|
dma_noshare=get_config('DMA_NOSHARE', default='', spaces=True))
|
||||||
|
|
||||||
if not args.bootloader:
|
if not args.bootloader:
|
||||||
write_PWM_config(f)
|
write_PWM_config(f, ordered_timers)
|
||||||
write_I2C_config(f)
|
write_I2C_config(f)
|
||||||
write_UART_config(f)
|
write_UART_config(f)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -346,6 +346,23 @@ def write_dma_header(f, peripheral_list, mcu_type, dma_exclude=[],
|
||||||
"\n// Note: The following peripherals can't be resolved for DMA: %s\n\n"
|
"\n// Note: The following peripherals can't be resolved for DMA: %s\n\n"
|
||||||
% unassigned)
|
% unassigned)
|
||||||
|
|
||||||
|
ordered_up_channels = []
|
||||||
|
|
||||||
|
# produce a list of timers ordered by the DMA streamid of the UP channel
|
||||||
|
# this is so that the dshot code can take out the UP DMA locks in the same order as I2C and SPI
|
||||||
|
for key in curr_dict.keys():
|
||||||
|
if "_UP" in key:
|
||||||
|
ordered_up_channels.append(key)
|
||||||
|
|
||||||
|
def order_by_streamid(key):
|
||||||
|
stream = curr_dict[key]
|
||||||
|
return (stream[0] * 8 + stream[1]) * 20 + int(key[3:-3])
|
||||||
|
|
||||||
|
ordered_up_channels = sorted(ordered_up_channels, key=order_by_streamid)
|
||||||
|
ordered_timers = []
|
||||||
|
for key in ordered_up_channels:
|
||||||
|
ordered_timers.append(key[0:-3])
|
||||||
|
|
||||||
for key in sorted(curr_dict.keys()):
|
for key in sorted(curr_dict.keys()):
|
||||||
stream = curr_dict[key]
|
stream = curr_dict[key]
|
||||||
shared = ''
|
shared = ''
|
||||||
|
@ -435,7 +452,7 @@ def write_dma_header(f, peripheral_list, mcu_type, dma_exclude=[],
|
||||||
continue
|
continue
|
||||||
f.write('#define STM32_SPI_%s_DMA_STREAMS STM32_SPI_%s_TX_%s_STREAM, STM32_SPI_%s_RX_%s_STREAM\n' % (
|
f.write('#define STM32_SPI_%s_DMA_STREAMS STM32_SPI_%s_TX_%s_STREAM, STM32_SPI_%s_RX_%s_STREAM\n' % (
|
||||||
key, key, dma_name(key), key, dma_name(key)))
|
key, key, dma_name(key), key, dma_name(key)))
|
||||||
return unassigned
|
return unassigned, ordered_timers
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in New Issue