gpt4 book ai didi

在 C 中将偏移字节数组转换为 int32 数组

转载 作者:行者123 更新时间:2023-12-02 09:32:10 25 4
gpt4 key购买 nike

背景我正在使用 IAR Embedded Workbench IDE 和工具链开发一个用 C 语言编写的嵌入式应用程序,该应用程序在 STM32F091(ARM Cortex-M0 内核)微 Controller 上运行。应用程序将数据写入微 Controller 嵌入式闪存,只能输入 32 位字(也许半字也可以)。

问题描述数据存储在 uint8_t 字节类型数组中,开头是一些 header 信息(在本例中是来自板载调制解调器的 AT 响应代码),不应将其写入闪存。我想发送一个 uint32_t 指针到 uint8_t 缓冲区中实际数据开始的位置。但如果此偏移量不是 4 字节对齐,我的应用程序就会崩溃,因为它尝试访问未对齐的 uint32_t 类型。

这描述了我想要做的事情(不是真正的代码,只是一个例子):

uint8_t modemResponseBuffer[MAX_MODEM_RESPONSE_SIZE];

/* Get the modem response data (including modem response header data) */
size_t modemResponseSize = GetModemResponseData(modemResponseBuffer);

/* Get the actual data size from the header information */
size_t dataSize = GetActualDataSizeFromModemResponseHeader(modemResponseBuffer);

/* Get the offset to where the actual data starts in the modem response */
size_t modemDataOffset = GetModemResponseDataOffset(modemResponseBuffer);

/* Write the data part of the response to embedded flash memory.
The modemDataOffset can be any number which messes up 4 byte data alignment */
ProgramFlashMemory(DATA_FLASH_STORAGE_ADDRESS, (uint32_t*)&modemResponseBuffer[modemDataoffset],
dataSize);

ProgramFlashMemory函数内,循环调用FLASH_ProgramWord标准外设库函数。

问题我如何有效地解决这个问题?我正在使用一个内存量有限(32 kb RAM)的系统,因此我不想将所需的内容从 uint8_t 缓冲区复制到 uint32_t 类型的新缓冲区。目前,我已经通过循环手动逐字节对齐数据,但这对我来说似乎相当笨拙。但我还没有想出更好的解决方案,我对在这里可能收到的建议很感兴趣。

此外,如果有人有相关知识,我也想知道为什么应用程序在这种情况下崩溃。我的核心(或任何核心?)无法处理未对齐的数据类型的原因是什么?

最佳答案

更改 ProgramFlashMemory() 以获取 void*,然后在内部将其转换为 uint8_t*,然后使用四个字节对其进行迭代一次写入 unit32_t,然后将其写入闪存。

void* 允许写入任何对象的地址,而无需显式转换。

类似于:

int ProgramFlashMemory( uint32_t* addr, void* data, int length )
{
int byte = 0 ;
int word = 0 ;

while( byte < length )
{
uint32_t flash_word = 0 ;

// Copy four bytes to word
// Note: little-endian byte order assumed,
// reverse for big-endian.
// If end is not aligned, fill with 0xff.
for( b = 0; b < 4; b++ )
{
flash_word |= byte < length ?
(uint8_t*)data[byte] << (b<<3) :
0xFF ;
byte++ ;
}

ProgramFlashWord( addr[word], flash_word ) ;
word++ ;
}

// Return bytes written - may be linger than `length` by up-to
// three for end-alignment.
return byte ;
}

您可能希望保留原始的 ProgramFlashMemory() 以实现高效的对齐写入,在这种情况下可能是 ProgramFlashMemoryUnaligned()。请注意,您不仅需要注意对齐方式,还需要注意长度不一定能被四整除。

关于在 C 中将偏移字节数组转换为 int32 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com