硬汉嵌入式论坛

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

[FreeRTOS] 目前的列子是使用的 双堆栈的吗?还是 只是用MSP的

[复制链接]

22

主题

12

回帖

21

积分

新手上路

积分
21
发表于 2016-8-11 21:31:00 | 显示全部楼层 |阅读模式
楼主,我看你的  V5开发板的 UCOS-III的教程,然后是M3权威指南,这里都说了  系统复位后默认的CONTROL[1]=0  任务和异常都是使用的MSP,我搜遍了你的 FREERTOS列子都没有发现有操作CONTROL[1]=0   的代码,所以这里使用的都是 单堆栈的模式吗?CONTROL  只能使用 msr  mrs操作改变值,我看这个太困惑了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2016-8-12 11:04:31 | 显示全部楼层
你只看了uCOS-III教程的基础知识介绍部分,uCOS-III的移植部分说明,你应该没有看到,control可以设置,
还有个也可以设置,即:
进入异常服务程序后,将自动更新 LR寄存器 的值为特殊的 EXC_RETURN,而EXC_RETURN也是可以设置工作模式和使用的堆栈指针。
FreeRTOS是在初始每个任务的时候,专门保存了下这个:
1.jpg
回复

使用道具 举报

22

主题

12

回帖

21

积分

新手上路

积分
21
 楼主| 发表于 2016-8-12 17:27:59 | 显示全部楼层
楼主  ,我用的V4板子的历程,没有你说的这个代码呢?是这个
    pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
    *pxTopOfStack = portINITIAL_XPSR;    /* xPSR */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) pxCode;    /* PC */
    pxTopOfStack--;
    *pxTopOfStack = ( StackType_t ) prvTaskExitError;    /* LR */

    pxTopOfStack -= 5;    /* R12, R3, R2 and R1. */
    *pxTopOfStack = ( StackType_t ) pvParameters;    /* R0 */
    pxTopOfStack -= 8;    /* R11, R10, R9, R8, R7, R6, R5 and R4. */

    return pxTopOfStack;

       我可以这么理解FREERTOS的双堆栈设计实现吗?
        首先是  默认复位时 是使用的MSP指针,特权模式,然后系统启动 第一个任务的时候 使用的是SVC系统调用,这里进来后使用的是MSP指针,但是返回后 就通过手动改变LR实现了 返回使用PSP,代码如下:
       __asm void vPortSVCHandler( void )
{
    PRESERVE8

    ldr    r3, =pxCurrentTCB    /* Restore the context. */
    ldr r1, [r3]            /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */
    ldr r0, [r1]            /* The first item in pxCurrentTCB is the task top of stack. */
    ldmia r0!, {r4-r11}        /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */
    msr psp, r0                /* Restore the task stack pointer. */
    isb
    mov r0, #0
    msr    basepri, r0
    orr r14, #0xd
    bx r14
}


    以后再进入用户中断或者 pendsv时  CM3硬件会 自动计算 一个 EXEC_RETUR的值来保存之前的运行的状态(进入前使用的是MSP LR=0xFFFF_FFF9  如中断嵌套调用 ,, 进入前使用的PSP LR=0xFFFF_FFFD  如任务被中断打断),这样就由硬件内核实现了  任务和中断的双堆栈的 使用;


    而且我跟踪SVC时发现,手动修改LR返回到任务后,CONTROL的值也同时自动 变为 0x02 了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2016-8-13 10:57:47 | 显示全部楼层

回 尼泊尔3144 的帖子

尼泊尔3144:楼主  ,我用的V4板子的历程,没有你说的这个代码呢?是这个
    pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
    *pxTopOfStack = portINITIAL_XPSR;&n .. (2016-08-12 17:27) 
你看的这个是低版本的FreeRTOS,看高版本的就行,一个意思。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 05:44 , Processed in 0.233681 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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