这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于ARM上运行uC/OS-II时的堆栈设置问题

共7条 1/1 1 跳转至

关于ARM上运行uC/OS-II时的堆栈设置问题

菜鸟
2007-08-29 17:19:22     打赏
各位兄台,我一直有个疑问,在ARM上运行uC/OS-II的时候,究竟有没有必要为每个任务设置堆栈,比如说,整个操作系统运行在SVC(管理态)和IRQ态,任务主要运行SVC态,那么每次任务切换时,数据被压入的地方应是SVC态下的堆栈(不考虑中断的话),任务被抢占、数据压栈后只需要一定空间存储当前堆栈指针SP即可(即被抢占任务的OSTCBStkPtr中),而不需要再为每个任务分配堆栈。之所以想到这个问题,是因为小弟以前搞51单片机的,在上面跑过uC,那时候是绝对需要每个任务一个堆栈的,该运行哪个任务就把它堆栈中的数据全部拷贝到系统堆栈,再出栈、中断返回指令即可,但我认为在ARM上没有必要这样,只要在初始化的时候把SVC模式下的堆栈设置足够大即可,没有必要设置OS_STK        TaskStk[OSNTSKS][60];   这类的任务堆栈了吧,不知我的看法是否正确,请高手指点一二,谢谢!



关键词: 关于     运行     OS-II     堆栈     设置     问题    

菜鸟
2007-08-31 09:13:34     打赏
2楼
我的意思是如果为每个任务分配了堆栈,那么堆栈是在哪个区,我认为在ARM上应用uC/OS-II没有必要为每个任务定义堆栈,打个比方,如果任务是运行在SVC模式下的,那么一个任务被抢占后,要保存该任务的“环境”,这些环境就是各个寄存器的当前值,将这些值压栈后,保存当前的SP到该任务的任务控制块中的OSTCBStkPtr,下次要运行该任务时,找到这个SP的值,出栈后即可恢复该任务,那么为每个任务分配的堆栈在什么时候使用了?

菜鸟
2007-08-31 09:51:09     打赏
3楼
uC/OS-II 为每一个任务定义其自己的堆栈,并存放到任务的OS_TCB结构的第一个指针,主要是为了方便任务之间的切换,作为实时操作系统,任务切换都用汇编来完成,这样的效率是不言而喻的。
任务切换只需要将要切换到的任务的OS_TCB,由于首指针就是存放该任务相关的寄存器,直接将首指针赋给SP,那么用SP来恢复相关的寄存器

菜鸟
2007-09-03 09:30:03     打赏
4楼
谢谢楼上的兄弟,
我刚才仔细看了一下uC/OS-II创建任务OSTaskCreate的代码,请高手看看我的理解对不对:在main()函数里进行各个任务堆栈设置后,每个任务的堆栈栈顶位置被保存到该任务控制块的OSTCBStkPtr中,在该任务第一次运行时,用OSTCBStkPtr保存的值设置当前SP值,如果任务都是在ARM的SVC模式下运行的,这样即可保证每个任务的SP和其它任务的SP不会冲突,那么在任务级切换的时候各个任务的寄存器值均被压入SVC模式的堆栈中,并且不会相互覆盖(如果为每个任务分配的堆栈够大的话),在中断级切换中,新的ISR打断的不是任务就是优先级低的ISR,考虑任务被打断的情况,SVC模式写运行的任务被IRQ中断后,系统进入IRQ模式,在找到被打断任务的CPSR和PC后,即可从IRQ模式返回到SVC模式,由于在运行该任务前,已经设置了该任务的SP指针,那么此时压栈操作就是将寄存器的值压到SVC模式堆栈中为该任务分配的那段堆栈中了。
现在我还有两个问题,一。:既然在上下文切换时每个任务需被保存的“环境”都一样大(即需要保存的寄存器数目一样多),那么有没有必要为每个任务设置不同长度的堆栈呢?二:在任务调度器运行某个任务之前用该任务堆栈的栈顶指针设置SP值,会不会这个被设置后的SP值已经不属于SVC模式下的堆栈范围内了呢??

菜鸟
2007-09-04 15:42:01     打赏
5楼

你的第一个问题,任务在运行期间可能会产生调用函数等的内存开销,这就需要一定大小的堆栈空间
你的第二个问题,任务在运行期间都是在其自己的堆栈空间中,其实这段空间就是一段内存地址,和具体的哪个模式没有关系,不知道我的理解是不是正确,呵呵,欢迎指出不足。


菜鸟
2007-09-06 17:05:25     打赏
6楼
谢谢5楼的兄台,我以前学习51的时候,知道51单片机在发生函数调用时会自动将被调用函数的返回地址压入堆栈,那ARM也是一样喽?
关于第二个问题:如果任务的堆栈和模式无关,那在ARM初始化的时候为SVC模式设置的堆栈有什么用处(假设任务是运行在SVC模式下)?据我观察,uC/OS-II在ARM上移植的各个版本有个共同点,就是若任务运行在某个模式下,那么该模式的堆栈一般都会设置的比较大,所以我任务为每个任务分配堆栈应该和任务所在的模式还是有关系的吧,请赐教

菜鸟
2007-09-12 10:44:39     打赏
7楼

应该是函数调用的压栈操作是每个CPU都要做的事情,ARM或者51。

ARM初始化时,会把每个模式下的堆栈都初始化一下,就是跟据你设置的大小从堆栈的TOP地址开始分配一段地址空间(我用的uc/OS是这样做的),那么如果你的任务设置的堆栈太大,有可能就会使用到别的模式下的堆栈空间了,我觉得,那样的话,任务的堆栈大小的总和不应该大于任务运行的ARM模式下总的堆栈空间


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]