ляп виден сразу 0x40001804 ://наша функция по переключению тасков
0x40001804 <$a>:
0x40001804 0xE1A0C00D mov r12, sp
0x40001808 0xE92DD8F0 stmfd sp!, {r4-r7, r11-r12, lr-pc}//сохранили контекст
0x4000180C 0xE24CB004 sub r11, r12, #0x00000004
0x40001810 0xE1A06000 mov r6, r0
0x40001814 0xEB0000B8 bl 0x40001AFC ctl_global_interrupts_disable>
0x40001818 0xE59F20C4 ldr r2, [pc, #196]
0x4000181C 0xE5D23000 ldrb r3, [r2]
0x40001820 0xE2433001 sub r3, r3, #0x00000001
0x40001824 0xE5C23000 strb r3, [r2]
0x40001828 0xE5D23000 ldrb r3, [r2]
0x4000182C 0xE3530000 cmp r3, #0x00000000
0x40001830 0x1A000028 bne 0x400018D8
0x40001834 0xE1A01003 mov r1, r3
0x40001838 0xE59F30A8 ldr r3, [pc, #168]
0x4000183C 0xE5934000 ldr r4, [r3]
0x40001840 0xE3540000 cmp r4, #0x00000000// тут мы смотрим в таск лист - есть ли ещё таск на выполнение
0x40001844 0x0A000023 beq 0x400018D8// нет - выход из процедурки
0x40001848 0xE59F309C ldr r3, [pc, #156]
0x4000184C 0xE1A00003 mov r0, r3
0x40001850 0xE5933000 ldr r3, [r3]
0x40001854 0xE5D42004 ldrb r2, [r4, #4]//берём приоритет одной из задач (одна - выполняемая, вторая - первая в списке на выполнение)
0x40001858 0xE5D33004 ldrb r3, [r3, #4]// вот тут эта вторая
0x4000185C 0xE1520003 cmp r2, r3// сравниваем
0x40001860 0x9A00001C bls 0x400018D8// и БЛЯДЬ выходим не переключаясь если приоритет задачи на выполнение ниже или равен приоритету текущей задачи!!!
если сменить
0x40001860 0x9A00001C bls 0x400018D8
на
0x40001860 0x3A00001C bсс 0x400018D8
то у меня три задачки с равными приоритетами спокойно крутятся безо всяких проблем...