[edit] I still have random crashes in __ssprint_r even if I am using integers (no floats). I've pasted below the disassembly code. The last instruction fetched is the last one (0x17838). I'm using newlib-nohost and the optimisation flags are set to -O3
__ssprint_r:
00017790: ldr r3, [r2, #8]
00017792: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
00017796: mov r9, r2
00017798: sub sp, #12
0001779a: cmp r3, #0
0001779c: beq.n 0x1788c <__ssprint_r+252>
0001779e: ldr r7, [r2, #0]
000177a0: mov r8, r0
000177a2: mov r4, r1
000177a4: ldr r0, [r1, #0]
000177a6: adds r7, #8
000177a8: ldr r5, [r1, #8]
000177aa: b.n 0x17844 <__ssprint_r+180>
000177ac: ldrh.w r12, [r4, #12]
000177b0: tst.w r12, #1152 ; 0x480
000177b4: beq.n 0x17820 <__ssprint_r+144>
000177b6: ldrd r1, r2, [r4, #16]
000177ba: adds.w r2, r2, r2, lsl #1
000177be: sub.w r5, r0, r1
000177c2: it mi
000177c4: addmi r2, #1
000177c6: adds r0, r5, r6
000177c8: mov.w r11, r2, asr #1
000177cc: adds r0, #1
000177ce: cmp r0, r11
000177d0: mov r2, r11
000177d2: bls.n 0x177d8 <__ssprint_r+72>
000177d4: mov r11, r0
000177d6: mov r2, r0
000177d8: tst.w r12, #1024 ; 0x400
000177dc: str r3, [sp, #4]
000177de: beq.n 0x17858 <__ssprint_r+200>
000177e0: mov r1, r2
000177e2: mov r0, r8
000177e4: bl 0x15fa4 <_malloc_r>
000177e8: ldr r3, [sp, #4]
000177ea: mov r10, r0
000177ec: cmp r0, #0
000177ee: beq.n 0x1786e <__ssprint_r+222>
000177f0: mov r2, r5
000177f2: ldr r1, [r4, #16]
000177f4: str r3, [sp, #4]
000177f6: bl 0x16540 <memcpy>
000177fa: ldrh r2, [r4, #12]
000177fc: ldr r3, [sp, #4]
000177fe: bic.w r2, r2, #1152 ; 0x480
00017802: orr.w r2, r2, #128 ; 0x80
00017806: strh r2, [r4, #12]
00017808: add.w r0, r10, r5
0001780c: sub.w r2, r11, r5
00017810: str.w r10, [r4, #16]
00017814: mov r5, r6
00017816: mov r10, r6
00017818: str r0, [r4, #0]
0001781a: str r2, [r4, #8]
0001781c: str.w r11, [r4, #20]
00017820: mov r1, r3
00017822: mov r2, r10
00017824: bl 0x1662c <memmove>
00017828: ldr r0, [r4, #8]
0001782a: ldr.w r1, [r9, #8]
0001782e: ldr r3, [r4, #0]
00017830: subs r5, r0, r5
00017832: subs r6, r1, r6
00017834: add.w r0, r3, r10
00017838: str r5, [r4, #8]
The more tasks I run in parallel, the more likely it is to produce a hardfault quickly.