C 这是访问功能的正确方式吗?

C 这是访问功能的正确方式吗?,c,stm32,C,Stm32,我目前正在使用带操纵杆的“STM32F429I-DISC1”。我试图在LCD屏幕上画一些东西,并用操纵杆移动这个物体。我的画做得很好,但我有一个错误:“无效值不应该被忽略” 这两条线有问题 localX = Joy_ReadXY(CTRL_REG_IN3); localY = Joy_ReadXY(CTRL_REG_IN4); 有人能告诉我,我如何修复这个错误吗? 为什么我会看到这个错误 Main.c #include "stm32f429i_discovery_lc

我目前正在使用带操纵杆的“STM32F429I-DISC1”。我试图在LCD屏幕上画一些东西,并用操纵杆移动这个物体。我的画做得很好,但我有一个错误:“无效值不应该被忽略”

这两条线有问题

    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)
    {
    }
}
#包括“stm32f429i_discovery_lcd.h”
#在3 0b00011000中定义CTRL_REG_
#在4 0b00100000中定义CTRL_REG_
信号量句柄xMutex;
操纵杆数据xy;
void vTaskFunction1(void*pvParameters){
uint16_t localX;
uint16_t当地;
对于(;;){
localX=Joy\u ReadXY(CTRL\u REG\u IN3);
localY=Joy\u ReadXY(CTRL\u REG\u IN4);
xSemaphoreTake(xMutex,端口最大延迟);
xy.x=localX;
xy.y=localY;
xSemaphoreGive(xMutex);
halu延迟(10);
}
}
void vTaskFunction2(void*pvParameters){
uint32_t xCoord=240/2;
uint32_t yCoord=320/2;
uint8_t reads=0;
uint8_t球半径=5;
uint16\u t xLimitMin=球半径+25;
uint16\u t xLimitMax=240-ballRadius-25;
uint16_t yLimitMin=球半径+25;
uint16_t yLimitMax=320-ballRadius-25;
对于(;;){
xSemaphoreTake(xMutex,端口最大延迟);
如果(xy.x>3000&&!(xCoordxLimitMax))
xCoord+=5;
如果(xy.y>3000&&!(yCoordyLimitMax))
yCoord+=5;
读++;
BSP_LCD_Clear(LCD_COLOR_WHITE);
BSP_LCD_画圈(xCoord、yCoord、ballRadius);
BSP_LCD_圆角圆(xCoord、yCoord、ballRadius);
xSemaphoreGive(xMutex);
halu延迟(20);
}
}
内部主(空)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI4_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
//液晶显示器的东西
BSP_LCD_Init();
BSP_LCD_LayerDefaultInit(1,LCD_帧_缓冲区);
BSP_LCD_选择层(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();
如果(xMutex==NULL)
{
xMutex=xSemaphoreCreateMutex();
如果((xMutex)!=NULL)
xSemaphoreGive((xMutex));
}
xTaskCreate(vTaskFunction1,“任务1”,100,NULL,1,NULL);
xTaskCreate(vTaskFunction2,“任务2”,100,NULL,1,NULL);
vTaskStartScheduler();
osKernelStart();
而(1)
{
}
}
读取操纵杆功能(操纵杆c)

#包括
#包括
#包括“gpio.h”
#包括“spi.h”
#定义读取从操作0b10000000
#定义读增量从操作0b11000000
#定义写入从操作0b00000000
#在3 0b00000011中定义CTRL_REG_
#在4 0b00000100中定义CTRL_REG_
#定义OUT_X_L 0x28
#定义OUT_X_H 0x29
#定义OUT_Y_L 0x2A
#定义OUT_Y_H 0x2B
#定义OUT_Z_L 0x2C
#定义OUT_Z_H 0x2D
#定义JOY_CS_LOW()HAL_GPIO_WritePin(JOY_CS_GPIO_端口,JOY_CS_引脚,0)
#定义JOY_CS_HIGH()HAL_GPIO_WritePin(JOY_CS_GPIO_端口,JOY_CS_引脚,1)
#定义JOY\u CS\u GPIO\u端口GPIOC
#定义JOY_CS_引脚GPIO_引脚_13
int16_t Joy_ReadXY(uint8_t reg1){
uint8_t ptxdata[2]={reg1,0};
uint8_t pRxData1[2]={0,0};
乔伊·卡苏·洛();
HAL_SPI_传输接收器(和hspi4、pTxData1、pRxData1、2、HAL_最大延迟);
快乐(高);

return pRxData1[0]这里,在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函数的函数体之前完成。(并且您已经在注释中确认它修复了代码中描述的问题。)

请注意,对于所示的其他函数,这是不需要的,因为它们在调用之前已定义(带有头部和身体)。
其他函数也类似,它们的原型在前面包含的标题中提供


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

我认为您由于缺少原型而混淆了编译器。请尝试在
void vTaskFunction1(void*pvParameters)之前添加
int16\t Joy\u ReadXY(uint8\t reg1);
{
。如果有帮助,我将创建一个解释性答案。运行
strace
gdb
来定位错误所在thrown@ralfhtp您认为这是一个运行时问题吗?对我来说就像编译时警告/错误。不一定,但如果编译器错误阻止编译,您也可以使用strace和gdbNot调试代码问题g和跑步。
int16_t Joy_ReadXY(uint8_t reg1);