你的位置:首页 > 软件开发 > 操作系统 > RTOS Thread stack and MSP/PSP registers in Cortex

RTOS Thread stack and MSP/PSP registers in Cortex

发布时间:2016-08-25 14:00:05
Background使用Keil RTX RTOS的项目开发过程中,在加入一些新的代码之后,发现在线程们被创建并被启动之后,程序就跑飞了。借助Keil的RTOS debug窗口,发现有其中2个线程有stack overflow的现象。于是开始思考RTOS thread stack ...

RTOS Thread stack and MSP/PSP registers in Cortex

Background

使用Keil RTX RTOS的项目开发过程中,在加入一些新的代码之后,发现在线程们被创建并被启动之后,程序就跑飞了。

借助Keil的RTOS debug窗口,发现有其中2个线程有stack overflow的现象。

于是开始思考RTOS thread stack size的设置问题。

以前一直就对有了RTOS之后,线程栈和内核栈是个什么情况。Cortex-M3的MSP和PSP该如何使用,这些都不是很清楚。

正好借此机会,好好研究一番。

 

本文基于以下开发环境:

Cortex-M3,Keil MDK 5。

C memory Modle

先上一张图,看看一般意义上的无OS情况下,ARM C语言执行环境下,RAM的布局。明显这张图是基于“向下增长”的栈结构来设计的。

RTOS Thread stack and MSP/PSP registers in Cortex

从上图可以看到:

RW空间,位于RAM的最低地址区域。用来存放,已经被初始化了的,可读写的,全局变量的值;(提个问题,到底什么叫全局变量,什么叫全局变量的内容?)

ZI空间,位于RW的上方。用来存放,未被初始化的,可读写的全局变量的值;

Heap空间,位于ZI的上方。c函数malloc和calloc等内存分配函数,会从这块区域里面取一块内存区域,给函数的调用者;

Stack空间,位于RAM的最上方。C函数的自动变量(也叫局部变量),以及函数返回地址,会被保存在这里。

Stack空间从高位向低位增长,Heap从低位向高位增长。所以如果控制不好,会出现Heap和Stack overlap的情况。

可以参考:http://stackoverflow.com/questions/39113658/when-does-malloc-return-null-in-a-bare-metal-environment

那么这个c memory model是怎么形成的呢?

当我们写好了一个c程序,开始build这个程序。

这个程序会被预处理、编译、链接,形成一份image。编译器会分辨出:代码指令,常量,已初始化的可读写全局变量,未初始化的可读写全局变量,自动变量,内存分配函数。

链接脚本(link script)会告诉链接器,在链接的时候这些东西在flash里面放哪里,在RAM里面放哪里。

那么我们关心的栈,是在哪里设置栈顶是在RAM的最高位,而heap在ZI的上面呢?

CPU里面有个SP寄存器,又叫栈指针寄存器,指向程序运行时栈的实时位置。

往栈里面PUSH东西啦,SP寄存器的数值就减小;从栈里面POP东西啦,SP寄存器的数值就增加。

在CPU刚开始复位,开始从复位中断向量执行第一条指令的时候,都是汇编,但我们也得先把CPU初始化、栈指针初始化啊,这样后面的c程序才能开始跑。

一般在这里,我们都是通过汇编指令设置SP寄存器为RAM的最高地址,也就是指定了栈顶在哪里。

而Heap底部,则是链接器自动根据RW/ZI空间大小计算出来的,等于ZI空间的顶部。

 

Keil MDK下Cortex-M3的C Memory Model, without RTOS

那么在Keil MDK下,Cortex-M3的C memory model又是个什么样子呢。

为了说明,先上图。

在不跑RTOS的情况下,这个时候,整个C程序都只会用到main stack,为什么?请去翻翻cortex-m3 技术手册。

当然高级一点,可以自己去设置process stack,然后让用户程序在process stack里面跑,让中断函数再main stack里面跑。

先看没有RTOS,并且代码里面调用了malloc或者calloc这类内存分配函数的情况:

   +--------+  Last Address of RAM    | not  |

原标题:RTOS Thread stack and MSP/PSP registers in Cortex

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录