2015.07.15-编译stm32-soft在初始化BOOT任务时挂死(KEIL)

本文讨论了在使用KEIL编译STM32固件时遇到的初始化BOOT任务过程中触发FAULT故障的问题。故障源于对象容器长度计算错误,导致对象链表被覆盖,进而使得链表首指针在检查重名对象时变为NULL,从而引发MemFault。修复此问题的关键在于正确计算并初始化对象容器的长度。
摘要由CSDN通过智能技术生成
【问题现象】

初始化BOOT任务过程中发生FAULT故障。

【问题原因】

对象容器的长度与容器中POOL的数量有关,但在初始化对象容器时,使用默认的容器长度进行初始化导致对象容器长度计算错误覆盖对象链表,当对象链表上检查重名对象时,链表首指针为NULL导致MemFault故障。

修改前:

EXPORT E_STATUS CORE_CreatePoolContainer(LPCORE_CONTAINER lpManager, LPCSTR lpName,
                                BYTE_PTR lpTable, BYTE Pools, BYTE BlockPrePool, 
                                SIZE_T BytePreBlock, BOOL AllocForInit)
{
    KPOOL_ID_T Pid = 0;

    memset(lpManager, 0, sizeof(CORE_CONTAINER));
    
    SetContainerName(lpManager, lpName);

修改后

EXPORT E_STATUS CORE_CreatePoolContainer(LPCORE_CONTAINER lpManager, LPCSTR lpName,
                                BYTE_PTR lpTable, BYTE Pools, BYTE BlockPrePool, 
                                SIZE_T BytePreBlock, BOOL AllocForInit)
{
    KPOOL_ID_T Pid = 0;

    memset(lpManager, 0, sizeof(CONTAINER_ATTRIBUTE) + sizeof(CORE_POOL) * Pools);
    
    SetContainerName(lpManager, lpName);

容器类的定义:

struct tagCORE_CONTAINER{
    CONTAINER_ATTRIBUTE Attribute;
    CORE_POOL           Pool[CONFIG_CORE_POOL_MAX];                 /**< Pools */
};
CONFIG_CORE_POOL_MAX = 8

容器实例定义:

struct tagOBJECT3_CONTAINER{
    CONTAINER_ATTRIBUTE Attribute;
    CORE_POOL           Pool[CONFIG_OBJECT3_POOL_MAX + !CONFIG_OBJECT3_POOL_MAX];
                                                                    /**< Pools */
};
CONFIG_OBJECT3_POOL_MAX = 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值