各位兄台,我一直有个疑问,在ARM上运行uC/OS-II的时候,究竟有没有必要为每个任务设置堆栈,比如说,整个操作系统运行在SVC(管理态)和IRQ态,任务主要运行SVC态,那么每次任务切换时,数据被压入的地方应是SVC态下的堆栈(不考虑中断的话),任务被抢占、数据压栈后只需要一定空间存储当前堆栈指针SP即可(即被抢占任务的OSTCBStkPtr中),而不需要再为每个任务分配堆栈。之所以想到这个问题,是因为小弟以前搞51单片机的,在上面跑过uC,那时候是绝对需要每个任务一个堆栈的,该运行哪个任务就把它堆栈中的数据全部拷贝到系统堆栈,再出栈、中断返回指令即可,但我认为在ARM上没有必要这样,只要在初始化的时候把SVC模式下的堆栈设置足够大即可,没有必要设置OS_STK TaskStk[OSNTSKS][60]; 这类的任务堆栈了吧,不知我的看法是否正确,请高手指点一二,谢谢!
共7条
1/1 1 跳转至页
谢谢楼上的兄弟,
我刚才仔细看了一下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模式下的堆栈范围内了呢?? |
共7条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |