打印

c30移植uC/OS的问题

[复制链接]
2788|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
人人人|  楼主 | 2007-11-28 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前几天在网上下的uC/OS,想移植在DISPIC30F5011上,遇到了一些问题,请高手们指点一下.
我的任务测试程序
void  testtask(void *pdata)
{
     pdata = pdata;
     定时1初始化;
     开中断;
     while(1)
         OSTimeDly(1);     
}
程序开始时能够进入这个程序,然后进空任务,定时中断到了就进入定时中断服务子程序,在中断服务子程序中调用OSIntExit();然后程序又回到上面的任务中,当执行OSTimeDly(1)中的OSCtxSw中最后返回的指令后,程序就跑飞了,PC=0x152了,哪位高手帮看看是哪的问题,多谢了.
堆栈不应该有问题吧,既然能进入空任务,又能进中断,又能返回,应该不是吧.
沙发
人人人|  楼主 | 2007-11-28 17:13 | 只看该作者

自己顶一下

使用特权

评论回复
板凳
soso| | 2007-11-28 17:28 | 只看该作者

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

  我上当过这样的现象是Tick不足10ms,不一定适合你。建议静心慢慢调试,SIM可以找到问题。

使用特权

评论回复
地板
人人人|  楼主 | 2007-11-28 17:37 | 只看该作者

Tick用的是100ms.

昨天就遇到这个问题了,调了一天了.开始的时候是返回不了,发现是堆栈的原因,修改了后可以返回了,但当又运行OSCtxSw后就不行了

使用特权

评论回复
5
soso| | 2007-11-28 22:38 | 只看该作者

任务切换错误

  应该是堆栈有问题了,你看看你的工程是不是任务的堆栈设定太少而覆盖了?还有注意编译ucosii要关掉优化器。

使用特权

评论回复
6
人人人|  楼主 | 2007-11-29 12:15 | 只看该作者

堆栈问题

应该是堆栈问题,而且应该是中断服务子程序的问题,最开始的是时候是用C写的,可在进入中断后就自动保存了W0~W7,还有SR等,但是跟OSTaskStkInit()保存的不一样,改了改,也没成功,换成汇编也时,想按照OSTaskStkInit()中那样保存,可不知道怎么改,高手帮一下
S_STK *OSTaskStkInit(  void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) {
    INT16U  x;
    INT8U   pc_high;

    
    pc_high =  (INT8U)(((INT32U)task >> 16) & 0x7F);
    
   *ptos++  =  (OS_STK)task;  
   *ptos++  =  (OS_STK)pc_high;  
   *ptos++  =  (OS_STK)task;  

    x       =  0;                       
    if (CORCONbits.IPL3) {    
        x  |= 0x0080;      
    }
   *ptos++  = (OS_STK)(x | (INT16U)pc_high);  

   *ptos++  = pdata;   
   *ptos++  = 0x1111; 
   *ptos++  = 0x2222;
   *ptos++  = 0x3333; 
   *ptos++  = 0x4444; 
   *ptos++  = 0x5555; 
   *ptos++  = 0x6666; 
   *ptos++  = 0x7777; 
   *ptos++  = 0x8888; 
   *ptos++  = 0x9999; 
   *ptos++  = 0xAAAA; 
   *ptos++  = 0xBBBB; 
   *ptos++  = 0xCCCC;  
   *ptos++  = 0xDDDD;  
   *ptos++  = 0xEEEE;  
 
   *ptos++  = TBLPAG;  
   *ptos++  = PSVPAG;   
   *ptos++  = RCOUNT;    
   
   *ptos++  = 0; 
   *ptos++  = CORCON;
        
    return ptos;
}

使用特权

评论回复
7
euvjin| | 2007-11-30 16:36 | 只看该作者

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

使用特权

评论回复
8
人人人|  楼主 | 2007-12-1 15:08 | 只看该作者

下了

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

使用特权

评论回复
9
hotpower| | 2007-12-3 08:51 | 只看该作者

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

谢谢~~~

使用特权

评论回复
10
人人人|  楼主 | 2007-12-3 13:11 | 只看该作者

还没有呢

还没有呢
我建立了两个任务:
void  task1(void *pdata)
{
     while(1)
     {
         t1_count++;
         OSTimeDly(1);
}
void  task2(void *pdata)
{
     while(1)
     {
         t2_count++;
         OSTimeDly(2);
}

运行后就死了,发现t1_count=8,t2_count=4,当我增加延时,即task1改为 OSTimeDly(2),task2该为OSTimeDly(3),结果运行的次数就少了,我想这应该是中断服务子程序的问题吧.也就是说中断运行到一定的次数后就死了.可现在还没找到原因呢.
还发现一个问题,我定时中断的优先级设的为4,而当中断发生后回到空任务的时候,CPU的优先级就边成了4,定时中断就再也不响应了,后来我把定时中断设为5,也出现了这中情况,改为6后,也出现过,改为7就好了.为什么会这样?是我资料没看仔细?高手们帮忙给解释解释,多谢了

使用特权

评论回复
11
人人人|  楼主 | 2007-12-6 11:50 | 只看该作者

问一个粗浅的问题

时间中断为20MS,有4个任务,想每2MS进行一次任务切换,怎么能实现?如果非得20MS一次,那时间是不是太长了,还能叫时实操作系统了吗?
问的比较粗浅,主要是不太懂.

使用特权

评论回复
12
euvjin| | 2007-12-6 12:43 | 只看该作者

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

使用特权

评论回复
13
人人人|  楼主 | 2007-12-6 13:45 | 只看该作者

多谢了

那多谢了
我的邮箱youloveme125521@163.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝