完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
OSCtxSw OSIntCtxSw汇编代码相同,怎么体现出区别的?
osctxsw()需要保存出口状态。 osintctxsw()不需要。 但是汇编代码都一样,为什么? OSCtxSw PUSH {R4, R5} LDR R4, =NVIC_INT_CTRL ;´¥·¢endSVÒì³£ (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, [R4] POP {R4, R5} BX LR OSIntCtxSw PUSH {R4, R5} LDR R4, =NVIC_INT_CTRL ;´¥·¢endSVÒì³£ (causes context switch) LDR R5, =NVIC_PENDSVSET STR R5, [R4] POP {R4, R5} BX LR NOP |
|
相关推荐
6个回答
|
|
|
|
|
|
你好,OSCtxSw OSIntCtxSw这两个函数都在临界区里,这两个函数需要触发pendsv中断处理函数。临界区不是不能产生中断了吗?
|
|
|
|
|
|
|
|
|
|
|
|
就是说调度器函数 中的任务切换函数OS_TASK_SW(); 在临界区中,PendSV中断不响应,当退出临界区时Pendsv才进行任务切换工作,这样理解对吗?
void OS_Sched (void) { #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u; #endif OS_ENTER_CRITICAL(); if (OSIntNesting == 0u) { /* Schedule only if all ISRs done and ... */ if (OSLockNesting == 0u) { /* ... scheduler is not locked */ OS_SchedNew(); OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */ #if OS_TASK_PROFILE_EN > 0u OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */ #endif OSCtxSwCtr++; /* Increment context switch counter */ OS_TASK_SW(); /* Perform a context switch */ } } } OS_EXIT_CRITICAL(); } |
|
|
|
没看懂为什么这俩相同?
|
|
|
|
只有小组成员才能发言,加入小组>>
366 浏览 0 评论
966 浏览 1 评论
2353 浏览 5 评论
2671 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2488 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
522浏览 9评论
533浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
637浏览 6评论
506浏览 5评论
547浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-12 04:01 , Processed in 1.013706 second(s), Total 60, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191