c-STM32:自己的函数不起作用.我该怎么修



最近我一直在使用STM32编程。我试图编写自己的函数并将其插入生成的代码中,但奇怪的是,该函数不起作用。调试时,控制器挂起在函数调用点。有人能帮我吗?如果有任何帮助,我将不胜感激!随附代码。(切除了不相关的部分([iOut_ref未用于DMA例程]

/* USER CODE BEGIN PD */
#define MAX_MEASURED_VALUE 3.3
#define MAX_VALUE 4095
/* USER CODE END PD */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint16_t iOut_ref = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void ChangeRefValue(uint16_t*, float);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void ChangeRefValue(uint16_t* valueRef, float fValueRef)
{
*valueRef = (int)(MAX_VALUE * (fValueRef / MAX_MEASURED_VALUE));
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
ChangeRefValue(&iOut_ref, 3.3);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
... ```

编译器很可能已经完全优化了函数和变量,因为它没有在任何地方使用。

因此,您的循环很可能编译为自身的单个分支指令。

https://godbolt.org/z/cYoTWfY1a

ChangeRefValue:
push    {r4, lr}
mov     r4, r0
mov     r0, r1
bl      __aeabi_f2d
adr     r3, .L2
ldrd    r2, [r3]
bl      __aeabi_ddiv
adr     r3, .L2+8
ldrd    r2, [r3]
bl      __aeabi_dmul
bl      __aeabi_d2iz
strh    r0, [r4]        @ movhi
pop     {r4, pc}
.L2:
.word   1717986918
.word   1074423398
.word   0
.word   1085275648
main:
push    {r3, lr}
bl      HAL_Init
bl      SystemClock_Config
.L5:
b       .L5
iOut_ref:

或启用FPU时:

ChangeRefValue:
vldr.32 s15, .L2
vmul.f32        s0, s0, s15
vcvt.s32.f32    s0, s0
vmov    r3, s0  @ int
strh    r3, [r0]        @ movhi
bx      lr
.L2:
.word   1151016216
main:
push    {r3, lr}
bl      HAL_Init
bl      SystemClock_Config
.L5:
b       .L5
iOut_ref:

您只需要编写一个稍微复杂一点的程序,并在某个地方使用函数的结果。

相关内容

最新更新