查看: 2489|回复: 11

[求助] LPC2136 iap BootLoader程序跳转至FREERTOS中,运行后程序跑飞问题

[复制链接]
  • TA的每日心情
    开心
    2024-11-20 15:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2024-11-20
    发表于 2024-10-24 15:04:57 | 显示全部楼层 |阅读模式
    本帖最后由 eefocus_4047955 于 2024-10-24 15:34 编辑

    最近在做LPC2136的BOOT实验,FLASH的读写IAP和程序跳转都没有问题,但转到FREERTOS的APP程序后,单步运行至OS中的一个上下文切换的位置,程序跑飞,目前没有思路,APP中,具体路径是:                           main()--->vTaskStartScheduler()--->xPortStartScheduler() --->vPortStartFirstTask()--->portRESTORE_CONTEXT--->{LDMFD        LR, {R0-R14}^ }

    后R14就跑飞,内容是0xAAAAAAAA,导致后续PC指针飞,但具体原因是什么未知,不知道去改什么地方。
    请教论坛大神,这可能会是什么问题?
    补充:1. FREERTOS的APP,单独运行是完全正常可以跑的程序,在这个程序 DEBUG里,我也看了上下文切换的位置,是正常的,PC不会跑飞。
              2.APP程序换成纯裸机时,没有死机现象,从BOOTLOADER跳转至APP,APP运行也是正常的。
             3. USR_Stack_Size        EQU                0x00001000,比这个值稍微设置大点,编译就不通过,报错.\bin\RTOSDemo.axf: Error: L6406E: No space in                      execution regions with .ANY selector matching startup.o(STACK).   这个也不知道原因。

    //MAIN函数
    void main()
    {
    ...

    //系统初始化
    xTaskCreate(        (TaskFunction_t) initial_system,
                            (const char *)"initial_system",
                            (u16)200,
                            (void*)NULL,
                            (BaseType_t)3,
                             (TaskHandle_t*)NULL
                    );
            

    vTaskStartScheduler();

    for(;;);



    }


    void vTaskStartScheduler( void )                                                                                                                          {
                                  ...
                    if( xPortStartScheduler() != pdFALSE )
                    {
                            /* Should not reach here as if the scheduler is running the
                            function will not return. */
                    }
                                    ...
    }



    BaseType_t xPortStartScheduler( void )
    {
                      ...

            /* Start the first task.  This is done from portISR.c as ARM mode must be
            used. */
            vPortStartFirstTask();

            /* Should not get here! */
            return 0;
    }


    vPortStartFirstTask()是用汇编写的函数如下:

    ; Starting the first task is done by just restoring the context
    ; setup by pxPortInitialiseStack
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    vPortStartFirstTask
            PRESERVE8
            portRESTORE_CONTEXT
    vPortYield
            PRESERVE8
            SVC 0
            bx lr


    portRESTORE_CONTEXT的宏定义如下,也是用汇编写的:


            IMPORT  ulCriticalNesting                ;
            IMPORT        pxCurrentTCB                        ;


            MACRO
            portRESTORE_CONTEXT


            LDR                R0, =pxCurrentTCB                ; Set the LR to the task stack.  The location was...
            LDR                R0, [R0]                                ; ... stored in pxCurrentTCB
            LDR                LR, [R0]

            LDR                R0, =ulCriticalNesting        ; The critical nesting depth is the first item on...
            LDMFD        LR!, {R1}                                ; ...the stack.  Load it into the ulCriticalNesting var.
            STR                R1, [R0]                                ;

            LDMFD        LR!, {R0}                                ; Get the SPSR from the stack.
            MSR                SPSR_cxsf, R0                        ;

            LDMFD        LR, {R0-R14}^                        ; Restore all system mode registers for the task运行到这个位置后,R14值为AAAAAAAA
            NOP                                                                ;导至后续 PC跑飞

            LDR                LR, [LR, #+60]                        ; Restore the return address

                                                                            ; And return - correcting the offset in the LR to obtain ...
            SUBS        PC, LR, #4                                ; ...the correct address.

            MEND






    我知道答案 目前已有11人回答
    DAY DAY UP
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 1176 天

    连续签到: 22 天

    [LV.10]以坛为家III

    6

    主题

    7080

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2025-7-29
    发表于 2024-10-24 15:24:43 | 显示全部楼层
    任务stack栈空间不够吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-11-20 15:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2024-11-20
     楼主| 发表于 2024-10-24 15:39:08 | 显示全部楼层
    woodwang 发表于 2024-10-24 15:24
    任务stack栈空间不够吧

    UND_Stack_Size  EQU     0x00000008
    SVC_Stack_Size  EQU     0x00000300
    ABT_Stack_Size  EQU     0x00000008
    FIQ_Stack_Size  EQU     0x00000008
    IRQ_Stack_Size  EQU     0x00000300
    USR_Stack_Size        EQU                0x00001000  这个原来设置是0x00001000  ,改大后,编译不通过,会是什么原因? 截图.png
    DAY DAY UP
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 2380 天

    连续签到: 89 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22073
    最后登录
    2025-7-29
    发表于 2024-10-24 16:44:48 | 显示全部楼层
    eefocus_4047955 发表于 2024-10-24 15:39
    UND_Stack_Size  EQU     0x00000008
    SVC_Stack_Size  EQU     0x00000300
    ABT_Stack_Size  EQU     0x00 ...

    数值大了,超过MCU的内存了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-11-20 15:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2024-11-20
     楼主| 发表于 2024-10-24 17:03:42 | 显示全部楼层
    流水源 发表于 2024-10-24 16:44
    数值大了,超过MCU的内存了

    哪个数值大了? 我把FREERTOS时的HEEP设置成10K,STACK改成0x4000就可以的,但学是有这个死机跑飞的问题,感觉是任务切换进出时,加载下文时,程序 PC指针没对啊,这个应该怎么改
    DAY DAY UP
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 2380 天

    连续签到: 89 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22073
    最后登录
    2025-7-29
    发表于 2024-10-24 17:31:30 | 显示全部楼层
    STACK改成0x4000太大了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-3-30 11:03
  • 签到天数: 457 天

    连续签到: 5 天

    [LV.9]以坛为家II

    1

    主题

    946

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2104
    最后登录
    2025-3-30
    发表于 2024-10-24 17:33:27 | 显示全部楼层
    楼主用的keil,app的程序起始地址改了没?IROM1里面起始地址改成IAP下载APP的地址
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-11-20 15:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2024-11-20
     楼主| 发表于 2024-10-25 08:38:52 | 显示全部楼层
    流水源 发表于 2024-10-24 17:31
    STACK改成0x4000太大了

    嗯,我改成0x1000就可以正常编译了。但是从BOOTLOADER跑转程序到FREERTOS中,进了MAIN函数的,直到上下文切换的时候,程序跑飞了。
    DAY DAY UP
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-11-20 15:21
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    1

    主题

    9

    帖子

    0

    新手上路

    Rank: 1

    积分
    31
    最后登录
    2024-11-20
     楼主| 发表于 2024-10-25 08:40:02 | 显示全部楼层
    eefocus_3722835 发表于 2024-10-24 17:33
    楼主用的keil,app的程序起始地址改了没?IROM1里面起始地址改成IAP下载APP的地址 ...

    我是改了的,我用裸机程序的APP,可以跳转并且正常运行,FREERTOS的APP也是可以进MAIN函数的,一直运行到OS的上下文切换的地方,程序跑飞了,不知道会是啥原因
    DAY DAY UP
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 2380 天

    连续签到: 89 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22073
    最后登录
    2025-7-29
    发表于 2024-10-25 15:42:21 | 显示全部楼层
    应该就是哪里堆栈空间设置不合理,导致溢出了。你要再检查一下各个堆栈空间用量,合理分配。

    还有汇编部分切换任务的压栈和出栈寄存器顺序要匹配
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-29 14:35 , Processed in 0.109403 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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