c30移植uC/OS的问题

[复制链接]
3952|12
 楼主| 人人人 发表于 2007-11-28 16:30 | 显示全部楼层 |阅读模式
前几天在网上下的uC/OS,想移植在DISPIC30F5011上,遇到了一些问题,请高手们指点一下.<br />我的任务测试程序<br />void&nbsp;&nbsp;testtask(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定时1初始化;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开中断;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />程序开始时能够进入这个程序,然后进空任务,定时中断到了就进入定时中断服务子程序,在中断服务子程序中调用OSIntExit();然后程序又回到上面的任务中,当执行OSTimeDly(1)中的OSCtxSw中最后返回的指令后,程序就跑飞了,PC=0x152了,哪位高手帮看看是哪的问题,多谢了.<br />堆栈不应该有问题吧,既然能进入空任务,又能进中断,又能返回,应该不是吧.
 楼主| 人人人 发表于 2007-11-28 17:13 | 显示全部楼层

自己顶一下

  
soso 发表于 2007-11-28 17:28 | 显示全部楼层

你提供的信息不足以帮助你

&nbsp;&nbsp;我上当过这样的现象是Tick不足10ms,不一定适合你。建议静心慢慢调试,SIM可以找到问题。
 楼主| 人人人 发表于 2007-11-28 17:37 | 显示全部楼层

Tick用的是100ms.

昨天就遇到这个问题了,调了一天了.开始的时候是返回不了,发现是堆栈的原因,修改了后可以返回了,但当又运行OSCtxSw后就不行了
soso 发表于 2007-11-28 22:38 | 显示全部楼层

任务切换错误

&nbsp;&nbsp;应该是堆栈有问题了,你看看你的工程是不是任务的堆栈设定太少而覆盖了?还有注意编译ucosii要关掉优化器。
 楼主| 人人人 发表于 2007-11-29 12:15 | 显示全部楼层

堆栈问题

应该是堆栈问题,而且应该是中断服务子程序的问题,最开始的是时候是用C写的,可在进入中断后就自动保存了W0~W7,还有SR等,但是跟OSTaskStkInit()保存的不一样,改了改,也没成功,换成汇编也时,想按照OSTaskStkInit()中那样保存,可不知道怎么改,高手帮一下<br />S_STK&nbsp;*OSTaskStkInit(&nbsp;&nbsp;void&nbsp;(*task)(void&nbsp;*pd),&nbsp;void&nbsp;*pdata,&nbsp;OS_STK&nbsp;*ptos,&nbsp;INT16U&nbsp;opt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT16U&nbsp;&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;&nbsp;&nbsp;pc_high;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pc_high&nbsp;=&nbsp;&nbsp;(INT8U)(((INT32U)task&nbsp;&gt&gt&nbsp;16)&nbsp;&&nbsp;0x7F);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;&nbsp;(OS_STK)task;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;&nbsp;(OS_STK)pc_high;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;&nbsp;(OS_STK)task;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(CORCONbits.IPL3)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&nbsp;|=&nbsp;0x0080;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;(OS_STK)(x&nbsp;|&nbsp;(INT16U)pc_high);&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;pdata;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x1111;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x2222;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x3333;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x4444;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x5555;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x6666;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x7777;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x8888;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0x9999;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0xAAAA;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0xBBBB;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0xCCCC;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0xDDDD;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0xEEEE;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;TBLPAG;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;PSVPAG;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;RCOUNT;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;0;&nbsp;<br />&nbsp;&nbsp;&nbsp;*ptos++&nbsp;&nbsp;=&nbsp;CORCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ptos;<br />}
euvjin 发表于 2007-11-30 16:36 | 显示全部楼层

有源码下载的,ls你可以去搜一下做参考

  
 楼主| 人人人 发表于 2007-12-1 15:08 | 显示全部楼层

下了

我就是在网上下的,是PIC24的.<br />我建立了三个任务,TASKSTART(),TASK1(),TASK2(),在TASKTART()中创建的另两个,优先级分别为2、3,又在TASKSTART()中初始化定时中断。运行后程序能进入任务1中,调用OSTimeDly(3)后进入任务2,然后运行空任务,等中断,在中断级任务切换后又回到了任务2,而当调用OSTimeDly(3)运行OSCtxSw后返回的时候就死了。我认为也是堆栈的原因,但还没找到具体的。<br />任务级切换和中断级切换都是在网上找的,只有中断服务子程序是自己写的,但很简单,应该没问题啊。
hotpower 发表于 2007-12-3 08:51 | 显示全部楼层

楼主移植好了没,俺想偷懒~~~

谢谢~~~
 楼主| 人人人 发表于 2007-12-3 13:11 | 显示全部楼层

还没有呢

还没有呢<br />我建立了两个任务:<br />void&nbsp;&nbsp;task1(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1_count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(1);<br />}<br />void&nbsp;&nbsp;task2(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2_count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(2);<br />}<br /><br />运行后就死了,发现t1_count=8,t2_count=4,当我增加延时,即task1改为&nbsp;OSTimeDly(2),task2该为OSTimeDly(3),结果运行的次数就少了,我想这应该是中断服务子程序的问题吧.也就是说中断运行到一定的次数后就死了.可现在还没找到原因呢.<br />还发现一个问题,我定时中断的优先级设的为4,而当中断发生后回到空任务的时候,CPU的优先级就边成了4,定时中断就再也不响应了,后来我把定时中断设为5,也出现了这中情况,改为6后,也出现过,改为7就好了.为什么会这样?是我资料没看仔细?高手们帮忙给解释解释,多谢了<br />
 楼主| 人人人 发表于 2007-12-6 11:50 | 显示全部楼层

问一个粗浅的问题

时间中断为20MS,有4个任务,想每2MS进行一次任务切换,怎么能实现?如果非得20MS一次,那时间是不是太长了,还能叫时实操作系统了吗?<br />问的比较粗浅,主要是不太懂.
euvjin 发表于 2007-12-6 12:43 | 显示全部楼层

有30f移植好的啊,你要的话我发给你啊

  
 楼主| 人人人 发表于 2007-12-6 13:45 | 显示全部楼层

多谢了

那多谢了<br />我的邮箱youloveme125521@163.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部