最近用到ST的M0核芯片STM32F030,在移植官方的IAP例程的时候问题有如滔滔江水连三绵绵不绝呀,始终的运行不起来。我不得不对ST的例程创作人员的业务能力表示严重的怀疑。
问题1:
临时变量定义大数组导致堆栈溢出:
/**
* @brief Receive a file using the ymodem protocol
* @param buf: Address of the first byte
* @retval The size of the file
*/
int32_t Ymodem_Receive (uint8_t *buf)
{
uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
...
数组“packet_data”长度有1024以上,而堆栈大小默认只有1024字节(临时变量都是放在堆栈中的),从而导致堆栈溢出。
推荐解决方案:
/**
* @brief Receive a file using the ymodem protocol
* @param buf: Address of the first byte
* @retval The size of the file
*/
int32_t Ymodem_Receive (uint8_t *buf)
{
static uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD];
uint8_t file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
...
问题2:
字节型数组未作word(4字节)对齐,导致强制类型转换uint32_t访问时出现HardFault异常中断
uint8_t tab_1024[1024] =
{
0
};
推荐解决方案:
uint8_t __attribute__((aligned(4))) tab_1024[1024] =
{
0
};
|