调试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
相同)的指针传递给转换函数,然后转换函数将从该位置开始读取四个字节。在使用消息的初始字节之后,这看起来有点混乱。