这个下面代码运行时候,获取 *data 返回BMS—ID指针,出错,但是返回数据大小正确!
/**
* @brief 获取BMS的电池ID 地址
* @param uint8_t *data 返回BMS—ID地址
* @retval 返回BMS_ID的数据大小
*/
uint8_t Read_BMS_Data_ID(uint8_t *data)
{
static uint8_t *p;
p = &(BMS_Data_ID.mName1);
printf(" p = %p\r\n",p);
// my_mem_copy(data,&(BMS_Data_ID.mName1),sizeof(BMS_Data_ID)); //复制ID信息1-13 26
data = p;
return (uint8_t)sizeof(BMS_Data_ID);
}
调用代码,这里一开始怀疑是static 定义问题,用了静态变量和局部动态变量,分别调用函数,获取ID指针,结果都是失败
static uint8_t *ID_Data;
uint8_t BMS_ID_Len = Read_BMS_Data_ID(ID_Data);
// HAL_Delay(100);
printf(" ID_Data = %p BMS_ID_Len = %d\r\n",ID_Data,BMS_ID_Len);
uint8_t *ID_Dat;
uint8_t BMS_ID_Le = Read_BMS_Data_ID(ID_Dat);
// HAL_Delay(100);
printf(" ID_Dat = %p BMS_ID_Le = %d\r\n",ID_Dat,BMS_ID_Le);
运行结果是
思考:代码中取结构体ID地址应该没有问题,现在出现这个问题,怀疑是编译器优化。
但是 我这边是是修改调用函数,把指针返回,而不是用传参返回指针。
/**
* @brief 获取BMS的电池ID 地址
* @param uint8_t *len 返回BMS—ID数据长度
* @retval 返回BMS_ID指针
*/
uint8_t *Read_pBMS_Data_ID(uint8_t *len)
{
uint8_t *p;
p = &(BMS_Data_ID.mName1);
printf(" p = %p\r\n",p);
*len = (uint8_t)sizeof(BMS_Data_ID);
return &(BMS_Data_ID.mName1);
}
调用
uint8_t BMS_ID_Len;
uint8_t *ID_Data = Read_pBMS_Data_ID(&BMS_ID_Len);
printf(" ID_Da = %p BMS_ID_L = %d\r\n",ID_Data,BMS_ID_Len);
运行结果,获取地址成功
总结;
1、外部接口函数,返回指针地址时候,尽量用返回方式,指针传参,会出现问题。