完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一言不合就是上代码。。。。。。。。。。。。。。。。。。。。。。。面对这个汇编反正我是一脸懵逼,于是我就一个个的差了汇编指令,但是我还是没能弄懂,具体的操作流程,
首先得疑问就是,我们在创建任务的时候会分配给任务一个堆栈空间,例如 CPU_STK TASK1_TASK[START_TASK_SIZE]; 这就意味着我们在保护现场的时候,会把寄存器的值保存到这个堆栈对吧?但是我在汇编的函数里并没有看到 ,系统把堆栈保存的时候用到 CPU_STK TASK1_TASK[START_TASK_SIZE]; 这个东东啊 希望懂的童鞋,大虾,当然还有原子哥,看到了及时帮我解释一下。您的回答决定了我痛苦地时间长短。。。。。。。。 提前说声谢谢!!!! CPSID I ; Prevent interruption during context switch MRS R0, PSP ; PSP is process stack pointer CBZ R0, PendSVHandler_nosave ; Skip register save the first time ;Is the task using the FPU context? If so, push high vfp registers. TST R14, #0X10 IT EQ VSTMDBEQ R0!,{S16-S31} SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack STM R0, {R4-R11} LDR R1, =OSTCBCurPtr ; OSTCBCurPtr->OSTCBStkPtr = SP; LDR R1, [R1] STR R0, [R1] ; R0 is SP of process being switched out ; At this point, entire context of process has been saved PendSVHandler_nosave PUSH {R14} ; Save LR exc_return value LDR R0, =OSTaskSwHook ; OSTaskSwHook(); BLX R0 POP {R14} LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy; LDR R1, =OSPrioHighRdy LDRB R2, [R1] STRB R2, [R0] LDR R0, =OSTCBCurPtr ; OSTCBCurPtr = OSTCBHighRdyPtr; LDR R1, =OSTCBHighRdyPtr LDR R2, [R1] STR R2, [R0] LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdyPtr->StkPtr; LDM R0, {R4-R11} ; Restore r4-11 from new process stack ADDS R0, R0, #0x20 ;Is the task using the FPU context? If so, push high vfp registers. TST R14, #0x10 IT EQ VLDMIAEQ R0!, {S16-S31} MSR PSP, R0 ; Load PSP with new process SP ORR LR, LR, #0x04 ; Ensure exception return uses process stack CPSIE I BX LR ; Exception return will restore remaining context END |
|
相关推荐
11个回答
|
|
LZ你好,你这个是ucosii吧?ucosii在创建任务的时候是将你所创建的任务所有的堆栈信息包含到你定义的堆栈中的,建议LZ去看下在软件资料里的UCOS学习资料中的 简易OS设计.pdf这个文档,会对你有帮助,里面介绍了任务的堆栈如何存取等,如果需要详细点的资料可以去看邵贝贝的资料,这个是更详细的文档资料,不建议太深究UCOS,能懂得它的内核原理和机制等基本操作就够了,对于初学者来UCOS说会比较好的操作系统学习,是因为资料广,但是UCOS在商用时是需要收费的。
|
|
|
|
没人来 自己顶....
|
|
|
|
来人呐....
|
|
|
|
江南皮革厂倒闭了。。。。。。。。。。。。。。。。。。
|
|
|
|
线程运行时,[C] 纯文本查看 复制代码
CPU_STK TASKn_TASK[START_TASK_SIZE]; 就已经在SP中了,所以切换函数只要把所有寄存器都压入SP即可,并不需要去管哪个任务的栈数组什么的,不管N个任务难道还要一个一个去看? 又cortex-M中断时会自动压一部分寄存器,所以线程切换函数只要压剩余的寄存器即可。 |
|
|
|
恩恩是ucosiii 好,我这就去看看您说的这几个文档,多谢!!
|
|
|
|
ucosii和ucosiii的大部分功能都是一样的,只是ucosiii改进并增加了些操作系统功能,比ucosii任务支持数量多等等。
|
|
|
|
CPU_STK TASKn_TASK[START_TASK_SIZE]; 麻烦能在用更通俗的话解释一下么。。。。我的专业是自动化,学的这单片机和操作系统完全是自学,微机原理还没上过,刚大二,如果可以的话真的是万分感谢,,,,, 后面的自动压栈一部分寄存器我查了资料也是知道的,就这一小块,不知道他们运行的时候怎么连起来的、、、 |
|
|
|
自己搜 TASK1_TASK 被谁引用了,然后顺路摸下去!
|
|
|
|
嗯嗯好
|
|
|
|
建议用JLink仿真调试看下PSP,MSP的值与每个任务栈空间地址的值的关系。
|
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 0 评论
1154 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2713 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1083浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 19:20 , Processed in 1.481307 second(s), Total 99, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号