【问题标题】:Is this the right way to access function?这是访问功能的正确方法吗?
【发布时间】:2020-12-14 12:11:43
【问题描述】:

我目前正在使用带有操纵杆的“STM32F429I-DISC1”。我正在尝试在 LCD 屏幕上绘制一些东西并使用操纵杆移动这个对象。我的绘图工作正常,但出现错误:“ void value not ignored as it hould be”。

这两行有问题...

    localX = Joy_ReadXY(CTRL_REG_IN3);
    localY = Joy_ReadXY(CTRL_REG_IN4);

谁能告诉我,我该如何解决这个错误?
为什么我会看到这个错误?

Main.c

#include "stm32f429i_discovery_lcd.h"

#define CTRL_REG_IN3                0b00011000
#define CTRL_REG_IN4                0b00100000

SemaphoreHandle_t xMutex;
Joystick_data xy;

void vTaskFunction1(void *pvParameters) {
    uint16_t localX;
    uint16_t localY;

    for(;;) {
        localX = Joy_ReadXY(CTRL_REG_IN3);
        localY = Joy_ReadXY(CTRL_REG_IN4);

        xSemaphoreTake( xMutex, portMAX_DELAY );

        xy.x = localX;
        xy.y = localY;

        xSemaphoreGive( xMutex );
        HAL_Delay(10);
    }
}

void vTaskFunction2(void *pvParameters) {
    uint32_t xCoord = 240/2;
    uint32_t yCoord = 320/2;
    uint8_t reads = 0;
    uint8_t ballRadius = 5;
    uint16_t xLimitMin = ballRadius+25;
    uint16_t xLimitMax = 240-ballRadius-25;
    uint16_t yLimitMin = ballRadius+25;
    uint16_t yLimitMax = 320-ballRadius-25;
    for(;;) {
        xSemaphoreTake( xMutex, portMAX_DELAY );
        if (xy.x > 3000 && !(xCoord < xLimitMin))
            xCoord -= 5;
        if (xy.x < 1000 && !(xCoord > xLimitMax))
            xCoord += 5;

        if (xy.y > 3000 && !(yCoord < yLimitMin))
            yCoord -= 5;
        if (xy.y < 1000 && !(yCoord > yLimitMax))
            yCoord += 5;
        reads++;
        BSP_LCD_Clear(LCD_COLOR_WHITE);
        BSP_LCD_DrawCircle(xCoord, yCoord, ballRadius);
        BSP_LCD_FillCircle(xCoord, yCoord, ballRadius);
        xSemaphoreGive(xMutex);
        HAL_Delay(20);
    }
}

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI4_Init();
    MX_TIM1_Init();
    MX_USART1_UART_Init();
    // LCD Things
    BSP_LCD_Init();
    BSP_LCD_LayerDefaultInit(1, LCD_FRAME_BUFFER);
    BSP_LCD_SelectLayer(1);
    BSP_LCD_SetBackColor(LCD_COLOR_WHITE); // Vali meelepärane värv
    BSP_LCD_Clear(LCD_COLOR_WHITE);
    BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); // Vali meelepärane värv

    MX_FREERTOS_Init();

    if ( xMutex == NULL )
    {
        xMutex = xSemaphoreCreateMutex();
        if ( ( xMutex ) != NULL )
            xSemaphoreGive( ( xMutex ) );
    }

    xTaskCreate(vTaskFunction1, "Task 1", 100, NULL, 1, NULL);
    xTaskCreate(vTaskFunction2, "Task 2", 100, NULL, 1, NULL);

    vTaskStartScheduler();

    osKernelStart();

    while (1)
    {
    }
}

读取摇杆函数(joystick.c)

#include <stdio.h>
#include <main.h>
#include "gpio.h"
#include "spi.h"

#define READ_SLAVE_OPERATION        0b10000000
#define READ_INCR_SLAVE_OPERATION   0b11000000
#define WRITE_SLAVE_OPERATION       0b00000000
#define CTRL_REG_IN3                0b00000011
#define CTRL_REG_IN4                0b00000100

#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D

#define JOY_CS_LOW()     HAL_GPIO_WritePin(JOY_CS_GPIO_PORT, JOY_CS_PIN, 0)
#define JOY_CS_HIGH()     HAL_GPIO_WritePin(JOY_CS_GPIO_PORT, JOY_CS_PIN, 1)

#define JOY_CS_GPIO_PORT GPIOC
#define JOY_CS_PIN       GPIO_PIN_13

int16_t Joy_ReadXY(uint8_t reg1){

    uint8_t pTxData1[2] = {reg1, 0};
    uint8_t pRxData1[2] = {0, 0};
    JOY_CS_LOW();
    HAL_SPI_TransmitReceive(&hspi4, pTxData1, pRxData1, 2, HAL_MAX_DELAY);
    JOY_CS_HIGH();

    return pRxData1[0] << 8 | pRxData1[1];
}

【问题讨论】:

  • 我认为您因缺少原型而使编译器感到困惑。请尝试在void vTaskFunction1(void *pvParameters) { 之前添加int16_t Joy_ReadXY(uint8_t reg1);。如果这有帮助,我将创建一个解释性答案。
  • 运行 stracegdb 以定位引发错误的位置
  • @ralfhtp 您认为这是运行时问题吗?对我来说就像编译时警告/错误一样。
  • 不一定,但您也可以使用 strace 和 gdb 调试代码问题
  • 如果编译器错误阻止构建和运行,则不会。

标签: c stm32


【解决方案1】:

在这里,在 Main.c 中,您在告诉编译器它有哪些参数和返回值类型之前调用该函数。

        localX = Joy_ReadXY(CTRL_REG_IN3);
        localY = Joy_ReadXY(CTRL_REG_IN4)

这让编译器感到困惑,它开始“猜测”它们。
猜测它是一个返回 void 的函数,编译器然后抱怨你期望一个函数的返回值确实返回 void 即什么都没有。
返回的void 应该被忽略,而不是尝试将其写入变量。至少编译器是这么认为的……

要修复它,您应该向编译器说明在别处有一个函数,具有名称、参数和返回值类型。这是通过提供原型来完成的

int16_t Joy_ReadXY(uint8_t reg1);

需要在第一次调用extern函数的函数体之前完成。 (并且您已经在 cmets 中确认它修复了代码中描述的问题。)

请注意,对于其他显示的函数,这不是必需的,因为它们是在调用之前定义的(带有头部和主体)。
其他函数类似,它们的原型在您早期包含的标头中提供。

实际上,将函数的原型放入标题中并类似地包含它是解决此问题的最佳方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2011-03-02
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多