Структуры и указатели с точки зрения практики. Вызов функции с одним параметром
LDRB.W R0, [R5],#1
BL LCD_send_data
Вызов функции с указателем на структуру и одним параметром
MOVS R1, #1 ; параметр
MOV R0, R4 ; Указатель на структуру
BL GPIO_PinRemapConfig
Никаких лишних телодвижений.
Вызов функции с возвращением одного параметра
BL get_last_menu_func
LDR R0, [R0]
Вызов функции с возвращением результата по указателю
LDR R0, [SP,#8]
BL strlen
LDR R1, [SP,#8]
Одна добавочная команда
Вызов функции с передачей пареметра "указатель на локально созданную структуру"
LDR.W R5, =TIM16_CR1 ; =0x40014400
MOVW R0, #0xFFFF
STRH.W R0, [SP,#4]
MOVS R3, #0
LDR R0, [SP,#0x18]
LDR.W R1, =0xF4240
STRH.W R3, [SP,#6]
UDIV.W R1, R0, R1
SUBS R2, R1, #1
STRH.W R2, [SP]
STRH.W R3, [SP,#2]
MOV R1, SP ; указатель на структуру
MOV R0, R5
BL TIM_TimeBaseInit
Тоже очень красиво, не нужно никакой кучи и malloc()
В стеке формируем структуру, а после вызова функции очищаем стек
Итого как не крути, для структур лучше поморочиться с указателями, а не надеятся на компилятор.
А для "обычных" переменных лучше без указателя.