社区
Linux_Kernel
帖子详情
ucosII 移植到arm 用ads,关于关中断、开中断
sdfiyuejin
2009-09-03 10:38:25
关中断后,修改优先级就绪表,然后开中断
结果就绪表又还原到修改之前的效果。
而且这中情况,出现在低优先级任务创建高优先级任务;高优先级创建低优先级任务时,没有这种错,为什么?
还有,关开中断后,是不是自动将当前任务的TCB、prio 赋给 OSTCBCur,OSPrioCur?
...全文
488
12
打赏
收藏
ucosII 移植到arm 用ads,关于关中断、开中断
关中断后,修改优先级就绪表,然后开中断 结果就绪表又还原到修改之前的效果。 而且这中情况,出现在低优先级任务创建高优先级任务;高优先级创建低优先级任务时,没有这种错,为什么? 还有,关开中断后,是不是自动将当前任务的TCB、prio 赋给 OSTCBCur,OSPrioCur?
复制链接
扫一扫
分享
转发到动态
举报
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时,需要从就绪表中删除任务
猫已经找不回了
2009-09-04
打赏
举报
回复
帮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,
帮顶了
基于
Ads
环境的
uc
osI
I
移植
模版
基于
Ads
环境的
uc
osI
I
移植
模版,附加实验手册
uC
OS-II在
ARM
微处理器上的
移植
及编译
1.了解
uC
OS-II内核的主要结构。 2.掌握将
uC
OS-II内核
移植
到
ARM
920T处理器上的基本方法。 3. 将
uC
OS-II内核
移植
到
ARM
920T微处理器上。 4.编写两个简单任务,在超级终端上观察两个任务的切换。
uc
osi
i
移植
到 skyeye 虚拟LPC2210
写的比较详细的
uc
osi
i
移植
到skyeye 虚拟LPC2210的文档,对于熟悉
ADS
的可能更加有帮助。
UC
OSI
I
移植
源代码(很完整)
UC
OSI
I
移植
源代码(很完整)用
ADS
工程建立的,针对S3C2410
LPC2100系列的
uc
osI
I
移植
在
ADS
1.2上实现的
uc
osI
I,在lpc2119
开
发板亲试成功
Linux_Kernel
4,465
社区成员
17,462
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章