[STM32]

关于数组字节对齐引起的HardFault异常中断

[复制链接]
365|1
手机看帖
扫描二维码
随时随地手机跟帖
shipeng1989|  楼主 | 2022-11-30 17:44 | 显示全部楼层 |阅读模式
最近用到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字节(临时变量都是放在堆栈中的),从而导致堆栈溢出。
511156387235bc4190.png

推荐解决方案:
/**
  * @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
  };



使用特权

评论回复

相关帖子

R2D2| | 2022-11-30 21:01 | 显示全部楼层
STM32的HAL库是一个制杖逼着一群苦逼程序员写的,要不是还有LL库我就放弃STM32了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则