#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#define SBL_SUCCESS 0
#define SBL_ERROR 1
#define SBL_ARGUMENT_ERROR 2
uint32_t addressInFlash(uint32_t address, uint32_t size);
void setState(uint32_t errorCode, const char *message, …);
uint32_t sendCmd(uint32_t cmd, char *payload, uint32_t size);
uint32_t getCmdResponse(bool *bSuccess);
void ulToCharArray(uint32_t ul, char *charArray);
uint32_t cmdDownload(uint32_t ui32Address, uint32_t ui32Size) {
uint32_t retCode = SBL_SUCCESS;
bool bSuccess = false;
// Check input arguments
if(!addressInFlash(ui32Address, ui32Size))
{
setState(SBL_ARGUMENT_ERROR, "Flash download: Address range (0x%08X + %d bytes) is not in device FLASH nor RAM.\n", ui32Address, ui32Size);
return SBL_ARGUMENT_ERROR;
}
if(ui32Size & 0x03)
{
setState(SBL_ARGUMENT_ERROR, "Flash download: Byte count must be a multiple of 4\n");
return SBL_ARGUMENT_ERROR;
}
// Generate payload
// - 4B Program address
// - 4B Program size
char pcPayload[8];
ulToCharArray(ui32Address, &pcPayload[0]);
ulToCharArray(ui32Size, &pcPayload[4]);
// Send command
if((retCode = sendCmd(/*CMD_DOWNLOAD constant*/, pcPayload, 8)) != SBL_SUCCESS)
{
return retCode;
}
// Receive command response (ACK/NAK)
if((retCode = getCmdResponse(&bSuccess)) != SBL_SUCCESS)
{
return retCode;
}
// Return command response
return (bSuccess) ? SBL_SUCCESS : SBL_ERROR;
}
解释:
我们首先引入了必要的头文件来定义数据类型如uint32_t和bool。
将原来的类成员函数SblDeviceCC2650::cmdDownload更改为普通C函数cmdDownload。
我们去除了C++类特定的函数调用,如setState和sendCmd,而是直接调用了普通C函数(你需要提供这些函数的C语言版本实现)。
ulToCharArray 函数用来将uint32_t整数转换为字符数组,这个函数也应该以C语言方式实现。
注意,在C语言中,我们使用宏定义来定义常量,如 SBL_SUCCESS 和 SBL_ERROR。
在C语言中,我们使用bool数据类型来表示布尔值,并用true和false来表示真和假,这需要#include <stdbool.h>头文件。
请注意,这个C语言版本的代码需要你提供其他函数的C语言实现,如addressInFlash、setState、sendCmd、getCmdResponse和ulToCharArray。