调试GDB时告诉我以下错误:

0x800c99ed00000001 < error: Cannot access memory at address 0x800c99ed00000001>

如果在调试时调用convertbytatearrytofloat时放置断点,则会产生错误。
但是程序没有问题,给了我一个好的结果?
我的主文件:
#include "Local.h"

int main(void) {

    if(HandleReceivedMessages() == OP_COMPLETED){
        printf("Main Completed \n" );
    } else {
        printf("Main Failed \n");
    }
    return 0;
}

本地.h
#ifndef LOCAL_H_
#define LOCAL_H_

#include "Common.h"

T_OP_STATUS HandleReceivedMessages(void);

#endif

本地c
#include "Handler.h"
#include "Local.h"

uint8_t message[] = {0x86, 0x9a, 0xa0, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x10, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xe1};

uint8_t length = 16;

T_OP_STATUS HandleReceivedMessages(void) {

    if(HandleResponseMessage(message, length) == STATUS_SUCCESS) {
        printf("Completed from Local \n");
        return OP_COMPLETED;
    } else {
        printf("Failed from Local \n");
        return OP_FAILED;
    }

}

处理程序.h
#ifndef HANDLER_H_
#define HANDLER_H_

#include "Common.h"

T_MESSAGE_STATUS HandleResponseMessage(uint8_t *requestData, uint8_t msgLength);


#endif /* HANDLER_H_ */

处理程序c
#include "Handler.h"
#include <string.h>

static uint8_t rawRequestData[BUFFER_WIRED_SIZE];

static float TempFloat = 0;


T_MESSAGE_STATUS HandleCmd(uint16_t cmdNumber, uint8_t rawDataLength,
                    uint8_t *rawDataPtr) {

    switch (cmdNumber) {
        case 1:
            TempFloat = ConvertByteArrayToFloat(&rawDataPtr[3]);
            printf("The value of the float is : %f \n", TempFloat);
            return STATUS_SUCCESS;
        default:
            break;
    }

    return STATUS_NOT_IMPLEMENTED;
}


T_MESSAGE_STATUS HandleResponseMessage(uint8_t *message,
                                uint8_t msgLength) {

    uint8_t cmdNumber, dataLength, startOfData;


    // Check the delimiter.
    if (message[0] & INDICATOR_UNIQUE_ADDRESS) {

        cmdNumber = message[6];
        dataLength = message[7];
        startOfData = 8;

    } else {

        cmdNumber = message[2];
        dataLength = message[3];
        startOfData = 4;
    }

    // we copy only the real data from the command response
    memcpy(&rawRequestData, message + startOfData, dataLength);

    return HandleCmd(cmdNumber, dataLength, rawRequestData);

}

普通.h
#ifndef COMMON_H_
#define COMMON_H_

#include <stdint.h>
#include <stdio.h>

#define BUFFER_WIRED_SIZE               128
#define INDICATOR_UNIQUE_ADDRESS        0x80


typedef enum {

    OP_FAILED,
    OP_COMPLETED,

}T_OP_STATUS;

typedef enum
{
    STATUS_SUCCESS,
    STATUS_NOT_IMPLEMENTED,

} T_MESSAGE_STATUS;

float ConvertByteArrayToFloat(uint8_t *data);


#endif /* COMMON_H_ */

普通c
#include "Common.h"

float ConvertByteArrayToFloat(uint8_t *data) {

    union {
        uint8_t tmpArray[4];
        float tmpFloat;
   } value;

    value.tmpArray[0] = data[3];
    value.tmpArray[1] = data[2];
    value.tmpArray[2] = data[1];
    value.tmpArray[3] = data[0];

    return value.tmpFloat;
}

这是最小版本(它做了很多事情,比如检查消息的格式、CRC等等),但是从头到尾都是这些文件。
我在一个嵌入式平台上工作,当我在微控制器中调试并调用convertbytarrytofloat函数时,我的程序跳转到我代码的其他部分,然后它会使微控制器崩溃。
我试图在没有微控制器的情况下在我的计算机中重新创建错误,我在顶部找到了错误。

最佳答案

这:

TempFloat = ConvertByteArrayToFloat(&rawDataPtr[3]);

(其中rawDataPtr是一个uint8_t *参数)看起来非常可疑。将指向rawDataPtr处第四个字节(与rawDataPtr + 3相同)的指针传递给转换函数,然后转换函数将从该位置开始读取四个字节。
在使用消息的初始字节之后,这看起来有点混乱。

10-08 02:34