ucosII 移植到arm 用ads,关于关中断、开中断

sdfiyuejin 2009-09-03 10:38:25
关中断后,修改优先级就绪表,然后开中断
结果就绪表又还原到修改之前的效果。
而且这中情况,出现在低优先级任务创建高优先级任务;高优先级创建低优先级任务时,没有这种错,为什么?
还有,关开中断后,是不是自动将当前任务的TCB、prio 赋给 OSTCBCur,OSPrioCur?
...全文
488 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dthxman 2009-09-10
  • 打赏
  • 举报
回复
你确认你修改值成功了么
sdfiyuejin 2009-09-10
  • 打赏
  • 举报
回复
不好意思。
调试后,发现timetick里面的代码改的有点问题
现在可以运行了
sdfiyuejin 2009-09-10
  • 打赏
  • 举报
回复
不好意思。
调试后,发现timetick里面的代码改的有点问题
现在可以运行了
sdfiyuejin 2009-09-10
  • 打赏
  • 举报
回复
不好意思。
调试后,发现timetick里面的代码改的有点问题
现在可以运行了
sdfiyuejin 2009-09-05
  • 打赏
  • 举报
回复
板子:pc2138 开发环境是:ads
sdfiyuejin 2009-09-05
  • 打赏
  • 举报
回复
INT8U OS_TCBInit (INT8U prio, OS_STACK *ptos, INT16U id, INT32U stack_size, INT8U OSTickLen)
{
OS_TCB *ptcb;

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_STATUSR cpu_statusr = 0;
#endif



OS_ENTER_CRITICAL();
ptcb = OSTCBFreeList; //从空闲TCB链表中取出一个空闲TCB
if (ptcb != (OS_TCB *)0) {
OSTCBFreeList = ptcb->OSTCBNext;
OS_EXIT_CRITICAL();
ptcb->OSTCBStkPtr = ptos; //设置任务堆栈
(INT8U)ptcb->OSTCBPrio = prio; //设置优先级
ptcb->OSTCBStat = OS_STAT_READY; //任务就绪
ptcb->OSTCBStatPend = OS_STAT_PEND_OK; //清除悬挂状态
ptcb->OSTCBDly = 0; //任务没有被延时
ptcb->OSTickLen = OSTickLen;
ptcb->OSTickCurLen = OSTickLen;
ptcb->OSTCBStkSize = stack_size; //堆栈大小
ptcb->OSTCBID = id; //任务id
OSTCBIdTbl[id] = ptcb; //保存tcb到id表中

#if OS_TASK_DEL_ENABLE > 0
ptcb->OSTCBDelReq = OS_NO_ERROR;
#endif

ptcb->OSTCBY = (INT8U)((prio >> 3) & 0xFF); //计算 X, Y, BitX and BitY */
ptcb->OSTCBX = (INT8U) (prio & 0x07);
ptcb->OSTCBBitY = (INT32U)(1 << ptcb->OSTCBY);//Event_Pri_Grp 那一位置1
ptcb->OSTCBBitX = (INT8U)(1 << ptcb->OSTCBX);//Event_Sub_Pri_Grp元素的那一位置1
#if (OS_MUTEX_ENABLE)
ptcb->OSTCBMutexPtr = (OS_MUTEX *)0; /* Task is not pending on an event */
#endif

#if OS_TASK_PROFILE_ENABLE > 0
ptcb->OSTCBCtxSwCtr = 0L; /* Initialize profiling variables */
ptcb->OSTCBCyclesStart = 0L;
ptcb->OSTCBCyclesTot = 0L;
ptcb->OSTCBStkBase = (OS_STACK *)0;
ptcb->OSTCBStkUsed = 0L;
#endif

#if OS_TASK_NAME_SIZE > 1
ptcb->OSTCBTaskName[0] = '?';
ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
#endif

OSTCBInitHook(ptcb);

OSTaskCreateHook(ptcb); //调用用户自定义的初始化函数

OS_ENTER_CRITICAL();

OSTCBPrioNUM[prio]++; /**将同优先级的任务数加1 */


ptcb->OSTCBNext = OSTCBList;
ptcb->OSTCBPrev = (OS_TCB *)0;
if (OSTCBList != (OS_TCB *)0) {
OSTCBList->OSTCBPrev = ptcb;
}
OSTCBList = ptcb;

if (OSTCBPrioTbl[prio] == (OS_TCB *)0){/**如果优先级表中为空,直接放到优先级表中并将同级链置空*/
OSTCBPrioTbl[prio] = ptcb;

ptcb->OSTCBSmPrioNext=(OS_TCB *)0; /**将同级的任务后项指针设为空*/
ptcb->OSTCBSmPrioPrev=(OS_TCB *)0; /**将同级的任务前项指针设为空*/

TCB_Pri_Grp |= ptcb->OSTCBBitY; //使任务就绪
TCB_Sub_Pri_Grp[ptcb->OSTCBY] |= ptcb->OSTCBBitX;

}else{ /**优先级表非空,将任务插入到同优先级循环列表的末尾*/
ptcb->OSTCBSmPrioNext=OSTCBPrioTbl[prio]; /**新的任务后项指向头指针*/
ptcb->OSTCBSmPrioPrev=OSTCBPrioTbl[prio]->OSTCBSmPrioPrev; /**新任务的前向指针... */
/**...指向头指针的前项 */
if(ptcb->OSTCBSmPrioPrev!=(OS_TCB *)0){
OSTCBPrioTbl[prio]->OSTCBSmPrioPrev->OSTCBSmPrioNext=ptcb;/**如果头指针的前项不为空,将头指针的前项的后项指向当前任务*/
}else{
ptcb->OSTCBSmPrioPrev=OSTCBPrioTbl[prio];
OSTCBPrioTbl[prio]->OSTCBSmPrioNext = ptcb;
}
OSTCBPrioTbl[prio]->OSTCBSmPrioPrev=ptcb;/**头指针的前项指向当前任务*/

}
OSTaskCtr++; //增加任务计数器
OS_EXIT_CRITICAL();
return (OS_NO_ERROR);
}
OS_EXIT_CRITICAL();
return (OS_TASK_NO_MORE_TCB);
}

TCB_Pri_Grp
TCB_Sub_Pri_Grp
里面的内容会还原,很是不理解啊
morris88 2009-09-04
  • 打赏
  • 举报
回复
莫非你修改的是中断栈中的临时变量或者是寄存器?
在什么cpu上?
代码呢?
sdfiyuejin 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 csan 的回复:]
低优先级的任务创建了高优先级任务后,会发生任务切换,即被抢占,此时低优先级的任务会被pending,你修改优先级就绪表也许尚未完成;高优先级创建低优先级时,低优先级任务虽然创建但是需要高优先级任务结束后才能发生任务切换,此时优先级表修改完成。
[/Quote]
问题是,我调试的时候:关中断,修改 (此时数据已经被改变了),开中断,修改的数据又回到修改之前值了

[Quote=引用 2 楼 csan 的回复:]

关中断的时候什么都不会变,开中断后很多任务会被打断,尤其是动态更改优先级这种情况很复杂很耗费资源,也有可能会失败。
你为什么这样做?要解决优先级反转吗?
[/Quote]
做delay时,需要从就绪表中删除任务
  • 打赏
  • 举报
回复
帮up
ShowMan 2009-09-04
  • 打赏
  • 举报
回复
http://www.wpanclub.com/?uid-4070-action-viewspace-itemid-2035
csan 2009-09-04
  • 打赏
  • 举报
回复
低优先级的任务创建了高优先级任务后,会发生任务切换,即被抢占,此时低优先级的任务会被pending,你修改优先级就绪表也许尚未完成;高优先级创建低优先级时,低优先级任务虽然创建但是需要高优先级任务结束后才能发生任务切换,此时优先级表修改完成。

关中断的时候什么都不会变,开中断后很多任务会被打断,尤其是动态更改优先级这种情况很复杂很耗费资源,也有可能会失败。

你为什么这样做?要解决优先级反转吗?
yhf365 2009-09-04
  • 打赏
  • 举报
回复
没玩过uCOS,
帮顶了

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧