硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1714|回复: 4
收起左侧

[有问必答] STM32H750 qspi下编译 带malloc函数程序 无法运行

[复制链接]

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2021-8-27 10:36:56 | 显示全部楼层 |阅读模式
如题  STM32H750 flash太小  采用外部flash方案

启动程序放在 MCU内  用QSPI总线 内存映射方式跳转应用程序
应用程序放在外部flash



如果不用启动程序,应用程序(带malloc等内存函数)直接放在MCU内 ,一切正常。
启动程序+应用程序在片外(不带malloc等内存函数)一切正常
启动程序+应用程序在片外(带malloc等内存函数) 应用程序无法启动,执行完成启动程序后直接结束了,求大神帮助




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2021-8-28 08:58:55 | 显示全部楼层
可以考虑使用我这个帖子的方案,锁定下是那部分代码的问题

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
http://www.armbbs.cn/forum.php?m ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2021-8-28 11:26:09 | 显示全部楼层
谢谢版主指导
发现个新现象   现在启动程序 和 APP 都在H750内部   H750实际貌似有2M flash
启动程序 在0x8000000
APP 程序 在0x8020000

启动程序跳转如下,貌似是版主的

static void JumpToApp(void)
{
        uint32_t i=0;
        void (*AppJump)(void);         /* 声明一个函数指针 */
   
   
    __IO uint32_t AppAddr = 0x08020000;  /* APP 地址 */

   

    /* 关闭全局中断 */
        DISABLE_INT();
   
    /* 设置所有时钟到默认状态,使用HSI时钟 */
        HAL_RCC_DeInit();
   
        /* 关闭滴答定时器,复位到默认值 */
        SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

        /* 关闭所有中断,清除所有中断挂起标志 */
        for (i = 0; i < 8; i++)
        {
                NVIC->ICER[i]=0xFFFFFFFF;
                NVIC->ICPR[i]=0xFFFFFFFF;
        }       

        /* 使能全局中断 */
        ENABLE_INT();

        /* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
        AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));

        /* 设置主堆栈指针 */
        __set_MSP(*(uint32_t *)AppAddr);
       
        /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
        __set_CONTROL(0);

        /* 跳转到系统BootLoader */
        AppJump();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}



APP 程序屏蔽下面这句话后编译 启动程序和APP一切正常  有了就只有启动程序运行,无法启动APP程序(是无法启动,不是运行后卡死)

int main(void)
{
   
   
        SCB->VTOR = 0x08020000;
...
}
   

static void AppTask11(void *argument)
{

        osDelay(5000);

        //strabc = (char *) malloc(4);//申请一个内存空间 去掉一切OK

        while(1)
        {
                osDelay(1000);
        }               
}
回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2021-8-28 16:40:54 | 显示全部楼层
最新测试  APP 程序 改为裸机 和 FreeRTOS都正常   APP 程序 用RTX5 就不行。。。。

APP 跑RTX5 只能2选1  要么不用启动程序自己启动,要么不用malloc函数  。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2021-8-28 17:26:55 | 显示全部楼层
tankooo 发表于 2021-8-28 16:40
最新测试  APP 程序 改为裸机 和 FreeRTOS都正常   APP 程序 用RTX5 就不行。。。。

APP 跑RTX5 只能2选 ...

参考我这个整下

分享个基于STM32H7的BOOT和APP代码都使用RTX5的案例,相互之间任意跳转
http://www.armbbs.cn/forum.php?m ... 7247&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 16:06 , Processed in 0.205486 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表