[技术讨论]

ac7811 +freeRTOS+eflash

[复制链接]
3484|3
手机看帖
扫描二维码
随时随地手机跟帖
sjyf|  楼主 | 2021-7-31 23:21 | 显示全部楼层 |阅读模式
本帖最后由 sjyf 于 2021-7-31 23:43 编辑

ac7811 跑上了freeRTOS,需要永久存储少量数据,对flash不操作,程序能正常执行,一旦读或者读写eflash,在运行FREERTOS时,就会出现就会死机,进入hardfault中断。

请教各位,会是什么原因造成的?

一下是操作eflash的代码

void HoldVal_Init(void)
{
    //
    uint8_t rsl;
   
    EFLASH_UnlockCtrl();
    rsl = EFLASH_Read(USER_FLASH_PAGE_START, (uint32_t*)&hold_val, sizeof(struct T_HOLDVAL));
    if (rsl != EFLASH_STATUS_SUCCESS)
        return;
    if (hold_val.uMagic != USERMAGIC)
    {
        
        hold_val.uMagic = USERMAGIC;
        hold_val.uId = DEFAULT_UID;
        //
        
        rsl = EFLASH_PageErase(USER_FLASH_PAGE_START);     ///<erase page
    if (rsl != EFLASH_STATUS_SUCCESS)
            return;
    rsl = EFLASH_PageEraseVerify(USER_FLASH_PAGE_START);   ///< verify erase state
    if (rsl != EFLASH_STATUS_SUCCESS)
            return;
   
        rsl = EFLASH_PageProgram(USER_FLASH_PAGE_START, (uint32_t*)&hold_val, sizeof(struct T_HOLDVAL));
   
    }
    EFLASH_LockCtrl();
}


和FreeRTOS结合处:
    //Rs485_Init();
    HoldVal_Init();
    vTask_Create();
   
    vTaskStartScheduler();
   
   
    while(1);

执行到vCreate,就会当机,执行的最后一条指令,从跟踪来看是 POP指令
,如果在vCreate之前,直接执行while(1) 循环,程序可以执行,   


最后,写flash我是从0x0803F800,也就是最后一页写的,看过这段内存,全是0xFF,大概率不存在冲撞。
感觉像读写falsh,修改程序的堆栈。

请各位高手不吝指教。谢谢。

使用特权

评论回复

相关帖子

梦想成真1| | 2021-8-1 08:20 | 显示全部楼层
不知道怎么解决,

使用特权

评论回复
sjyf|  楼主 | 2021-8-1 08:57 | 显示全部楼层
哎,确实是堆栈的问题,

rsl = EFLASH_Read(USER_FLASH_PAGE_START, (uint32_t*)&hold_val, sizeof(struct T_HOLDVAL));

这一句是有问题的,EFLASH_Read是按照每次读32Bits的数,而sizeof给出的是字节数,也就是hold_val已经超出它的地址范围了。 造成的结果就不可预料了。

修改后,功能正常。

结贴。

使用特权

评论回复
这是神魔节奏| | 2021-8-25 11:43 | 显示全部楼层
我也是,不过我的数据少,直接通过内存地址读数据,我在想,写的写的时候是不是也可以通过WriteBitsValue来直接写呢?

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝